这是一个HLSL问题,但如果您想在答案中引用该框架,我正在使用XNA。
在XNA 4.0中,我们无法再访问DX9的AlphaTest功能。
我想:
我怎样才能做到这一点?如果我需要在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();
答案 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值。
我在这里写了一个更详细的答案: