在OpenGL中用线性渐变纹理绘制圆柱体

在OpenGL中用线性渐变纹理绘制圆柱体,opengl,texture-mapping,Opengl,Texture Mapping,如何在OpenGL中绘制具有线性渐变纹理的圆柱体,该纹理的方向与此示例图像()中的方向类似 我使用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, G

如何在OpenGL中绘制具有线性渐变纹理的圆柱体,该纹理的方向与此示例图像()中的方向类似

我使用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);
这会生成渐变,但方向错误:


如何获得正确的方向?

您需要提供一些纹理坐标。我不记得圆柱体生成了哪些纹理坐标,如果有的话。但在您的情况下,老式的OpenGL纹理坐标生成应该可以为您服务。圆柱体沿Z轴移动,因此我们需要纹理坐标贴图(0,0,0)→(0)至(0,0,高度)→(1)

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

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

您需要提供一些纹理坐标。我不记得圆柱体生成了哪些纹理坐标,如果有的话。但在您的情况下,老式的OpenGL纹理坐标生成应该可以为您服务。圆柱体沿Z轴移动,因此我们需要纹理坐标贴图(0,0,0)→(0)至(0,0,高度)→(1)

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

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

您是否已经有了一些代码,或者您是OpenGL的新手?如果是后者,你必须从一个较低的层次开始,因为我们不会只为你编写一些你不能真正理解的代码。请阅读NeHe OpenGL教程,所有基本的东西都在那里解释->我对OpenGL并不陌生。我更新了问题,提供了更多的信息和代码。这看起来你根本不需要纹理。渐变似乎从纯红色变为纯绿色(我确实有轻微的色觉缺陷,如果我错了,请原谅我…),这可以通过插值顶点颜色来实现。为一个“环”中的所有顶点指定一种颜色,为另一个“环”中的所有顶点指定另一种颜色。顶点着色器将在“环”之间的圆柱体上插值该颜色(不管怎样,纹理坐标的效果都是一样的)。我同意@Damon的观点,您可以使用循环自己绘制它。这样,您就可以控制每一端的顶点颜色。如果效率太低,那么你可以使用顶点缓冲区。你是否已经有了一些代码,或者你是OpenGL的新手?如果是后者,你必须从一个较低的层次开始,因为我们不会只为你编写一些你不能真正理解的代码。请阅读NeHe OpenGL教程,所有基本的东西都在那里解释->我对OpenGL并不陌生。我更新了问题,提供了更多的信息和代码。这看起来你根本不需要纹理。渐变似乎从纯红色变为纯绿色(我确实有轻微的色觉缺陷,如果我错了,请原谅我…),这可以通过插值顶点颜色来实现。为一个“环”中的所有顶点指定一种颜色,为另一个“环”中的所有顶点指定另一种颜色。顶点着色器将在“环”之间的圆柱体上插值该颜色(不管怎样,纹理坐标的效果都是一样的)。我同意@Damon的观点,您可以使用循环自己绘制它。这样,您就可以控制每一端的顶点颜色。如果效率太低,那么可以使用顶点缓冲区。