opengl - unity3d,多个渲染目标 - Direct3D/OpenGl 中的不同行为

标签 opengl unity3d directx shader cg

我正在为 unity3d 编写着色器。着色器使用多个渲染目标来渲染后期处理效果。

但是,我遇到了一个有趣的问题。

当 Unity3d 在 direct3d 模式下运行时,默认情况下所有标准着色器仅将数据写入第一个颜色缓冲区(即索引为 0)。 IE。如果我将 3 个颜色缓冲区附加到相机,请调用 Camera.Render索引为 0 的颜色缓冲区将包含渲染场景,所有其他缓冲区将保持不变,除非某些着色器专门写入其中。我的着色器利用了这种行为(我使用带有索引 1 和 2 的缓冲区来积累后期处理效果所需的数据)。

但是,在 OpenGL 模式下,标准 unity3d 着色器一次写入所有颜色缓冲区。 IE。如果我将多个渲染缓冲区附加到相机,请调用 Camera.Render所有 3 个缓冲区都将包含渲染场景的副本。

这打破了我在 OpenGL 模式下的着色器。

我该如何解决?我需要一次性渲染整个场景,并且只有具有特定着色器的对象才能修改额外的颜色缓冲区。

我需要一次性渲染场景,因为使用图层蒙版会导致统一重新计算所有灯光的投影仪阴影,并且我需要正确的阴影。

建议?

最佳答案

可悲的是,事实证明“不写入渲染目标之一”是 opengl 中未记录的行为。为前向渲染路径编译时的标准统一着色器生成 gl_FragData[0] = ...;分配并只写入一个缓冲区,这会触发未记录的行为并导致困惑。

为了解决这个问题,我需要将数据明确写入标准着色器中的其他渲染目标。不幸的是,这无法完成,因为没有“入口点”可以“ Hook ”标准着色器并将附加数据写入其他颜色缓冲区。最接近的是"finalcolor"修改器,但它实际上不允许通过 CG 着色器写入额外的缓冲区(这需要来自片段着色器的额外数据,而表面着色器无法访问它),只能修改一种颜色。

我决定重写着色器的一部分(因此它不会在 OpenGL 中触发未记录的行为)并放弃在效果中使用统一阴影贴图支持。据我所知,除了修改统一引擎(需要“特殊安排”和源代码访问)或用我自己的替换整个照明系统之外,没有其他选择。

关于opengl - unity3d,多个渲染目标 - Direct3D/OpenGl 中的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30141899/

相关文章:

c# - 更改 UI RectTransform 位置

c# - Unity HTC VIVE 远距传送

.net - NSIS 脚本 - 下载 .NET 框架、DirectX

c++ - 将 DirectX 接口(interface)转换为 IUnknown 指针

c++ - Direct 2D 在内存中留下指针吗?

windows - 在 AutoIt 中捕获带窗口的 OpenGL 窗口的屏幕截图?

c++ - OpenGL 减慢 5k 点

c++ - 如何基于许多不同的整数创建多种颜色

c++ - GLFW程序不画三角形

Unity3D Sprite 不出现在游戏窗口