将浮点数组存储在纹理中并使用纹理坐标从着色器访问浮点数

sprux

编辑:消除了很多混乱并重新表述了问题。

我使用以下方法将一组浮点数存储到我的着色器中:

float simpleArray2D[4] = { 10.0f, 20.0f, 30.0f, 400.0f };
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 2, 2, 0, GL_RGB, GL_FLOAT, &simpleArray2D);

如何从着色器中的浮点数组访问特定元素?

特定的片段着色器代码显示了到目前为止我所做的测试,当值为指定的值时显示绿色(10.0f在本例中),如果不是,则显示红色。

vec2 textureCoordinates = vec2(0.0f, 0.0f);
float testValueFloat = float(texture(floatArraySampler, textureCoordinates));
outColor = testValueFloat >= 10.0f ? vec4(0,1,0,1) : vec4(1,0,0,1); //Showed green
//outColor = testValueFloat >= 10.1f ? vec4(0,1,0,1) : vec4(1,0,0,1); //Showed red
疯兔76

在 GLSL 中,您可以使用texelFetch积分坐标从纹理中获取纹素。
这意味着纹理的 texel 可以通过它的索引来寻址,类似于数组的元素:

ivec2 ij = ivec2(0, 0);
float testValueFloat = texelFetch(floatArraySampler, ij, 0).r;

但请注意,该数组由 4 个元素组成。

float simpleArray2D[4] = { 10.0f, 20.0f, 30.0f, 400.0f };

因此纹理可以是具有一个颜色通道 ( GL_RED)的 2x2 纹理

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 2, 2, 0, GL_RED, GL_FLOAT, &simpleArray2D);

或具有 4 个颜色通道的 1x1 纹理 ( GL_RGBA)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, &simpleArray2D);

但它不能是 2x2 RGBA 纹理,因为为此数组必须有 16 个元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章