我正在使用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中的直接内存访问?
答案 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?