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

SigTerm

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

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

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

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

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

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

我需要一劳永逸地渲染场景,因为使用图层蒙版会导致团结一致地重新计算所有灯光的投影仪阴影,因此我需要正确的阴影。

建议?

SigTerm

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

为了解决该问题,我需要使数据显式地统一写入标准着色器中的其他渲染目标中。不幸的是,这无法完成,因为没有“入口”可以“钩住”标准着色器并将其他数据写入其他颜色缓冲区。与之最接近的是“ finalcolor”修饰符,但实际上它不允许通过CG着色器写入其他缓冲区(这要求其他数据来自片段着色器,而表面着色器无法访问该片段着色器),只能修改一种颜色。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Visual Studio中安装Directx和Direct3D

来自分类Dev

如何在Direct3D 11中实现“渲染到纹理”管道?

来自分类Dev

Direct3D 11中具有不同数量图元的图形对象

来自分类Dev

OpenGL中Direct3D 11.1的与目标无关的栅格化(TIR)等效(包括扩展名)

来自分类Dev

OpenGL中Direct3D 11.1的与目标无关的栅格化(TIR)等效(包括扩展名)

来自分类Dev

OpenGL和Direct3D:从程序员的角度来看,它们代表什么?

来自分类Dev

如何在Direct3D 11中从CPU访问帧缓冲区?

来自分类Dev

在Direct3D 12应用程序中,全屏真的比窗口模式好吗?

来自分类Dev

如何在Direct3D 11中启用深度测试?

来自分类Dev

如何在Direct3D 11中从CPU访问帧缓冲区?

来自分类Dev

Direct3D 11 中附加/消耗缓冲区的视图

来自分类Dev

从Direct2D渲染目标获取Direct3D设备

来自分类Dev

Direct3D 和 DXGI 的区别

来自分类Dev

在Direct3D游戏中强制Direct3D抗锯齿?

来自分类Dev

Direct3D(v10)多个世界转换

来自分类Dev

如何使用包裹在ComPtr中的Direct3D 11指针来获取11.1接口?

来自分类Dev

如何在Windows 8中为32位应用程序启用Direct3D加速?

来自分类Dev

Direct3D 12窗口模式强制vsync

来自分类Dev

Direct3D编程的新手:11 vs 12

来自分类Dev

Direct3D纹理资源生命周期

来自分类Dev

Direct3D地图像素黑色

来自分类Dev

C ++ Direct3D多屏幕捕获

来自分类Dev

Direct3D 9.0返回到固定功能管道

来自分类Dev

Oracle Virtual Box如何启用Direct3D

来自分类Dev

Windows XP VirtualBox VM上的Direct3D加速

来自分类Dev

使用QueryInterface方法的目的是什么?(Direct3D)

来自分类Dev

为Direct3D初始化获取HWND

来自分类Dev

如何查找支持的 Direct3D 功能级别

来自分类Dev

如何在Direct3D 11中将附近的像素数据发送到Pixel-Shader?

Related 相关文章

  1. 1

    在Visual Studio中安装Directx和Direct3D

  2. 2

    如何在Direct3D 11中实现“渲染到纹理”管道?

  3. 3

    Direct3D 11中具有不同数量图元的图形对象

  4. 4

    OpenGL中Direct3D 11.1的与目标无关的栅格化(TIR)等效(包括扩展名)

  5. 5

    OpenGL中Direct3D 11.1的与目标无关的栅格化(TIR)等效(包括扩展名)

  6. 6

    OpenGL和Direct3D:从程序员的角度来看,它们代表什么?

  7. 7

    如何在Direct3D 11中从CPU访问帧缓冲区?

  8. 8

    在Direct3D 12应用程序中,全屏真的比窗口模式好吗?

  9. 9

    如何在Direct3D 11中启用深度测试?

  10. 10

    如何在Direct3D 11中从CPU访问帧缓冲区?

  11. 11

    Direct3D 11 中附加/消耗缓冲区的视图

  12. 12

    从Direct2D渲染目标获取Direct3D设备

  13. 13

    Direct3D 和 DXGI 的区别

  14. 14

    在Direct3D游戏中强制Direct3D抗锯齿?

  15. 15

    Direct3D(v10)多个世界转换

  16. 16

    如何使用包裹在ComPtr中的Direct3D 11指针来获取11.1接口?

  17. 17

    如何在Windows 8中为32位应用程序启用Direct3D加速?

  18. 18

    Direct3D 12窗口模式强制vsync

  19. 19

    Direct3D编程的新手:11 vs 12

  20. 20

    Direct3D纹理资源生命周期

  21. 21

    Direct3D地图像素黑色

  22. 22

    C ++ Direct3D多屏幕捕获

  23. 23

    Direct3D 9.0返回到固定功能管道

  24. 24

    Oracle Virtual Box如何启用Direct3D

  25. 25

    Windows XP VirtualBox VM上的Direct3D加速

  26. 26

    使用QueryInterface方法的目的是什么?(Direct3D)

  27. 27

    为Direct3D初始化获取HWND

  28. 28

    如何查找支持的 Direct3D 功能级别

  29. 29

    如何在Direct3D 11中将附近的像素数据发送到Pixel-Shader?

热门标签

归档