Come faccio a impostare DirectX 9 in modo che Ignora lato posteriore è spento, z-buffering è acceso, e le opere Gouraud shading, per triangolo maglie senza dati Normali?

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

  •  21-09-2019
  •  | 
  •  

Domanda

Sto avendo difficoltà nell'identificare i parametri corretti per le PresentParameters e dispositivo DirectX, in modo che non ci può essere sia a livello di vertice Gouraud shading e l'uso di un buffer z. Alcuni triangolo maglie funzionano bene, altri hanno sfondo triangoli che appaiono di fronte a triangoli che sono più vicini e telecamera.

Un esempio di questo si trova qui: http://gallery.me.com /robert.perkins/100045/zBufferGone . I dati di input è un semplice elenco di vertici in sfaccettature. Il provvedimento di liquidazione dei vertici in ogni sfaccettatura è non deterministica (proviene da varie funzioni di esportazione di software CAD) e non ci sono dati Normali.

Gli PresentParameters sono in fase di realizzazione in questo momento come segue. Mi rendo conto che questo è il C # invece di C ++, ma penso che sia abbastanza descrittiva, ei parametri passare attraverso il codice C ++. Questo produce l'immagine nella foto; il comportamento è lo stesso sul dispositivo Riferimento:

             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;

Tutti i miei altri tentativi di impostazione, anche sul dispositivo di riferimento, restituire un codice di errore COM ({ "D3DERR_INVALIDCALL: chiamata non valido (-2.005,530516 millions)"}). Quali sono i parametri di impostazione corretti?

EDIT: La classe C ++ che si interfaccia con DirectX9 imposta i default in questo modo:

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;
}
È stato utile?

Soluzione

Da dove viene tornare a una chiamata non valida?

Edit: Sto assumendo nella nuova chiamata EngineDX9? Hai provato l'impostazione di un handle di finestra dispositivo nelle attuali parametri?

Modifica 2:? Avete acceso il debug di vomitare nel pannello di controllo DirectX per vedere se ci dice che cosa l'errore è

Edit3: Avete provato a fissare backbufferWidth e l'altezza a 0? Ciò che è backbuffercount impostato? Potrebbe anche essere la pena di provare "Format.D24S8" sul backbuffer? La sua carta di "possibili" la grafica non supporta 16 bit (improbabile però). Hai controllato nelle calotte che la modalità che si sta tentando di creare è valida? I asssume, btw, che la lingua CLR che si sta utilizzando automagicamente imposta i parametri non impostati a 0? Io, personalmente, preferisco sempre essere espliciti in questi casi ....

PS Sto indovinando qui perché im un nativo C ++ DX9 coder non un CLR SlimDX coder ...

Edit4: Sono sicuro che la sua mancanza di handle di finestra ... io sono probabilmente sbagliato ma questo è l'unica cosa che posso vedere veramente sbagliato con la configurazione. Un dispositivo DX9 finestrato richiede una finestra. Btw impostare la larghezza e l'altezza di 0 a solo utilizza la finestra si sta impostando il dispositivo troppo della dimensione ...

Edit 5: Sono stato davvero di scendere la strada sbagliata qui. Non c'è niente di sbagliato con la creazione del dispositivo che ha prodotto il dispositivo "non corretta". Non si scherza con gli attuali parametri che stanno bene. Il motivo principale avrete problemi con il Z-buffer è di impostare la funzione di confronto per sempre. Ciò significa che, indipendentemente da ciò z-buffer contiene, pas il pixel e scrivere sua z in z-buffer sovrascrivendo ciò che è già lì. Scommetto Qui sta il problema Z-buffer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top