C++ 带C+的OpenGl+;-质地
我正在尝试将OpenGl中的一些纹理映射到立方体的面。但是,当我运行程序时,我的纹理不会出现。我有一段代码:C++ 带C+的OpenGl+;-质地,c++,opengl,opengl-es,textures,texture-mapping,C++,Opengl,Opengl Es,Textures,Texture Mapping,我正在尝试将OpenGl中的一些纹理映射到立方体的面。但是,当我运行程序时,我的纹理不会出现。我有一段代码: glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[1]); glPushMatrix(); glBegin(GL_QUADS); // Begin drawing the color
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture[1]);
glPushMatrix();
glBegin(GL_QUADS); // Begin drawing the color cube with 6 quads
// Top face (y = 1.0f)
// Define vertices in counter-clockwise (CCW) order with normal pointing out
//glColor3f(0.0f, 1.0f, 0.0f); // Green
glVertex3f( 1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glVertex3f( 1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
// Bottom face (y = -1.0f)
//glColor3f(1.0f, 0.5f, 0.0f); // Orange
glVertex3f( 1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
glVertex3f( 1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
// Front face (z = 1.0f)
//glColor3f(1.0f, 0.0f, 0.0f); // Red
glTexCoord2f(0.0f,0.0f); glVertex3f( 1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glTexCoord2f(10.0f,0.0f); glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glTexCoord2f(10.0f,10.0f); glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
glTexCoord2f(0.0f,10.0f); glVertex3f( 1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
// Back face (z = -1.0f)
//glColor3f(1.0f, 1.0f, 0.0f); // Yellow
glVertex3f( 1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
glVertex3f( 1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
// Left face (x = -1.0f)
//glColor3f(0.0f, 0.0f, 1.0f); // Blue
glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
// Right face (x = 1.0f)
//glColor3f(1.0f, 0.0f, 1.0f); // Magenta
glVertex3f(1.0f+i*2, -2.0f+y*2, -1.0f+j*2);
glVertex3f(1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glVertex3f(1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
glVertex3f(1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
glEnd(); // End of drawing color-cube
glPopMatrix();
glDisable(GL_TEXTURE_2D);
我的Init函数如下所示:
void initGL() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
glShadeModel(GL_SMOOTH); // Enable smooth shading
cria_texturas();
glEnable(GL_TEXTURE_2D);
//glClearDepth(1.0f); // Set background depth to farthest
glEnable(GL_DEPTH_TEST); // Enable depth testing for z-culling
//glDepthFunc(GL_LEQUAL); // Set the type of depth-test
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Nice perspective corrections
}
要加载纹理,我编写了以下代码,使用加载图像的预制类:
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
imag.LoadBmpFile("chao.bmp");
glTexImage2D(GL_TEXTURE_2D, 0, 3,
imag.GetNumCols(),
imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE,
imag.ImageData());
所以我不明白为什么纹理没有出现在立方体的正面。您能帮助我吗?使用立即模式(glBegin,glEnd)时,
glVertex
的调用将完成一个顶点的构建。从本质上讲,glVertex所做的是合并已放置在其他属性“寄存器”中的属性,并将其发送到缓冲区中
您的代码中包含以下内容:
glTexCoord2f(0.0f,0.0f); glVertex3f( 1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glTexCoord2f(10.0f,0.0f); glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2);
glTexCoord2f(10.0f,10.0f); glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
glTexCoord2f(0.0f,10.0f); glVertex3f( 1.0f+i*2, -4.0f+y*2, 1.0f+j*2);
// Back face (z = -1.0f)
glVertex3f( 1.0f+i*2, -4.0f+y*2, -1.0f+j*2);
只有最后一个glTexCoord调用实际上有效果,其他调用只会设置寄存器,但该值会立即被以下调用覆盖
使用即时模式的方法是
foreach vertex in model:
glColor
glNormal
glTexCoord
...
glVertex // must be the last call for specifying a vertex!
您不能将glColor、glNormal和其他呼叫分组。但是无论如何,你不应该使用即时模式!自从1996年OpenGL-1.1引入顶点数组以来,它就被弃用了。你真的坚持使用已经过时了近20年的技术吗?你正在生成一个纹理到
纹理[0]
,然后你在使用纹理[1]
。您应该在glBindTexture
中使用texture[0]
。另外,您应该在cria\u texturas()
之前调用glEnable(GL\u TEXTURE\u 2D)
。在同一行中,每个glTexCoord2f后面都有一个glVertex3f调用。@aslg:是的,但仅在某些行中。在其他情况下,您根本不接触纹理坐标。OP尝试仅在正面渲染纹理。您不必为所有顶点定义tex坐标,但其他面将显示为黑色,因为它们没有tex坐标。@aslg:问题是,glVertex将只使用上次设置的gltex坐标。glTexCoord和friends未锁定,即调用glVertex不会将其他属性“重置”为未设置状态。如果你不想给有问题的脸添加纹理,你必须在禁用纹理的情况下启动一个新的基本体。啊,我明白了。不管怎样,我同意,最好为所有顶点设置纹理坐标,即使您只需要一个面。但我不知道最后设置的坐标仍然会被使用。(我测试了这个代码,没有定义tex坐标的脸是黑色的,所以可能是因为我的图像大部分是黑色的,而最后一个tex坐标是黑色的texel?)。