2013-12-12 43 views
0

我有纹理128 x 128像素24位BMP文件。这是一条垂直线的绿色广场。它用stbi_image加载OK。在初始化启用OpenGL纹理不起作用,因为它应该

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(); 

顶点方:

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不generete纹理坐标,但显然与上glEnables它工作得精细。所以纹理显示在对象上。一切看起来都很好。

问题在我用lookAt更改视图时开始,或者我在一些路径中翻译和旋转对象。然后它看起来像纹理不会随对象移动和旋转,而是保持静态。

Problem 第一:初始视图;第二:稍微旋转的看法(lookAt);第三种:稍微翻译的对象

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

+1

我相信你自己发现了这个问题。没有纹理坐标,它怎么可能将顶点映射到纹理中的一个点? – Dave

+0

@Dave我希望有一些神奇的方式可以让它成为可能。立方体很容易实现,所以我更关心实体圆柱体的实现。如果我执行glutSolidCylinder并在其中添加一些纹理坐标,它会起作用吗? –

回答

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); 

你可以找到类似的例子here

+0

也许我没有描述我的问题,所以我更新了我的问题。具有顶点和添加纹理坐标的方式不起作用。 –

+0

glutSolidCube是真正的问题。它不会生成纹理坐标,因此如果您翻译或旋转立方体纹理,将不会用立方体翻译,而是映射到不同的位置。 –

+0

我知道,我还修改了glutSolidCube的原始功能,并在那里添加了纹理坐标。没有效果。即使我绘制4个顶点和纹理坐标的简单正方形,它也不起作用。 –