在OpenGL中绘制具有线性渐变纹理的圆柱体

时间:2011-06-30 02:34:07

标签: opengl texture-mapping

如何在OpenGL中绘制圆柱体,其具有与此示例图像(link to image)中的线性渐变纹理相似的线性渐变纹理?

我使用gluCylinder()绘制圆柱体。但我很难让纹理正确。

glEnable(GL_TEXTURE_1D);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_1D, texture);
GLubyte gradient[6] = { 255,0,0, 0,255,0 };
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, gradient);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

gluQuadricDrawStyle(quad,GLU_FILL);
gluQuadricTexture(quad,GL_TRUE);
gluCylinder(quad,1.0f,1.0f,3.0f,32,32);

这会产生渐变,但方向错误:screenshot

如何获得正确的方向?

1 个答案:

答案 0 :(得分:1)

您需要提供一些纹理坐标。我不记得gluCylinder生成哪个纹理坐标,如果有的话。但在你的情况下,旧式OpenGL纹理坐标生成应该为你服务。 gluCylinder沿着Z轴行进,所以我们需要纹理坐标映射(0,0,0)→(0)到(0,0,heigt)→(1)。

OpenGL到版本2提供了纹理坐标生成,因此我建议在调用gluCylinder之前添加以下内容,而不是gluQuadricTexture。

GLfloat texgen_coeff[4] = {1./height, 0., 0., 0.};
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, texgen_coeff);