使用OpenGL 4.x的1d纹理进行纹理贴图

使用OpenGL 4.x的1d纹理进行纹理贴图,opengl,texture-mapping,opengl-4,texture1d,Opengl,Texture Mapping,Opengl 4,Texture1d,我想使用一个1d纹理(颜色渐变)纹理一个简单的三角形 我的片段着色器如下所示: #version 420 uniform sampler1D colorRamp; in float height; out vec4 FragColor; void main() { FragColor = texture(colorRamp, height).rgba; } #version 420 layout(location = 0) in vec3 position;

我想使用一个1d纹理(颜色渐变)纹理一个简单的三角形

我的片段着色器如下所示:

#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

void main()
{
   FragColor = texture(colorRamp, height).rgba;
}
#version 420

layout(location = 0) in vec3 position;

out float height;

void main()
{
    height = (position.y + 0.75f) / (2 * 0.75f);
    gl_Position = vec4( position, 1.0);
}
我的顶点着色器如下所示:

#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

void main()
{
   FragColor = texture(colorRamp, height).rgba;
}
#version 420

layout(location = 0) in vec3 position;

out float height;

void main()
{
    height = (position.y + 0.75f) / (2 * 0.75f);
    gl_Position = vec4( position, 1.0);
}
在绘制三角形时,我采用这种方式(为了更好的可读性,我删除了错误检查表单代码):

不幸的是,我的三角形只有黑色。有没有办法解决这个问题

我非常确定指定的纹理填充了正确的数据,因为我用
glGetTexImage
读取并检查了它。我是否需要调用其他函数来绑定和激活纹理?我有几乎相同的二维纹理代码,这是工作

当我以这种方式更改着色器代码时:

#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

void main()
{
   FragColor = vec4(height, height, height, 1.0); // change!
}
GLuint samplerLocation = glGetUniformLocation(rc.ToonHandle, "ColorRamp");
glUniform1i(samplerLocation, 0);
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_1D, rc.texure1d);
我得到这个输出:

我准备了一些复制错误的演示源代码。可以找到来源。 它生成以下输出:

1d纹理是这样创建的-只有红色像素:

static GLuint Create1DTexture()
{
    GLuint textureId_;

    // generate the specified number of texture objects 
    glGenTextures(1, &textureId_);
    assert(glGetError() == GL_NO_ERROR);

    // bind texture
    glBindTexture(GL_TEXTURE_1D, textureId_);
    assert(glGetError() == GL_NO_ERROR);

    // tells OpenGL how the data that is going to be uploaded is aligned
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    assert(glGetError() == GL_NO_ERROR);

    float data[] =
    {
        1.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f
    };

    glTexImage1D(
        GL_TEXTURE_1D,      // Specifies the target texture. Must be GL_TEXTURE_1D or GL_PROXY_TEXTURE_1D.
        0,                  // Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
        GL_RGBA32F,
        3*sizeof(float)*4,
        0,                  // border: This value must be 0.
        GL_RGBA,
        GL_FLOAT,
        data
    );
    assert(glGetError() == GL_NO_ERROR);

    // texture sampling/filtering operation.
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    assert(glGetError() == GL_NO_ERROR);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    assert(glGetError() == GL_NO_ERROR);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    assert(glGetError() == GL_NO_ERROR);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    assert(glGetError() == GL_NO_ERROR);

    glBindTexture(GL_TEXTURE_1D, 0);
    assert(glGetError() == GL_NO_ERROR);

    return textureId_;
}
纹理绑定通过以下方式完成:

#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

void main()
{
   FragColor = vec4(height, height, height, 1.0); // change!
}
GLuint samplerLocation = glGetUniformLocation(rc.ToonHandle, "ColorRamp");
glUniform1i(samplerLocation, 0);
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_1D, rc.texure1d);
发现错误:

glTexImage1D(
GL\u TEXTURE\u 1D,//指定目标纹理。必须是GL\u TEXTURE\u 1D或GL\u PROXY\u TEXTURE\u 1D。
0,//指定详细程度编号。级别0是基本图像级别。级别n是第n个mipmap还原图像。
GL_RGBA32F,
3/*3*sizeof(float)*4*/,//错误修复!!!!
0,//边框:此值必须为0。
格尔巴,
浮球,
数据
);

也显示顶点着色器。它设置的高度是否正确?你确定你通过的是标准化高度吗?另外,我建议使用
.rgba
,这更清楚地表明你在谈论纹理/颜色。有太多的事情你可能会做错。纹理完整吗?你确定坐标吗?您是否尝试过f.i.在其0和1值之间指定不同的红色阴影,并在该范围之外指定类似绿色的“绘制高度”?
GL\u KHR\u debug
报告了什么?@BartekBanachewicz我根据你的建议更改了帖子@peppe GL_KHR_debug只报告了一个似乎与此问题无关的通知(它报告在视频内存中创建了顶点缓冲区)。我提供了一个“最小”的演示来重现此错误。演示使用的是GL 3.x,但与GL 4.x没有太大区别。是的,第四个参数是纹理的宽度(以像素为单位)。您似乎将其与字节大小弄错了。在我的实际应用程序中,不会发生此错误-我在实际应用程序中使用了采样器对象,而1d纹理似乎不适用于所有类型的采样器对象。