【发布时间】:2013-12-12 09:21:50
【问题描述】:
我有 128 x 128 px 24 位 bmp 文件用于纹理。这是一个带有一条垂直线的绿色正方形。它可以使用 stbi_image 加载。在初始化中启用
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);
我有一个由立方体和圆柱体(以及一些带有顶点的多边形)组成的对象。我将纹理绑定到这样的一个 glut:
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 不会生成纹理坐标,但显然使用上部 glEnables 它工作得很好。所以纹理出现在物体上。此时一切看起来都很好。
当我使用 lookAt 更改视图或在某个路径中平移和旋转对象时,问题就开始了。然后它看起来就像纹理不随物体移动和旋转,而是保持静止。
第一:初步看法;第二:稍微旋转的视图(lookAt);第三:轻微翻译的对象
如果我用顶点绘制那个对象,也会发生同样的事情。我在 C++ 中使用 OpenGL 2.1 和 glut。
【问题讨论】:
-
我相信您自己已经发现了问题。如果没有纹理坐标,它怎么可能将顶点映射到纹理中的某个点?
-
@Dave 我希望有一些神奇的方法可以使它成为可能。实心立方体很容易实现,所以我更关心实心圆柱体的实现。如果我实现 glutSolidCylinder 并在其中放入一些纹理坐标,它会起作用吗?