Как преобразовать целое число в void *, не нарушая основные принципы C ++? - PullRequest
3 голосов
/ 03 ноября 2019

Это работает, но также приводит к предупреждению «Не использовать reinterpret_cast (type.1)»:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  reinterpret_cast<void*>(sizeof(GLfloat) * 3));

Это не компилируется:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  static_cast<void*>(sizeof(GLfloat) * 3));

Это не 't compile:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  dynamic_cast<void*>(sizeof(GLfloat) * 3));

Это, очевидно, работает, но кажется, что в C ++ это не так («Не используйте приведение в стиле C (type.4)»)

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  (void*)(sizeof(GLfloat) * 3));

Должен ли я просто игнорировать предупреждение о reinterpret_cast?

1 Ответ

3 голосов
/ 03 ноября 2019

Когда вы занимаетесь низкоуровневым программированием, вам иногда придется делать то, что в основных рекомендациях C ++ не следует делать. Так что просто сделайте это и либо следуйте «предупреждению», либо отключите это конкретное руководство (возможно, для каждого файла).

Как уже было сказано, необходимость в этом конкретном кусочке низкоуровневой фудгерингисключительно из-за глупости OpenGL в его API спецификации вершин. Это значение должно быть каким-либо целочисленным байтовым смещением, а не смещением указателя, которое другая сторона возвращает к смещению.

Так что было бы лучше простополностью избежать плохого API. Используйте отдельную спецификацию формата атрибута вместо старого стиля glVertexAttribPointer. Это превосходно почти во всех отношениях. Он превратит ваш код из:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  reinterpret_cast<void*>(sizeof(GLfloat) * 3));

в

glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3); //Offset specified as integer.
glVertexAttribBinding(1, 0); //You seem to be using multiple attributes with a stride, so they should use the same buffer binding.

//Some later point when you're ready to provide a buffer.

glBindVertexBuffer(0, buffer_obj, 0, sizeof(GLfloat) * 8); //Stride goes into the buffer binding.

Видите, кастинга нет вообще.

К сожалению, альтернатив для glDrawElements нет. семейство функций, так что вы все равно получите это предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...