Unity中的着色器编程

问题描述 投票:1回答:3

我正在尝试编写一个着色器以逐像素读取整个帧,并在进行一些计算后重新写入像素。我浏览了一些代码,但大多数都不相关。您能否给我一些有关如何在Unity着色器编程中读取像素和写入像素的提示?

unity3d shader unityscript
3个回答
1
投票

如果您具有Unity的Pro版本,则可以使用image (postprocessing) effects实现。您要做的就是在相机的某个组件上实现OnRenderImage回调。然后,使用具有着色器的材质调用OnRenderImage。着色器接收屏幕内容作为主要纹理。


0
投票

您需要纹理缓冲区来容纳帧的大小。然后,您要将帧渲染到缓冲区之一中。现在,您需要编写一个片段着色器,以读取一个缓冲区,然后写入另一个缓冲区。然后,最后将片段着色器输出绘制为覆盖屏幕的平面对象。

在着色器编程中,您不能按像素工作,而是定义了一个函数,该函数将在单个像素上使用,该位置在所有3轴上都从0到1浮动(尽管您只会使用2) 。然后,该片段着色器并行运行大量像素,这就是它更快地完成所有操作的方式。

我希望简短的说明足以使您入门。 Unity片段着色器用Cg编写。 Cg是介于OpenGL语言GLSL和DirectX语言HLSL之间的一种语言,因为所有高级语言都编译为图形卡上的本机指令,它们都非常相似。因此,有大量的Cg示例,一旦您可以编写Cg,阅读HLSL和GLSL就不会有问题。


0
投票

谢谢您的建议。他们真的很有帮助。我最终为着色器使用了这段代码。现在,一个新问题浮出水面。

我的解决方案:为了解决关键问题,我改编了“戴眼镜”的想法!这意味着我已经放置在相机前面的平面上,并在上面附加了以下着色器。然后,我将飞机固定在相机上。现在的问题是,着色器工作得很好,但是在我的VR设置中,它不起作用,因为我有多个摄像头,并且其中一个场景失真(如我所愿),而其他摄像头的场景正常。一切都很好,直到这两个场景相交为止。在这种情况下,我的场景不相交(如果输入的单词不正确,请原谅我)。顺便说一句,我认为与其在“相机的平面前方”使用此着色器,不如将其应用于相机本身。 我的着色器在添加到相机时不起作用,尽管它与平面对象完美结合。您能告诉我如何修改此代码以使其与相机兼容吗?除了我的解决方案外,我非常欢迎听到您的建议和想法。

Graphics.Blit
© www.soinside.com 2019 - 2024. All rights reserved.