首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于OpenGL 4.x的一维纹理映射

基于OpenGL 4.x的一维纹理映射
EN

Stack Overflow用户
提问于 2014-08-28 14:34:09
回答 1查看 9K关注 0票数 4

我想使用一维纹理(彩色斜坡)来纹理一个简单的三角形。

我的片段着色器是这样的:

代码语言:javascript
复制
#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

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

我的顶点着色器是这样的:

代码语言:javascript
复制
#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);
}

在绘制三角形时,我这样做(为了更好的可读性,我删除了错误检查表单代码):

代码语言:javascript
复制
glUseProgram(program_);

GLuint samplerLocation = glGetUniformLocation(program_, name.toCString());
glUniform1i(samplerLocation, currentTextureUnit_);

glActiveTexture( GL_TEXTURE0 + currentTextureUnit_ );
glBindTexture(GL_TEXTURE_1D, textureId);

不幸的是我的三角只有黑色。有什么办法解决这个问题吗?

我很确定分配的纹理中填充了适当的数据,因为我用glGetTexImage读取并检查了它。我是否需要调用其他函数来绑定和激活纹理?我有几乎相同的代码2d纹理,这是工作。

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

代码语言:javascript
复制
#version 420

uniform sampler1D           colorRamp;
in float height;

out vec4 FragColor;

void main()
{
   FragColor = vec4(height, height, height, 1.0); // change!
}

我得到了这个输出:

我准备了一些再现错误的演示源代码。源可以找到这里。它生成以下输出:

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

代码语言:javascript
复制
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_;
}

纹理绑定是这样完成的:

代码语言:javascript
复制
GLuint samplerLocation = glGetUniformLocation(rc.ToonHandle, "ColorRamp");
glUniform1i(samplerLocation, 0);
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_1D, rc.texure1d);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-28 21:46:58

发现了窃听器:

代码语言:javascript
复制
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/*3*sizeof(float)*4*/,  // bug fix!!!!
  0,          // border: This value must be 0.
  GL_RGBA,
  GL_FLOAT,
  data
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25551457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档