使用 GL_TEXTURE_1D 纹理对象

Posted

技术标签:

【中文标题】使用 GL_TEXTURE_1D 纹理对象【英文标题】:Texturing an object with GL_TEXTURE_1D 【发布时间】:2014-08-15 05:13:04 【问题描述】:

我正在开发一个需要我使用 OpenGL 2.1 的应用程序的插件。因此,我正在使用固定功能,而为了调试,我目前正在使用即时模式绘图。我没有使用任何着色器。

我正在尝试生成一些简单的地形并使用 1D 渐变纹理对其进行纹理化,其中地形的高度决定了从纹理中选择的颜色。

我看到的是纹理根本没有应用于几何体,但我不明白为什么。

这是我设置纹理的方法:

// Set up gradient
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
glDisable(GL_TEXTURE_RECTANGLE_ARB);
glEnable(GL_TEXTURE_1D);
GLuint  gradTex    = 0;
glGenTextures(1, &gradTex);
glBindTexture(GL_TEXTURE_1D, gradTex);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_FLOAT, samples);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
CheckGLError();

我已经通过在 OS X 上使用 OpenGL Profiler 来检查渐变纹理是否正确上传。所以我认为这意味着问题在于我在绘制时如何绘制几何图形或其他状态集。绘制代码如下:

glColor4f(1.0, 1.0, 1.0, 1.0);

glBegin(GL_QUADS);
int x, y;
for (y = 0; y < 32; y++)

    for (x = 0; x < 32; x++)
    
        float   nextTexCoord = mesh [ y ][ x ].y + 0.5;
        glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
        glTexCoord1d(nextTexCoord);
        glVertex3d(mesh [ y ][ x ].x, mesh [ y ][ x ].y * height, mesh [ y ][ x ].z);

        nextTexCoord = mesh [ y ][ x + 1 ].y + 0.5;
        glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
        glTexCoord1d(nextTexCoord);
        glVertex3d(mesh [ y ][ x + 1 ].x, mesh [ y ][ x + 1 ].y * height, mesh [ y ][ x + 1 ].z);

        nextTexCoord = mesh [ y + 1 ][ x + 1 ].y + 0.5;
        glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
        glTexCoord1d(nextTexCoord);
        glVertex3d(mesh [ y + 1 ][ x + 1 ].x, mesh [ y + 1 ][ x + 1 ].y * height, mesh [ y + 1 ][ x + 1 ].z);

        nextTexCoord = mesh [ y + 1 ][ x ].y + 0.5;
        glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
        glTexCoord1d(nextTexCoord);
        glVertex3d(mesh [ y + 1 ][ x ].x, mesh [ y + 1 ][ x ].y * height, mesh [ y + 1 ][ x ].z);
    

glEnd();

CheckGLError();

为了确保我的纹理坐标正确,我已经用它们的纹理坐标为顶点着色。纹理坐标似乎是正确的 - 它们从 0 变为 1,并且我的模型按预期从黑色变为白色。我的渐变中没有白色、灰色或黑色,但我的模型显示为灰色阴影。我究竟做错了什么?调用 glGetError() 不会返回错误。

【问题讨论】:

【参考方案1】:

我想通了。事实证明,没有设置 min/mag 过滤器会导致这个问题。通过添加:

glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

它开始工作了。我不知道为什么这会有所作为,但显然确实如此!

【讨论】:

GL_TEXTURE_MIN_FILTER 的默认值为 GL_NEAREST_MIPMAP_LINEAR,这需要带有 mipmap 的纹理。 啊,好的。那我想这是有道理的。默认情况下这似乎很奇怪,但就这样吧。

以上是关于使用 GL_TEXTURE_1D 纹理对象的主要内容,如果未能解决你的问题,请参考以下文章

应该是每个纹理单元应用glEnable(GL_TEXTURE_2D)

如何使用 glDrawTexOES 绘制纹理?

立方体侧面的纹理与opengl

OpenGL学习——纹理

为啥纹理(GL_TEXTURE_2D)不能与(VertexArray)VAO一起使用

在具有目标 GL_TEXTURE_2D 的纹理上渲染相机预览