如何使用clip()执行alpha测试?

时间:2011-02-19 22:51:49

标签: hlsl xna-4.0

这是一个HLSL问题,但如果您想在答案中引用该框架,我正在使用XNA。

在XNA 4.0中,我们无法再访问DX9的AlphaTest功能。

我想:

  1. 将纹理渲染到后备缓冲区,仅绘制纹理的不透明像素。
  2. 渲染纹理,其纹理像素仅绘制在步骤1中未绘制不透明像素的位置。
  3. 我怎样才能做到这一点?如果我需要在HLSL中使用clip(),如何从我的HLSL代码中检查在步骤1中绘制的stencilbuffer?

    到目前为止,我已完成以下工作:

    _sparkStencil = new DepthStencilState
    {
        StencilEnable = true,
        StencilFunction = CompareFunction.GreaterEqual,
        ReferenceStencil = 254,
        DepthBufferEnable = true
    };
    
    
    DepthStencilState old = gd.DepthStencilState;
    gd.DepthStencilState = _sparkStencil;
    
    // Only opaque texels should be drawn.
    DrawTexture1();
    
    gd.DepthStencilState = old;
    
    // Texels that were rendered from texture1 should
    // prevent texels in texture 2 from appearing.
    DrawTexture2();
    

2 个答案:

答案 0 :(得分:0)

听起来你想第一次只绘制完整Alpha(1.0,255)的epsilon内的像素,而不影响第二次完整Alpha的epsilon内的像素。

我不是图形专家,我的睡眠时间太少,但您应该可以通过效果脚本文件从此处到达。

答案 1 :(得分:0)

要写入模板缓冲区,必须创建一个写入缓冲区的DepthStencilState,然后绘制要绘制到模板缓冲区的任何几何体,然后切换到使用相关CompareFunction的不同DepthStencilState。

如果要对模板缓冲区绘制哪个alpha值有一些限制,请在第一个调用中使用着色器调用clip() floor(alpha - val) - 1内在val {{1}}是(0,1)中的数字,用于限制绘制的alpha值。

我在这里写了一个更详细的答案:

Stencil testing in XNA 4