Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unity3d,多个渲染目标-Direct3D/OpenGl中的不同行为_Opengl_Unity3d_Directx_Shader_Cg - Fatal编程技术网

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

unity3d,多个渲染目标-Direct3D/OpenGl中的不同行为,opengl,unity3d,directx,shader,cg,Opengl,Unity3d,Directx,Shader,Cg,我正在为unity3d编写着色器。着色器使用多个渲染目标渲染后期处理效果 然而,我遇到了一个有趣的问题 当Unity3d在direct3d模式下运行时,默认情况下,所有标准着色器仅将数据写入第一个颜色缓冲区(即索引为0)。也就是说,如果我将3个颜色缓冲区附加到摄影机,请调用camera.Rendercolor buffer,索引为0的颜色缓冲区将包含渲染场景,并且所有其他缓冲区将保持不变,除非某些着色器专门在其中写入。我的着色器利用了这种行为(我使用索引为1和2的缓冲区来积累后期处理效果所需的数

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

然而,我遇到了一个有趣的问题

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

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

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

我怎样才能解决这个问题?我需要一次性渲染整个场景,并且只有具有特定着色器的对象才能修改其他颜色缓冲区

我需要一次性渲染场景,因为使用层遮罩会导致unity重新计算所有灯光的投影阴影,我需要阴影正确

建议?

遗憾的是,“不写入渲染目标”在opengl中是未记录的行为。为正向渲染路径编译时,标准unity着色器会生成
gl_FragData[0]=赋值并只写入一个缓冲区,这会触发未记录的行为并导致混乱

为了解决这个问题,我需要让unity将数据显式写入标准着色器中的其他渲染目标。不幸的是,这无法做到,因为没有“入口点”来“钩住”标准着色器并将其他数据写入其他颜色缓冲区。最接近这一点的是修改器,但它实际上不允许通过CG着色器写入额外的缓冲区(这需要来自片段着色器的额外数据,这是曲面着色器无法访问的),只能修改一种颜色


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

您尝试过手动操作相机上的命令缓冲区吗@马克西扬科夫:不,如果你说得更具体一点会有帮助的。我看到我可以在那里插入额外的命令,但我不确定我应该如何处理缓冲区。我不记得D3D/OGL文档是否在任何地方默认了MRT行为。基本上,在D3D上,如果着色器只写入第一个缓冲区,则第二个缓冲区将保持不变。在OGL上,他们从第一个缓冲区接收信息副本。这是标准的unity着色器。我希望我能更具体一些,但我认为我在这方面没有足够的经验。但是,如果我有这个问题,我会在这里深入研究。@MaxYankov:我的意思是,我不知道任何gl命令会改变额外颜色缓冲区的默认行为。@MaxYankov::-\n好的。我明天会检查GL规范,但不知怎的,我怀疑我是否能找到有用的东西。问题是,统一并不能让我精确地控制渲染的内容、时间和方式。所以,如果我开始使用层,它会重新计算所有可见光的阴影贴图,这会导致阴影消失。如果替换着色器允许我指定使用默认着色器绘制某些对象,则替换着色器可以工作。当然,unity personal中的
Camera.Render
没有可用的源代码。唉。