多边形绘制顺序问题
Posted
技术标签:
【中文标题】多边形绘制顺序问题【英文标题】:Polygon draw order issue 【发布时间】:2020-07-10 10:44:29 【问题描述】:我正在开发一个软件,我想将渲染 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);
【问题讨论】:
【参考方案1】:经过大量调试和理解代码后,我发现渲染代码是正确的,但是在创建设备的视口时,我忘记设置它的最小和最大深度。在 SlimDX 中它们是默认设置的,但在 SharpDX 中您需要明确设置它们,这解决了我的问题。
【讨论】:
以上是关于多边形绘制顺序问题的主要内容,如果未能解决你的问题,请参考以下文章
C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)
C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)