如何将浮点矩阵作为 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_R32F
和GL_FLOAT
吗?
【参考方案1】:
对于具有任意浮点数的通用矩阵,并且您需要 32 位精度,我建议使用单通道 32 位浮点格式作为内部格式。你还没有指定你的目标 OpenGL 版本,所以我假设“相当现代”,所以 internl 格式应该设置为GL_R32F
。作为格式,您显然想使用GL_FLOAT
,因为该参数描述了您的客户端数据的格式。
在这种情况下,您可以将 GL_UNPACK_ALIGNMENT
设置为任何有效值
GL_PACK_ALIGNMENT
完全不相关。它定义了回读(“打包”)像素数据的对齐方式。
【讨论】:
谢谢你!使用 GL_R32F 值作为红色分量进入着色器?这和 GL_RED 一样吗?在将它们发送到着色器之前,我是否必须将值缩放到 [0,1] 范围内? @Andy:是的,他们将在红色通道中。不,您不需要缩放它们,您可以使用完整的浮动范围。以上是关于如何将浮点矩阵作为 2D 纹理传递给片段着色器?的主要内容,如果未能解决你的问题,请参考以下文章