Textured glDrawElement
Textured glDrawElement
本文关键字:glDrawElement Textured 更新时间:2023-10-16
我在制作 3D 模型纹理时遇到了问题,我只是潜入 3D 模型,因为我一直在使用基本基元进行测试,并且一直在研究更多特定于引擎的代码。但是,我在使用 glDrawElements 函数时遇到了问题,我知道我的纹理已正确加载,因为我能够将其绘制为四边形(请注意注释中的 glBegin(。但是,当使用glDrawElements时,我没有得到绘制的纹理。它确实显示了部分纹理的颜色(黄色(,当我删除纹理代码时,它将 3D 模型返回到已设置的最后一个颜色,因此它正在执行某些操作。我在想也许这与我的glVertexAttributePointer 有关,我明白这些函数的作用。
glMatrixMode(GL_MODELVIEW);
glMultMatrixf(m_Props.WorldMatrix.data);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)20);
glBindBuffer(GL_ARRAY_BUFFER, pExtra->GetVB());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pExtra->GetIB());
glScalef(0.05, 0.05, 0.05);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pTexExtra->GetTexture());
glDrawElements(GL_TRIANGLES, pExtra->GetIndexCount(), GL_UNSIGNED_INT, 0);
/*glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0, 1); glVertex3f(10.0f, 0.0f, 0.0f);
glTexCoord2f(1, 1); glVertex3f(10.0f, 10.0f, 0.0f);
glTexCoord2f(1, 0); glVertex3f(0.0f, 10.0f, 0.0f);
glEnd();*/
glDisable(GL_TEXTURE_2D);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
我的 VertexPTN 类只是位置、纹理坐标和法线的容器。所以我假设我的向量在类中的位置;Vector3f, Vector2f, Vector3f, 我会将 glVertexAttributePointer 的最后一个参数设置为 0, 12, 20。
对我错过的任何东西有什么误解吗?我真的不是openGL的专业人士,但我确实了解相当多的设置和基本渲染。是什么原因导致我的纹理无法渲染到我的网格,即未设置的 GL 状态?
一些想法:
你正在使用着色器吗? glVertexAttribPointer 仅适用于着色器
- 如果是: 您确定输入为 0、1 和 2 吗?如果在着色器与 glBindAttribLocation 链接之前未设置这些值,则不能保证它们是任何特定值。
- 如果否:您应该使用 glVertexPointer、glTexCoordPointer 等,而不是AttribPointer
此外,如果您使用的是着色器,则启用/禁用GL_TEXTURE_2D是多余的,它不会执行任何操作。