多边形绘制顺序问题
Polygon draw order issue
我正在开发一个软件,我想将渲染 API 从 SlimDX 移动到 SharpDX。我已经这样做了,但我注意到实心多边形没有正确绘制,即,即使多边形位于另一个多边形的背面,它的一部分是可见的,多边形的一部分也位于同样可见的地形内部。以下是 SlimDX 实现和 SharpDX 实现的图片供参考:
我尝试设置 Stencil 和 ZBuffer,但没有按预期工作。我已经对其应用了 DepthBias,它在 SlimDX 上运行良好,但在 SharpDX 上运行良好。
如果我遗漏了什么或做错了什么,请告诉我。
更新 1:
// set the render state to device
device.SetRenderState(RenderState.AlphaTestEnable,
true);
device.SetRenderState(RenderState.AlphaBlendEnable,
true);
device.SetRenderState(RenderState.SourceBlend,
Blend.SourceAlpha);
device.SetRenderState(RenderState.SeparateAlphaBlendEnable,
true);
device.SetRenderState(RenderState.DestinationBlendAlpha,
Blend.One);
device.SetRenderState(RenderState.SourceBlendAlpha,
Blend.InverseDestinationAlpha);
// set the render state to the device
device.SetRenderState(RenderState.DepthBias,
-1E-06f);
this.effectVectoring.Begin(FX.None);
// binds the vertex buffer to device data stream
device.SetStreamSource(0,
this.vertexBuffer,
dataGeometry.FillVertexOffset,
stride);
// pass 1 to shader as a pass if it is 3D mode else 0
this.effectVectoring.BeginPass(is3D ? 1 : 0);
// renders the non-index geometric primitives using the data from current input stream
device.DrawPrimitives(SharpDX.Direct3D9.PrimitiveType.TriangleList,
0,
primitiveCount);
// end the pass
this.effectVectoring.EndPass();
this.effectVectoring.End();
device.SetRenderState(RenderState.AlphaBlendEnable,
false);
device.SetRenderState(RenderState.AlphaTestEnable,
false);
device.SetRenderState(RenderState.DepthBias,
0);
device.SetRenderState(RenderState.FillMode,
FillMode.Solid);
device.SetRenderState(RenderState.SeparateAlphaBlendEnable,
false);
经过多次调试和理解代码后,我发现渲染代码是正确的,但是在创建设备的视口时我忘记设置它的最小和最大深度。在 SlimDX 中,它们是默认设置的,但在 SharpDX 中,您需要明确设置它们,这解决了我的问题。
我正在开发一个软件,我想将渲染 API 从 SlimDX 移动到 SharpDX。我已经这样做了,但我注意到实心多边形没有正确绘制,即,即使多边形位于另一个多边形的背面,它的一部分是可见的,多边形的一部分也位于同样可见的地形内部。以下是 SlimDX 实现和 SharpDX 实现的图片供参考:
我尝试设置 Stencil 和 ZBuffer,但没有按预期工作。我已经对其应用了 DepthBias,它在 SlimDX 上运行良好,但在 SharpDX 上运行良好。
如果我遗漏了什么或做错了什么,请告诉我。
更新 1:
// set the render state to device
device.SetRenderState(RenderState.AlphaTestEnable,
true);
device.SetRenderState(RenderState.AlphaBlendEnable,
true);
device.SetRenderState(RenderState.SourceBlend,
Blend.SourceAlpha);
device.SetRenderState(RenderState.SeparateAlphaBlendEnable,
true);
device.SetRenderState(RenderState.DestinationBlendAlpha,
Blend.One);
device.SetRenderState(RenderState.SourceBlendAlpha,
Blend.InverseDestinationAlpha);
// set the render state to the device
device.SetRenderState(RenderState.DepthBias,
-1E-06f);
this.effectVectoring.Begin(FX.None);
// binds the vertex buffer to device data stream
device.SetStreamSource(0,
this.vertexBuffer,
dataGeometry.FillVertexOffset,
stride);
// pass 1 to shader as a pass if it is 3D mode else 0
this.effectVectoring.BeginPass(is3D ? 1 : 0);
// renders the non-index geometric primitives using the data from current input stream
device.DrawPrimitives(SharpDX.Direct3D9.PrimitiveType.TriangleList,
0,
primitiveCount);
// end the pass
this.effectVectoring.EndPass();
this.effectVectoring.End();
device.SetRenderState(RenderState.AlphaBlendEnable,
false);
device.SetRenderState(RenderState.AlphaTestEnable,
false);
device.SetRenderState(RenderState.DepthBias,
0);
device.SetRenderState(RenderState.FillMode,
FillMode.Solid);
device.SetRenderState(RenderState.SeparateAlphaBlendEnable,
false);
经过多次调试和理解代码后,我发现渲染代码是正确的,但是在创建设备的视口时我忘记设置它的最小和最大深度。在 SlimDX 中,它们是默认设置的,但在 SharpDX 中,您需要明确设置它们,这解决了我的问题。