OpenGL - 在一维纹理中提供一组值

时间:2014-05-20 14:44:01

标签: opengl glsl shader fragment-shader

我想在一维纹理中提供一组值。请考虑以下简单示例:

gl.glBindTexture(GL4.GL_TEXTURE_1D, myTextureHandle);
FloatBuffer values = Buffers.newDirectFloatBuffer(N);

for (int x = 0; x < N; ++x)
    values.put(x);

values.rewind();
gl.glTexImage1D(GL4.GL_TEXTURE_1D, 0, GL4.GL_R32F, N, 0, GL4.GL_RED, GL4.GL_FLOAT, values);

这里,N是我想要存储在纹理中的值的数量。但是,在我的片段着色器中调用textureSize(myTexture, 0)会产生1(无论我设置N)。那么,这里出了什么问题?

编辑:上述代码在初始化时执行。我的渲染循环看起来像

gl.glClear(GL4.GL_COLOR_BIT |GL4.GL_DEPTH_BUFFER_BIT);
gl.glUseProgram(myProgram);
gl.glActiveTexture(MY_TEXTURE_INDEX);
gl.glBindTexture(GL4.GL_TEXTURE_1D, myTextureHandle);
gl.glUniform1i(uMyTexture, MY_TEXTURE_INDEX);
gl.glDrawArrays(GL4.GL_POINTS, 0, 1);

我的顶点着色器由一个main - 函数组成,它什么都不做。我使用几何着色器创建全屏四边形。像素着色器代码看起来像

uniform sampler1D myTexture;
out vec4 color;

void main()
{
    if (textureSize(myTexture, 0) == 1)
    {
        color = vec4(1, 0, 0, 1);
        return;
    }
    color = vec4(1, 1, 0, 1);
}

结果是一个红色的窗口。

1 个答案:

答案 0 :(得分:3)

确保纹理为complete。由于GL_TEXTURE_MIN_FILTER默认为GL_NEAREST_MIPMAP_LINEAR,因此您必须提供一整套mipmap。

或将GL_TEXTURE_MIN_FILTER设为GL_NEAREST / GL_LINEAR


您还需要将GL_TEXTURE0 + MY_TEXTURE_INDEX(而不仅仅是MY_TEXTURE_INDEX)传递给glActiveTexture()

gl.glActiveTexture( GL_TEXTURE0 + MY_TEXTURE_INDEX );
...
gl.glUniform1i( uMyTexture, MY_TEXTURE_INDEX );