sprux
sprux

Reputation: 21

Store array of floats in texture & access the floats from the shader using texture coordinates

Edit: Removed alot of clutter and rephrased the question.

I have stored an array of floats into my shader using:

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

How do I access specific elements from the float array in the shader?

Specific fragment shader code showing what I've done to test it so far, displaying a green color when the value is the specified one (10.0f in this case), and red if it's not.

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

Upvotes: 0

Views: 590

Answers (1)

Rabbid76
Rabbid76

Reputation: 211278

In GLSL you can use texelFetch to get a texel from a texture by integral coordinates.
This means the texels of the texture can be addressed similar the elements of an array, by its index:

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

But note, the array consists of 4 elements.

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

So the texture can be a 2x2 texture with one color channel (GL_RED)

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

or a 1x1 texture with 4 color channels (GL_RGBA)

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

but it can't be a 2x2 RGBA texture, because for this the array would have to have 16 elements.

Upvotes: 1

Related Questions