¿Cómo puedo configurar DirectX 9 para que el sacrificio de la cara posterior está apagado, Z-Buffer está encendido, y las obras sombreado Gouraud, por mallas de triángulos sin datos Normales?

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

  •  21-09-2019
  •  | 
  •  

Pregunta

he tenido dificultades para identificar los parámetros correctos para los PresentParameters y dispositivo DirectX, por lo que no puede ser tanto a nivel de vértice sombreado Gouraud y el uso de un tampón z. Algunos mallas de triángulos funcionan bien, otros tienen triángulos de fondo que aparece delante de triángulos que están más cerca a la cámara.

se encuentra un ejemplo de esto aquí: http://gallery.me.com /robert.perkins/100045/zBufferGone. Los datos de entrada es una simple lista de vértices en facetas. El orden de arrollamiento de los vértices en cada faceta es no determinista (proviene de varias funciones de exportación software CAD) y no hay datos de los normales.

Los PresentParameters se están creando en este momento de la siguiente manera. Comprendo que esto es C # en lugar de C ++, pero creo que es lo suficientemente descriptivo, y los parámetros a pasar por el código C ++. Esto produce la imagen en la imagen; el comportamiento es el mismo en el dispositivo de referencia:

             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 mis otros intentos de establecimiento, incluso en el dispositivo de referencia, devolverá un código de error COM ({ "D3DERR_INVALIDCALL: Llamada no válida (-2005530516)"}). ¿Cuáles son los parámetros de configuración correctos?

EDIT: La clase C ++ que interconecta con DirectX9 establece valores predeterminados como esto:

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;
}
¿Fue útil?

Solución

¿Dónde devolver una llamada no válida?

Edit: Estoy asumiendo que en la nueva convocatoria EngineDX9? ¿Usted ha intentado establecer un identificador de ventana del dispositivo en los parámetros actuales?

Edición 2:? ¿Usted ha activado la depuración vomitar en el panel de control de DirectX para ver si se le dice lo que es el error

Edit3: Usted ha intentado fijar backbufferWidth y altura a 0? Lo que está ajustado a backbuffercount? También podría ser vale la pena probar "Format.D24S8" en la backbuffer? Su tarjeta de "posibles" sus gráficos no es compatible con 16 bits (aunque poco probable). ¿Usted ha comprobado en los casquetes de que el modo en el que está tratando de crear es válida? Me asssume, por cierto, que el lenguaje CLR está utilizando automagicamente establece los parámetros no se ajustan a 0? Yo, personalmente, siempre prefiero ser explícito en estos casos ....

PS supongo aquí porque im un codificador C ++ DX9 nativa no es un codificador CLR SlimDX ...

Edit4: Estoy seguro de que su falta de identificador de ventana ... probablemente estoy equivocado, pero eso es lo único que puedo ver realmente mal con su configuración. Un dispositivo DX9 de ventana requiere una ventana. establecer cierto ancho y la altura de 0 a sólo tiene que utilizar la ventana va a configurar el dispositivo de tamaño demasiado ...

Editar 5: Realmente he estado recorriendo el camino equivocado aquí. No hay nada malo con la creación del dispositivo que produce el dispositivo "incorrecto". No se metan con los actuales parámetros están bien. La razón principal por la que tendrá problemas con su Z-Buffering es que se establece la función de comparación para siempre. Esto significa que, independientemente de lo que el z-buffer contiene, pas del píxel y escribir su z en el zbuffer sobrescribir lo que ya está ahí. Apostaría en esto consiste su problema amortiguadoras Z.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top