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

时间:2019-02-15 16:05:02

标签: c++ opengl glsl textures

编辑:消除了很多混乱,并改写了问题。

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

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);

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

特定的片段着色器代码显示到目前为止我已经对其进行了测试,在指定值为1(在这种情况下为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

1 个答案:

答案 0 :(得分:1)

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

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个颜色通道(GL_RGBA)的1x1纹理

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

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