Проблема с порядком рисования многоугольника - PullRequest
1 голос
/ 10 июля 2020

Я работаю над программным обеспечением, и мне бы хотелось перенести API рендеринга с SlimDX на SharpDX. Я сделал это, но заметил, что многоугольник solid отображается неправильно, т.е. даже если многоугольник находится на задней стороне другого многоугольника, его часть видна, а также часть многоугольника l ie внутри ландшафта. это тоже видно. Ниже для справки приведены изображения реализации SlimDX и SharpDX:

enter image description here

введите описание изображения здесь

Я попытался установить 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 Ответ

0 голосов
/ 12 августа 2020

После долгой отладки и понимания кода я обнаружил, что код рендеринга был правильным, но при создании окна просмотра устройства я забыл установить его минимальную и максимальную глубину. В SlimDX они установлены по умолчанию, но в SharpDX вам нужно установить их явно, это решает мою проблему.

...