1

我找不到任何有关深度缓冲区及其工作原理的有用信息。我知道你可以打开和关闭它,但是否可以在着色器运行时,在 PiexelShaderFunction 中做到这一点?何时发生削波?在像素着色器开始之前?如果我想在 PiexelShaderFunction 中跟踪剪切事件并在它发生时做些什么呢?

理想情况下,我需要以下系统:

    PixelShaderFunction
    {
    //... some code.
    if (clipping)
        return (0,0,value1,value2);
    else
        return(value1,value2,0,0);
    }

我从头顶想到的是:

    PixelShaderFunction
    {
    //... some code.
    if (value1%2 == 0)
        return (0,0,value1,value2);
    else
        return(value1,value2,0,0);
    }

这给了我 50% 的精度并且是一个不错的选择,但是我不得不绘制我的场景两次,因为我需要先关闭深度模板然后再打开模板来绘制它。如果我至少可以在运行时在 PiexelShaderFunction 上打开和关闭它,那将有很大帮助,并不是说我仍然需要知道是否发生了剪切。

编辑:我刚刚读到“写入掩码控制将哪些数据写入渲染目标。输出写入掩码控制按渲染目标、按组件级别将哪些数据写入渲染目标。” 这是否意味着我可以指定我拥有的几个渲染目标中的哪些可以使用深度缓冲区,哪些不能?如果是,我该如何在 XNA 中做到这一点?

更多: Stencil Buffer 究竟是如何填充的,你又如何控制它?它如何影响深度缓冲区?如果有人有示例链接,请给我!MSDN 太少了!

4

1 回答 1

0

如图形管道深度测试的文档中所述,在像素着色器之后应用。但是有一种称为 early-z-rejection ( source ) 的技术,它在像素着色器之前执行深度检查。总而言之,您无法直接确定片段是否在像素着色器中被剔除。

我想到了两种解决方法:

  1. 将深度预传递渲染到渲染目标中。您可以在渲染时使用此纹理来确定像素着色器中的深度。

  2. 渲染几何图形两次,一次使用正常深度函数,另一次使用反向深度函数 ( D3DRS_ZFUNC( doc ))。您只需要根据您正在渲染的步骤更改像素着色器中的颜色。

于 2013-07-26T08:27:48.173 回答