Pergunta

Não consegui obter uma geometria de cubo simples com sombreamento ativado para exibição correta.

Este é o código c#, mas os valores estão sendo passados ​​pelo SlimDX diretamente para o código C++.

            pParams.BackBufferWidth = 0;
            pParams.BackBufferHeight = 0;
            pParams.BackBufferCount = 1;
            pParams.BackBufferFormat = Format::X8R8G8B8;
            pParams.Multisample = MultisampleType::None;
            pParams.MultisampleQuality = 0;
            pParams.DeviceWindowHandle = this.Handle;
            pParams.Windowed = true;
            pParams.AutoDepthStencilFormat = Format.D24X8;
            pParams.EnableAutoDepthStencil = true;
            pParams.PresentFlags = PresentFlags.None;
            pParams.FullScreenRefreshRateInHertz = 0;
            pParams.PresentationInterval = PresentInterval.Immediate;
            pParams.SwapEffect = SwapEffect.Discard;

...são os valores na estrutura PresentParameter usada para configurar meu objeto Direct3D9Device.

Durante uma renderização, SetRenderState é chamado da seguinte forma:

        this.D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, this.BackColor, 10000.0f, 0);
        this.D3DDevice.SetRenderState(RenderState.Ambient, false);
        this.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
        this.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
        this.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.LessEqual);
        this.D3DDevice.BeginScene();

Novamente, isso é passado para o código C++, que organiza os valores em chamadas que um programador C++ não temeria.

As primitivas são vértices de cores difusas (D3DFVF_XYZ | D3DFVF_DIFFUSE).A visualização do wireframe é assim:visualização de wireframe http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

O par mais próximo de triângulos maiores é a face mais próxima de um cubo.

A visualização preenchida fica assim:visualização completa 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

Ou isto, em uma chamada de renderização subsequente:visualização completa 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

Não tenho certeza de como consertar isso.Por onde devo começar a procurar?

Editar:A matriz de projeção da câmera fica assim para um dos quadros:

{[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
  [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
  [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
  [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}

E a matriz de visualização fica assim:

camera.ViewMatrix = {[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
                      [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
                      [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
                      [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}
Foi útil?

Solução

Limpe o Z-Buffer para 1.0f e não 10000.0f.

Nos documentos Clear no SDK:

[in] Clear the depth buffer to this new z value which ranges from 0 to 1.. 

Também pode ser útil ver a matriz de projeção e as configurações da janela de visualização...

Editar:Como você constrói essa matriz de projeção?Você definiu zNear como 0 e zFar como 1.Tente definir zNear para 0,001f e zFar para 1000,0f e veja se isso ajuda em alguma coisa ...

Outras dicas

Um palpite:Tente ativar o Z-Buffer antes de limpar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top