Darstellungsfehler
-
Ich kann seit zwei Tagen ein Problem nicht lösen, es werden offenbar ein paar Teile meines Mesh einfach nicht gerendert (Screenshot). Ein typischer Anfänger-Fehler soll culling sein, das habe ich jedoch abgestellt. Ich habe insgesamt recht wenig Code, trotzdem gelingt es mir nicht, einen Fehler auszumachen. Vielleicht sieht ein erfahrener Experte ja auf einen Blick was nicht stimmt.
private void createDevice() { this.device = new Device( 0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, createPresentParameters()); device.RenderState.CullMode = Cull.None; device.RenderState.ZBufferEnable = true; device.RenderState.Lighting = true; }(die ganzen RenderState-Proberties bewirken das selbe wie SetRenderState(CullMode, wert);)
private void loadMesh() { string path = "baum.x"; ExtendedMaterial[] materials; mesh = Mesh.FromFile(path, MeshFlags.SystemMemory, device, out materials); // Materialeigenschaften auslesen und Texturen laden meshTextures = new Texture[materials.Length]; meshMaterials = new Material[materials.Length]; for( int i = 0; i < materials.Length; ++i ) { meshMaterials[i] = materials[i].Material3D; meshTextures[i] = TextureLoader.FromFile( device, materials[i].TextureFilename, 0, 0, 1, 0, Format.A8R8G8B8, Pool.Managed, Filter.None, Filter.None, 0); } }public void render() { device.Clear( ClearFlags.Target | ClearFlags.ZBuffer, unchecked((int)0xFF404040), 1, 0 ); device.BeginScene(); setupLights(); setupMatrices(); for( int i = 0; i < meshMaterials.Length; ++i ) { device.Material = meshMaterials[i]; device.SetTexture(0, meshTextures[i]); device.TextureState[0].ColorOperation = TextureOperation.Modulate; device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor; device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse; device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1; device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor; device.RenderState.SourceBlend = Blend.SourceAlpha; device.RenderState.DestinationBlend = Blend.InvSourceAlpha; device.RenderState.AlphaBlendEnable = true; mesh.DrawSubset(i); } device.EndScene(); device.Present(); }(device.TextureState[0].Proberty bewirkt das selbe wie SetTextureStageState(0, Proberty, wert);)
-
Und wenn du mal auf Wireframe schaltest?
Bye, TGGC
-
Ich versteh nicht ganz was genau nicht geht.
Wird der Baum im "MeshView" richtig angezeigt oder ist das auch ein Fehler? (sieht irgendwie abgehackt aus)Kann kein C#, sieht aber ganz gut aus der Code. Vielleicht stimmt was mit den Matrizen nicht.
-
TGGC schrieb:
Und wenn du mal auf Wireframe schaltest?
Da fehlt auch schon die Hälfte (Screenshot).
0x00000001 schrieb:
Ich versteh nicht ganz was genau nicht geht.
Naja, wie man leicht sehen kann, fehlt ein Teil vom Baumstamm und ein paar Teile der Äste.
-
Mach nochmal den Screenshot und schaltet Alphablending füe die gesamte Szene aus. Ich denke du wirst noch ein paar zusätzliche Polygone finden, welche die Teile verdecken.
Bye, TGGC
-
Ohne Alphablending
Ehrlich gesagt, kann mein ungeschultes Auge da nichts erkennen.
IMHO sieht es aber im solid-Modus interessant aus: solid
Der Meshview zeigt nur in der Blätterdach-Textur das transparente Schwarz an, in meinem Programm scheinen direkt an den fehlenden Stellen auch noch solche Texturen zu sein. Wo könnten die her kommen?
-
Ich verstehe. Die Poly selbst sind entweder transparent, bzw. die Textur die drauf liegt, oder "doppelt" definiert (das zweite mal durchsichtig) und schneiden sich per z-fighting weg.
Bye, TGGC
-
Die Textur, die darauf liegt, ist komplett undurchsichtig. Wie kann das "doppelt definiert" zustande kommen? Der Meshviewer schafft es doch auch, den Baum zu rendern, da muss doch irgendwo ein Fehler in meinem Code sein, oder?
-
Ich habe den Fehler gefunden.
Ich habe als ColorOperation mal SelectArg1 genommen (also es wird nur die Farbe der Textur unverändert übernommen) und habe immer noch die schwarzen Stellen im Baum. Gleichzeitig gebe ich die Textur aus (was ich früher schon mit dem Sprite-Teil gemacht habe, aber da war für das Sprite-Rendering Alpha noch an). (Screenshot)
Ich hab vergessen, dass er die Textur immer auf 2er Potenzen vergrößert. Für das, was ich bisher mit D3D gemacht habe, war das nicht von belang.
-
Ok, der Baum wird jetzt perfekt gerendert. Als nächstes Bumpmapping.
Danke auch noch.