C++ 将浮动数组存储在纹理&;使用纹理坐标从着色器访问浮动

C++ 将浮动数组存储在纹理&;使用纹理坐标从着色器访问浮动,c++,opengl,glsl,textures,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 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
在GLSL中,您可以使用积分坐标从纹理中获取texel。
这意味着纹理的texel可以通过其索引与数组的元素类似地寻址:

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

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

因此,纹理可以是一个2x2纹理,带有一个颜色通道(
GL\u RED

或具有4个颜色通道的1x1纹理(
GL\u RGBA


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

使用纹理的具体原因是什么?使用UBO、TBO或SSBO可能会更好。它用于将大约700个浮点数的数组加载到GPU中,我将根据细分坐标访问数组的不同部分。在这种情况下,使用UBO或SSBO会更好。我将研究它。在将+100个浮点数存储到着色器中时,我通常会使用UBO或SSBO吗?如果我测量静态场景中每帧的执行时间,比较这些方法,我会注意到差异吗?测量的内容将取决于许多不同的因素,但UBO是向着色器获取几kB数据的正确位置,并允许GL实现在实际硬件上选择最佳路径。谢谢,您提供的信息帮助我解决了此问题:)
float simpleArray2D[4] = { 10.0f, 20.0f, 30.0f, 400.0f };
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 2, 2, 0, GL_RED, GL_FLOAT, &simpleArray2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, &simpleArray2D);