将具有浮点值的纹理传递给着色器

时间:2017-07-21 14:31:27

标签: c++ qt opengl qml glsl

我正在使用QT QML 3D开发C ++应用程序。我需要将数十个浮点值(或浮点数的向量)传递给片段着色器。这些值是灯光的位置和颜色,因此我需要的值大于0.0到1.0。但是,不支持在QML中将浮点数或整数数组传递给着色器。我的想法是将浮点数保存到纹理,将纹理传递给着色器并从中获取值。

我试过这样的事情:

float array [4] = {100.5, 60.05, 63.013, 0.0};
uchar data [sizeof array * sizeof(float)];
memcpy(data, &array, sizeof array * sizeof(float));
QImage img(data, 4, 1, QImage::Format_ARGB32);

并将此QImage作为sampler2D传递给片段着色器。但是有没有像memcpy这样的方法从GLSL中获取纹理的值? texelFetch方法只返回vec4,浮点数范围为0.0到1.0。那么如何从着色器中的纹理中获取原始值? 我更喜欢使用sampler2D类型,但是,是否还有其他类型支持GLSL中的直接内存访问?

2 个答案:

答案 0 :(得分:2)

纹理访问函数直接从纹理中读取。问题是Format_ARGB32每个通道不是32位 ;它是每像素32位 。从this documentation page开始,QImage 似乎无法创建浮点图像;它只处理规范化格式。 QImage本身似乎是一个用于处理GUI事务的类,而不是用于加载OpenGL图像。

您必须放弃Qt图像快捷方式,并直接使用OpenGL。

答案 1 :(得分:1)

这将从float数组创建一个浮动纹理。

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, GL_RED, GL_FLOAT, &array);

您可以从片段着色器中访问浮点值,如下所示:

uniform sampler2D float_texture;

...

float float_texel = float( texture2D(float_texture, tex_coords.xy) );

“OpenGL浮点纹理”是一个记录良好的主题。 What exactly is a floating point texture?