DirectX写入深度缓冲区为1,具有一定的模板测试通过区域

时间:2015-11-03 23:31:18

标签: directx

我正在3D渲染多个镜像之间的递归反射。 但在此之前,仅绘制一个镜像反射会导致深度缓冲处理问题:

以下是步骤:

绘制除镜像以外的整个场景对象。问题在于制造商。 镜子位于地板的中间,这意味着镜子后面有一部分地板。因此,在绘制镜子的反射时,镜子后面已经有了地板。当我绘制反射时,由于较小的Z值,后面绘制的反射不会覆盖地板的某些部分(它们应具有相同的Z值,但不精确的计算浮点Z可能会给出错误的数字)。所以我必须清除反射部分的深度值。准确地说,只将非遮挡镜部深度值清除为1.使用模板缓冲区很容易做到这一点。在OpenGL中,很容易做到这一点:

gLColorMask(0,0,0,0);

gLDepthRange(1,1); 

gLDepthFunc(GL_ALWAYS);

gLStencilFunc(GL_EQUAL, 1, ~0); 

glStencilOp(GL_KEEP, GL_KEEP,GL_KEEP);

drawreflections();

然后仅将非遮挡镜像绘制到值为1的深度缓冲区中。

但是在DirectX11中,我发现当自定义模板测试通过时,我无法仅绘制具有指定深度值的深度缓冲区。在那儿? (我希望我错过了它)

所以我绕过这个:首先使用模板记录模板值为1的非遮挡镜像部分。然后将整个深度缓冲区清除到最高值 - 1。然后绘制反射只通过模板测试。最后根据模板测试画出镜子。由于模板测试保持已绘制对象和镜像之间的原始深度顺序。在清除整个屏幕深度缓冲区后,即使深度信息丢失,模板缓冲区也会保留深度信息的类型:所有模板值= 1表示非遮挡镜像部分,因此不会绘制遮挡部分。

所以在这种走动的方式,它工作正常。即使有2个以上的镜子没有反射反射,它也能很好地工作。但是当我接近2+镜像递归反射时,清晰的整个深度缓冲方法不起作用。这样,我必须在递归的每个新级别创建一个新的深度缓冲区,以保存旧的深度值。只有一个深度缓冲区不能以这种方式工作。

根据DX11中的模板测试,你们知道特定区域的深度值吗?

Microsoft创建了一个最复杂的3D API,但即使OpenGL也没有这个简单的功能。我不知道为什么MS使用所有这些复杂的struct desc等来做openGL可以使用简单的2-3行来做的事情。

0 个答案:

没有答案