我有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更改视图或我在某个路径中翻译和旋转对象时,问题就开始了。然后它看起来像纹理不移动和旋转对象但保持静态。
第一:初步观点;第二:略微旋转的视图(lookAt);第三:略微翻译的对象
如果我将使用顶点绘制该对象,则会发生同样的事情。我使用C ++中的OpenGL 2.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。