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

将带有浮点值的纹理传递给着色器 我正在开发QT-QML 3D中的C++应用程序。我需要将数十个浮点值或浮点数向量传递给片段着色器。这些值是灯光的位置和颜色,因此我需要的值大于0.0到1.0的范围。但是,不支持将浮点或整数数组传递给QML中的着色器。我的想法是将浮动保存到纹理,将纹理传递到着色器并从中获取值,c++,qt,opengl,qml,glsl,C++,Qt,Opengl,Qml,Glsl,我试过这样的方法: 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); uniform sampler2D float_texture; ... float f

我试过这样的方法:

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);
uniform sampler2D float_texture;

...

float float_texel = float( texture2D(float_texture, tex_coords.xy) );
并将此QImage作为sampler2D传递给片段着色器。但是有没有像memcpy这样的方法可以从GLSL中的纹理中获取值呢? texelFetch方法仅返回浮点数范围为0.0到1.0的me vec4。那么如何从着色器中的纹理获取原始值呢?
我更喜欢使用sampler2D类型,但是,在GLSL中是否有其他类型支持直接内存访问?

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


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

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


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

这将从浮点数组创建浮点纹理

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, GL_RED, GL_FLOAT, &array);
可以从片段着色器访问浮点值,如下所示:

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);
uniform sampler2D float_texture;

...

float float_texel = float( texture2D(float_texture, tex_coords.xy) );
OpenGL浮动纹理是一个有很好文档记录的主题。

这将从浮点数组创建浮点纹理

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, GL_RED, GL_FLOAT, &array);
可以从片段着色器访问浮点值,如下所示:

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);
uniform sampler2D float_texture;

...

float float_texel = float( texture2D(float_texture, tex_coords.xy) );
OpenGL浮动纹理是一个有很好文档记录的主题。

这并不能解决我的问题。我用正确的浮点值创建QImage没有任何问题。我在GLSL中的着色器中访问这些值时遇到问题。这并不能解决我的问题。我用正确的浮点值创建QImage没有任何问题。我在GLSL中的着色器中访问这些值时遇到问题。当我像上面一样创建QImage时,这些值保存在那里,但不是按像素组织的。这就是为什么我需要一些函数,比如GLSL中的memcpy,它不访问每像素纹理或texel,而只是将字节复制到任何数组中。有这样的功能吗?@david:这些功能是按像素组织的。只是Qt将这些像素解释为每个通道8位的标准化整数,而不是每个通道32位的浮点。OpenGL可以完全满足您的需要;正确地使用它。当我像上面那样创建QImage时,值保存在那里,但不是按像素组织的。这就是为什么我需要一些函数,比如GLSL中的memcpy,它不访问每像素纹理或texel,而只是将字节复制到任何数组中。有这样的功能吗?@david:这些功能是按像素组织的。只是Qt将这些像素解释为每个通道8位的标准化整数,而不是每个通道32位的浮点。OpenGL可以完全满足您的需要;请正确使用它。您好,请您扩展您关于如何从片段着色器访问值的答案?对我来说,这似乎适用于我在这里描述的问题:当我使用glTexImage2DGL_TEXTURE_2D,0,GL_R32F,宽度,高度,0,GL_RED,GL_FLOAT,&array;我必须像这样将创建的纹理传递给着色器:GLuint texture\u sampler\u loc=glGetUniformLocationshaderprogram,texture;glUniform1ftexture_取样器_loc,1;但在QML中,我无法获得指向着色器程序的指针。或者有没有其他方法可以将纹理传递给着色器?您好,请详细说明如何从片段着色器访问值?对我来说,这似乎适用于我在这里描述的问题:当我使用glTexImage2DGL_TEXTURE_2D,0,GL_R32F,宽度,高度,0,GL_RED,GL_FLOAT,&array;我必须像这样将创建的纹理传递给着色器:GLuint texture\u sampler\u loc=glGetUniformLocationshaderprogram,texture;glUniform1ftexture_取样器_loc,1;但在QML中,我无法获得指向着色器程序的指针。或者有没有其他方法可以将纹理传递给着色器?