我想在一维纹理中提供一组值。请考虑以下简单示例:
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);
}
结果是一个红色的窗口。
答案 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 );