多边形绘制顺序问题

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 中您需要明确设置它们,这解决了我的问题。

【讨论】:

以上是关于多边形绘制顺序问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL VBO 绘制顺序

C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)

C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)

如何使用 EaselJS 绘制多边形?

Microsoft Blend - 绘制多边形

关于在java中绘制多边形