c++ - 在纹理中存储 float 数组并使用纹理坐标从着色器访问 float

标签 c++ opengl glsl textures

编辑:消除了很多困惑并改写了问题。

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

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 组中的特定元素?

特定的片段着色器代码显示了到目前为止我为测试它所做的工作,当值是指定值时显示绿色(在本例中为 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 中你可以使用 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 };

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

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

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

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

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

关于c++ - 在纹理中存储 float 数组并使用纹理坐标从着色器访问 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54712987/

相关文章:

c++ - 当我修改复制构造函数做一些奇怪的事情然后按值将一个对象(属于那个类)传递给一个函数时会发生什么?

c++ - 如何检测标准库类型

C++虚函数问题

java - lwjgl glDrawArrays 给出无效操作错误

java - 旋转后模型的顶点选择和状态

c++ - GLSL-SSAO : Getting undesired results when fetching depth position

c++ - OpenGL 3.0 窗口碰撞检测

c++ - std::chrono 的问题

opengl - opengl中的正交投影和纹理坐标

java - GLSL 统一结构数组仅定义第一个元素