我正在使用一些标准的GLSL(版本120)顶点和片段着色器来模拟激光雷达。换句话说,它不是仅在每个x,y位置(每个像素,通过片段着色器)返回颜色,而是返回颜色和距离。
我想我实际上并不需要所有的颜色位,因为我真的只想要强度;例如,我可以将距离存储在gl_FragColor.b
中,并使用.rg
作为强度。但后来我并不完全清楚我是如何重新获得价值的。
是否有一种从片段着色器返回值的简单方法?我已经尝试了varying
,但似乎片段着色器无法编写gl_FragColor
以外的变量。
我知道有些人使用GLSL管道进行通用(非图形)GPU处理,这可能是一个选择 - 除了我仍然想要正常渲染我的对象。
答案 0 :(得分:2)
OpenGL已经通过深度缓冲区返回这个“距离计算”,尽管它不是线性的。您可以简单地创建一个帧缓冲区对象(FBO),附加颜色和深度缓冲区,渲染它,并将结果放在深度缓冲区中(尽管您必须撤消深度转换)。如果您熟悉深度计算,这是最简单的编程选项。
正如您所建议的,另一种方法是将值存储在颜色缓冲区中。您不必使用主色缓冲区,因为那样您将失去颜色或必须渲染两次。相反,将第二个渲染目标(纹理)附加到您的FBO(GL_COLOR_ATTACHMENT1
)并使用gl_FragData[0]
作为正常颜色,并使用gl_FragData[1]
作为您的距离(对于您应声明的新GL版本{{ 1}}片段着色器中的变量)。这取决于你需要的精度,但你可能想让距离纹理32位浮动(out
并写入GL_R32F
)。
- 这是一个不错的起点:http://www.opengl.org/wiki/Framebuffer_Object
是的,GLSL可用于计算目的。特别是ARB_image_load_store和nvidia的无绑定图形。您甚至可以通过计算着色器访问共享内存(尽管我从来没有比慢5倍的速度更快)。正如@Jherico所说,片段着色器通常输出到帧缓冲附件/渲染目标中的单个位置,并且最近的功能(如图像单元(ARB_image_load_store))允许您从着色器写入任意位置。它可能有点过分而且速度较慢,但您也可以通过图像单元将距离写入缓冲区。
最后,如果您希望数据返回主机(CPU可访问)端,请使用距离纹理gl_FragData[1].r
(如果您决定使用图像单位,则使用glGetTexImage
。)
答案 1 :(得分:1)
片段着色器输出到渲染缓冲区。如果您想使用GPU进行计算并将数据提取回主机内存,您可以选择一些选项