Como configuro o DirectX 9 para que o abate de backface esteja desligado, o Z-Buffering está ligado e o sombreamento de Gouraud funciona, para malhas de triângulo sem dados normais?

StackOverflow https://stackoverflow.com/questions/2082065

  •  21-09-2019
  •  | 
  •  

Pergunta

Estou tendo dificuldade em identificar os parâmetros corretos para o dispositivo PresentParameters e DirectX, para que possa haver sombreamento de Gouraud no nível do vértice e o uso do buffer AZ. Algumas malhas de triângulo funcionam bem, outras têm triângulos de fundo aparecendo em frente aos triângulos que estão mais próximos da câmera.

Um exemplo disso é encontrado aqui: http://gallery.me.com/robert.perkins/100045/zbuffergone. Os dados de entrada são uma lista simples de vértices em facetas. A ordem de enrolamento dos vértices em cada faceta não é determinística (vem de várias funções de exportação de software CAD) e não há dados normais.

Os parâmetros presentes estão sendo configurados agora da seguinte forma. Sei que isso é C# em vez de C ++, mas acho descritivo o suficiente, e os parâmetros passam para o código C ++. Isso produz a imagem na imagem; O comportamento é o mesmo no dispositivo de referência:

             pParams = new PresentParameters()
                    {
                        BackBufferWidth = this.ClientSize.Width,
                        BackBufferHeight = this.ClientSize.Height,
                        AutoDepthStencilFormat = Format.D16,
                        EnableAutoDepthStencil = true,
                        SwapEffect = SwapEffect.Discard,
                        Windowed = true
                    };
            _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);

            _engineDX9.DefaultCamera.NearPlane = 0;
            _engineDX9.DefaultCamera.FarPlane = 10;
            _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
            _engineDX9.BackColor = Color.White;
            _engineDX9.FillMode = FillMode.Solid;
            _engineDX9.CullMode = Cull.None;

            _engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;

Todas as minhas outras tentativas de configuração, mesmo no dispositivo de referência, retornem um código de erro COM ({"d3derr_invalidcall: chamada inválida (-2005530516)"}). Quais são os parâmetros de configuração corretos?

Editar: a classe C ++ que interfina com o DirectX9 Define padrões como este:

PresentParameters::PresentParameters()
{
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    BackBufferFormat = Format::X8R8G8B8;
    BackBufferCount = 1;

    Multisample = MultisampleType::None;
    MultisampleQuality = 0;

    SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
    DeviceWindowHandle = IntPtr::Zero;
    Windowed = true;
    EnableAutoDepthStencil = true;
    AutoDepthStencilFormat = Format::D24X8;
    PresentFlags = SlimDX::Direct3D9::PresentFlags::None;

    FullScreenRefreshRateInHertz = 0;
    PresentationInterval = PresentInterval::Immediate;
}
Foi útil?

Solução

Onde ele retorna uma chamada inválida?

EDIT: Estou assumindo na nova chamada Enginedx9? Você já tentou definir uma alça de janela de dispositivo nos parâmetros atuais?

EDIT 2: Você ligou a variação de depuração no painel de controle DirectX para ver se ele diz qual é o erro?

Edit3: Você tentou definir largura de backbuffer e altura para 0? O que está de acordo com o BackBufferCount? Também pode valer a pena tentar "formato.d24s8" no backbuffer? Sua placa de gráfico "possível" não suporta 16 bits (improvável). Você verificou as tampas que o modo que você está tentando criar é válido? Eu assume, btw, que o idioma CLR que você está usando define automaticamente os parâmetros que você não define como 0? Eu, pessoalmente, sempre prefiro ser explícito nesses casos ....

PS Estou supondo aqui porque sou um codificador nativo C ++ DX9, não um codificador Slimdx CLR ...

EDIT4: Tenho certeza de que é a falta de identificação da janela ... provavelmente estou errado, mas essa é a única coisa que posso ver realmente errada com sua configuração. Um dispositivo DX9 com janela requer uma janela. BTW Definir largura e altura para 0 Para usar a janela que você está definindo o tamanho do dispositivo também ...

EDIT 5: Eu realmente tenho seguido o caminho errado aqui. Não há nada de errado com a criação do dispositivo que produziu seu dispositivo "incorreto". Não mexa com os atuais parâmetros, eles estão bem. A principal razão pela qual você terá problemas com o seu buffer Z é que você define a função de comparação sempre. Isso significa que, independentemente do que o Z-Buffer contém, passa o pixel e escreva seu z no Z-buffer sobrescrevendo o que já existe lá. Eu a apostaria nela reside seu problema de buffer de Z.

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