C++ OpenGL很顽固,不允许纹理映射
我正在开发一个游戏引擎,它在MD3模型文件上使用BMP纹理文件。不幸的是,它根本不起作用。我什么都试过了,没用。由于我自己编写了加载程序,我查看了它们,并修复了其中的一些错误,但我还是得到了一个灰色的模型 以下是我的渲染代码:C++ OpenGL很顽固,不允许纹理映射,c++,opengl,C++,Opengl,我正在开发一个游戏引擎,它在MD3模型文件上使用BMP纹理文件。不幸的是,它根本不起作用。我什么都试过了,没用。由于我自己编写了加载程序,我查看了它们,并修复了其中的一些错误,但我还是得到了一个灰色的模型 以下是我的渲染代码: void drawmd3(md3& model, GLuint tex) { int i = 0; glLoadIdentity(); glTranslatef(-1.5,0,-24); glRotatef(270,0,0,1);
void drawmd3(md3& model, GLuint tex)
{
int i = 0;
glLoadIdentity();
glTranslatef(-1.5,0,-24);
glRotatef(270,0,0,1);
glRotatef(-90,0,1,0);
glRotatef(a,0,0,1);
while(i<model.surfnum)
{
glBindTexture(GL_TEXTURE_2D, tex);
int j = 0;
while(j<model.surfs.at(i).trinum)
{
int tmp = model.surfs.at(i).tris.at(j).indexes[0];
int tmp1 = model.surfs.at(i).tris.at(j).indexes[1];
int tmp2 = model.surfs.at(i).tris.at(j).indexes[2];
float norms[3];
norms[0] = convert_normals0(model.surfs.at(i).verts.at(tmp).normal);
norms[1] = convert_normals1(model.surfs.at(i).verts.at(tmp).normal);
norms[2] = convert_normals2(model.surfs.at(i).verts.at(tmp).normal);
float norms1[3];
norms1[0] = convert_normals0(model.surfs.at(i).verts.at(tmp1).normal);
norms1[1] = convert_normals1(model.surfs.at(i).verts.at(tmp1).normal);
norms1[2] = convert_normals2(model.surfs.at(i).verts.at(tmp1).normal);
float norms2[3];
norms2[0] = convert_normals0(model.surfs.at(i).verts.at(tmp2).normal);
norms2[1] = convert_normals1(model.surfs.at(i).verts.at(tmp2).normal);
norms2[2] = convert_normals2(model.surfs.at(i).verts.at(tmp2).normal);
glBegin(GL_TRIANGLES);
glNormal3f(norms[0],norms[1],norms[2]);
glTexCoord2f(model.surfs.at(i).st.at(tmp).st[0],1-model.surfs.at(i).st.at(tmp).st[1]);
glVertex3f(model.surfs.at(i).verts.at(tmp).coord[0]/64, model.surfs.at(i).verts.at(tmp).coord[1]/64, model.surfs.at(i).verts.at(tmp).coord[2]/64);
glNormal3f(norms1[0],norms1[1],norms1[2]);
glTexCoord2f(model.surfs.at(i).st.at(tmp1).st[0],1-model.surfs.at(i).st.at(tmp1).st[1]);
glVertex3f(model.surfs.at(i).verts.at(tmp1).coord[0]/64, model.surfs.at(i).verts.at(tmp1).coord[1]/64, model.surfs.at(i).verts.at(tmp1).coord[2]/64);
glNormal3f(norms2[0],norms2[1],norms2[2]);
glTexCoord2f(model.surfs.at(i).st.at(tmp2).st[0],1-model.surfs.at(i).st.at(tmp2).st[1]);
glVertex3f(model.surfs.at(i).verts.at(tmp2).coord[0]/64, model.surfs.at(i).verts.at(tmp2).coord[1]/64, model.surfs.at(i).verts.at(tmp2).coord[2]/64);
glEnd();
j++;
}
glBindTexture(GL_TEXTURE_2D, 0);
i++;
}
}
这就是你的问题所在:
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA8,
img.img.imgwidth,
img.img.imgheight,
0,
GL_RGBA8, <<<<<<<<<<----------
GL_UNSIGNED_BYTE,
img.data);
glTexImage2D(GL_纹理_2D,
0,
德国劳埃德大学,
img.img.imgwidth,
img.img.imgheight,
0,
GL_RGBA8,如果你在绑定之前再做一次glEnable,会有什么不同吗?+1只是为了标题-当然软件不会很顽固,但是当OpenGL不能做你想做的事情时,它总是有一百万种可能!我喜欢glBegin()
每个三角形。这完全不会成为性能瓶颈。顺便说一句,如果你真的需要使用glBegin/glEnd
,那么一定不要在这种性能关键的代码中使用std::vector::at
,因为范围检查根本不值得。但也许你正在使用的是其他类。当然,genpfault是正确的关于愚蠢的每三角形glBegin/glEnd
,但考虑到那些convert
函数和glBegin/glEnd
,我想这不是这里唯一的性能问题。如果你绑定一个小的纯色纹理,你看到那个颜色了吗?仍然不起作用。我用GL\u RGBA作为那个参数。编辑:好,有点现在可以工作了,但是图像在屏幕上闪烁了一秒钟,然后消失了,所以我真的说不出来。它工作不正常,结果是对于某些纹理,它有作用,但对其他纹理没有作用。我现在让所有的东西都是RGB。@DariusLoad:它只对某些纹理有效?那些纹理是2倍大小的吗,例如128x64或512x512?你能告诉我们,你有哪个OpenGL版本吗?glGetString(GL_版本);
。它们是2的幂(测试的纹理是512*512),我有一台非常旧的计算机,所以我有一台非常旧的OpenGL:2.1.2OK,它终于工作了,但纹理有点搞砸了。
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA8,
img.img.imgwidth,
img.img.imgheight,
0,
GL_RGBA8, <<<<<<<<<<----------
GL_UNSIGNED_BYTE,
img.data);