如何将浮点矩阵作为 2D 纹理传递给片段着色器?

Posted

技术标签:

【中文标题】如何将浮点矩阵作为 2D 纹理传递给片段着色器?【英文标题】:How do I pass in a matrix of floats as a 2D texture to the fragment shader? 【发布时间】:2014-10-01 19:45:30 【问题描述】:

我有一个存储在

中的 nr x nc 浮点值矩阵
std::vector<float> data;

如何将此矩阵作为 2D 纹理传递给片段着色器?

我应该使用哪种内部格式和格式作为 glTexImage2D() 的参数?

是否需要设置

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);

顺便说一句:我不明白 GL_UNPACK_ALIGNMENT 和 GL_PACK_ALIGNMENT 之间的区别。 我的数据非常紧凑(对齐 = 1)。一个命令应该足以告诉 OpenGL 这一点。

【问题讨论】:

你试过GL_R32FGL_FLOAT吗? 【参考方案1】:

对于具有任意浮点数的通用矩阵,并且您需要 32 位精度,我建议使用单通道 32 位浮点格式作为内部格式。你还没有指定你的目标 OpenGL 版本,所以我假设“相当现代”,所以 internl 格式应该设置为GL_R32F。作为格式,您显然想使用GL_FLOAT,因为该参数描述了您的客户端数据的格式。

在这种情况下,您可以将 GL_UNPACK_ALIGNMENT 设置为任何有效值

GL_PACK_ALIGNMENT 完全不相关。它定义了回读(“打包”)像素数据的对齐方式。

【讨论】:

谢谢你!使用 GL_R32F 值作为红色分量进入着色器?这和 GL_RED 一样吗?在将它们发送到着色器之前,我是否必须将值缩放到 [0,1] 范围内? @Andy:是的,他们将在红色通道中。不,您不需要缩放它们,您可以使用完整的浮动范围。

以上是关于如何将浮点矩阵作为 2D 纹理传递给片段着色器?的主要内容,如果未能解决你的问题,请参考以下文章

传递给片段着色器的纹理坐标全部为 0

THREE.js - 大型int作为Uniform

纹理中的 OpenGL 片段着色器

从片段着色器中的地形高程数据计算法线

OpenGL:如何将多个纹理传递给具有一个变量的着色器?

如何在着色器之后读取像素?