Когда вы занимаетесь низкоуровневым программированием, вам иногда придется делать то, что в основных рекомендациях 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
нет. семейство функций, так что вы все равно получите это предупреждение.