OpenGL纹理不能正常工作

时间:2013-12-12 09:21:50

标签: c++ opengl textures glut

我有128 x 128 px 24位bmp文件用于纹理。这是一个带有一条垂直线的绿色方块。它用stbi_image加载OK。在初始化中启用

glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);

和纹理参数是

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

我有一个用立方体和圆柱体(以及一些带顶点的多边形)制作的物体。我将纹理绑定到这样的过剩

glPushMatrix();
glBindTexture(GL_TEXTURE_2D, tex1_id);
glColor3f(0.0f, 1.0f, 0.0f);
glTranslatef(-0.5f, 0.2f, 0.05f);
glScalef(2.4f, 0.4f, 1.0f);
glutSolidCube(0.6f);
glBindTexture(GL_TEXTURE_2D, 0);
glPopMatrix();

顶点 square:

glPushMatrix();
glTranslatef(-0.03f, 1.26f, -0.35f);
glRotatef(94, 1.0f, 0, 0);
glBindTexture(GL_TEXTURE_2D, tex1);
glBegin(GL_QUADS);  
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-0.3f, 0.4f, 0.0f);  
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-0.3f, 0.85f, 0.0f);  
glTexCoord2f(1.0f, 1.0f);
glVertex3f(0.3f, 0.85f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(0.3f, 0.4f, 0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glPopMatrix();

我知道glutSolidCube不会生成纹理坐标,但显然上面的glEnables它可以正常工作。所以纹理出现在对象上。在这一点上,一切都很好看。

当我使用lookAt更改视图或我在某个路径中翻译和旋转对象时,问题就开始了。然后它看起来像纹理不移动和旋转对象但保持静态。

Problem 第一:初步观点;第二:略微旋转的视图(lookAt);第三:略微翻译的对象

如果我将使用顶点绘制该对象,则会发生同样的事情。我使用C ++中的OpenGL 2.1和过剩。

1 个答案:

答案 0 :(得分:0)

你做错了。你必须定义纹理坐标。 通过自己给出顶点和纹理坐标来绘制立方体。

//first face of cube
glTexCoord2f(0.0, 0.0);
glVertex3f(x, y, z);
glTexCoord2f(1.0, 0.0);
glVertex3f(x, y, z);
glTexCoord2f(1.0, 1.0);
glVertex3f(x, y, z);
glTexCoord2f(0.0, 1.0);
glVertex3f(x, y, z);

//and so on for all six face of cube.

您必须了解纹理坐标的工作原理。 现在,如果要绘制圆柱体,请使用gluCylinder函数查看here以获取详细信息。您可以使用gluCylinder函数使用gluQuadricTexture在使用//Create the quadric object to render cylinder GLUquadric *quad; quad = gluNewQuadric(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, _textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gluQuadricTexture(quad,1); gluCylinder(quad,2,2,3,20,20); 渲染的圆柱上映射纹理。我假设您已经加载了纹理。

{{1}}

您可以找到类似的示例here