.[ ČeskéHry.cz ].
Nastavení osvětlení DirectX
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 17. srpen 2007, 07:47:18    Předmět: Nastavení osvětlení DirectX Odpovědět s citátem

Hoj,
mam problem s nastavenim svetel, ktery se mi uz nekolik tydnu nepodari vyresit(psal jsem na builder: http://forum.builder.cz/read.php?39,2184540 hledal na google i v SDK, bezvýsledně(asi neumim hledat)) Tvořím aplikaci kde se vykresli otexturovany mesh, pod nim kruh (paprskovite trojuhelniky ze stredu kruhu) a cele by to melo byt na otexturovanem obdelniku. To je hotovo, ale problem nastava kdyz chci pridat osvetleni do tohoto prostredi. Svetla vytvorim a zapnu podle SDK, ale nic se nezmeni(mam nastavene normaly u vseho) . Scena je stejna jako bez svetel(rozdil je ze kdyz vypnu svetla tak meshi a hristi zmizi textura a zustane bili)Myslim ze problem je nastaveni device pred vykreslovanim jednotlivych casti. Zde jsou casti kodu ve kterych si myslim ze by mohla byt chyba. Cely kod je ke stazeni na vise zminene adrese na builderu.

Kde je problem? Co s tim?
Diky moc vsem.
Vytvoreni device:
kód:

public Device InitD3D()
        {
            try
            {
               
                PresentParameters presParameters = new PresentParameters();
                Device device = null;
                presParameters.Windowed = true;
                presParameters.SwapEffect = SwapEffect.Discard;
                presParameters.EnableAutoDepthStencil = true;
                presParameters.AutoDepthStencilFormat = DepthFormat.D16;
                device = new Device(0, DeviceType.Hardware, this.pictureBox,
                    CreateFlags.SoftwareVertexProcessing, presParameters);
                return device;
            }
            catch
            {
                MessageBox.Show("Došlo k chybě!", "ERROR");
                return null;
            }
        }

Fce pres kterou probiha vykreslovani:
kód:

public static void DrawScene(DB3DModelViewer viewer, List<DB3DModel> models )
        {
            Device scene = viewer.modelDevice;
            ClearDevice(scene);
            scene.BeginScene();
            SetLighting(scene, Color.Yellow);
            scene.RenderState.ZBufferEnable = true;
            scene.RenderState.Ambient = Color.DarkGray;
            DrawPlayground(viewer, texturePlayground);
            for (int i = 0; i < models.Count; i++)
            {
                if (models[i] != null)
                {
                    models[i].Draw(scene);
                    if (selectedModel == models[i])
                    {
                        DrawUnderCircle(scene, models[i]);
                        DrawUnderCircle(scene, models[i]);
                    }
                    models[i].Draw(scene);
                }
            }
            scene.EndScene();
            scene.Present();
        }


Vykreslovani "kruhu":
kód:

static public void DrawUnderCircle(Device device, DB3DModel model)
        {

            device.TextureState[0].ColorArgument1 = TextureArgument.Diffuse;
            device.RenderState.DiffuseMaterialSource = ColorSource.Color1;
            device.RenderState.AlphaBlendEnable = true;
            //device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
            device.RenderState.DiffuseMaterialSource = ColorSource.Color1;
            device.RenderState.ColorVertex = true;
            device.RenderState.Ambient = Color.Red;
            device.RenderState.AmbientMaterialSource = ColorSource.Color1;
            CustomVertex.PositionNormalColored[] vertices = new CustomVertex.PositionNormalColored[300];
            float delta = (float)(2*Math.PI/10.0f);
            float radius = model.radius / 1.8f;
            for (int i = 0; i < 300; i+=3)
            {
                vertices[i].Position = new Vector3(model.center.X, 0.0F, model.center.Z);
                vertices[i].Normal = new Vector3(model.center.X, 0.0F, model.center.Z);
                vertices[i].Color = new ColorValue(0, 0, 0).ToArgb();
                vertices[i+1].Position = new Vector3(model.center.X + (radius * (float)Math.Sin((float)(i+0)/3.0f * delta)), 0.0F,
                    model.center.Z + (radius * (float)Math.Cos((float)(i)/3.0f * delta)));
                vertices[i + 1].Normal = new Vector3(model.center.X + (radius * (float)Math.Sin((float)(i + 0) / 3.0f * delta)), 0.0F,
                   model.center.Z + (radius * (float)Math.Cos((float)(i) / 3.0f * delta)));
                vertices[i + 1].Color = new ColorValue(200, 0, 0).ToArgb();
                vertices[i + 2].Position = new Vector3(model.center.X + (radius * (float)Math.Sin((float)(i + 1) / 3.0f * delta)), 0.0F,
                    model.center.Z + (radius * (float)Math.Cos((float)(i+1) / 3.0f * delta)));
                vertices[i + 2].Normal = new Vector3(model.center.X + (radius * (float)Math.Sin((float)(i + 1) / 3.0f * delta)), 0.0F,
                    model.center.Z + (radius * (float)Math.Cos((float)(i + 1) / 3.0f * delta)));
                vertices[i + 2].Color = new ColorValue(200, 0, 0).ToArgb();
               
            }
            device.VertexFormat = CustomVertex.PositionNormalColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 100, vertices);
        }


Vykreslovani obdelniku(hriste):
kód:

static public void DrawPlayground(DB3DModelViewer viewer, Texture texture)
{
     Device device = viewer.modelDevice;
     device.Transform.World = Matrix.Identity;
     device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor | TextureArgument.Diffuse ;
      CustomVertex.PositionNormalTextured[] vertices = new CustomVertex.PositionNormalTextured[6];

       vertices[0].Position = new Vector3(-50, -0.1f, -100);
       vertices[0].Normal = new Vector3(-50, -0.1f, -100);
       vertices[0].Tu = 1; vertices[0].Tv = 1;

       vertices[1].Position = new Vector3(-50, -0.1f, +100);
       vertices[1].Normal = new Vector3(-50, -0.1f, +100);
       vertices[1].Tu = 1; vertices[1].Tv = 0;

        vertices[2].Position = new Vector3(+50, -0.1f , +100);
        vertices[2].Normal = new Vector3(+50, -0.1f, +100);
         vertices[2].Tu = 0; vertices[2].Tv = 0;

         vertices[3].Position = new Vector3(+50, -0.1f, -100);
         vertices[3].Normal = new Vector3(+50, -0.1f, -100);
         vertices[3].Tu = 0; vertices[3].Tv = 1;
       
        device.VertexFormat = CustomVertex.PositionNormalTextured.Format;
         device.SetTexture(0, texture);
         device.DrawUserPrimitives(PrimitiveType.TriangleFan, 2, vertices);

}


Fce primo pro mesh:
kód:

public void Draw(Device device)
{
        device.Transform.World = Matrix.RotationAxis(new Vector3(0, 1, 0), (float)(rotation * Math.PI / 180)) * Matrix.Translation(moveTo) *   Matrix.Scaling(sizeChange, sizeChange, sizeChange);
       device.TextureState[0].TextureCoordinateIndex = 0;
       device.TextureState[0].ResultArgument = TextureArgument.Diffuse;
       device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor | TextureArgument.Diffuse;
       device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
       device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor | TextureArgument.Diffuse;
        device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1;
        device.RenderState.AlphaBlendEnable = false;
        device.RenderState.DiffuseMaterialSource = ColorSource.Color1;
        device.RenderState.Ambient = System.Drawing.Color.Blue;
         device.RenderState.EmissiveMaterialSource = ColorSource.Color1;
         for (int i = 0; i < theMesh.NumberFaces; i++)
            {
                if (i < texture.Length)
                {
                    device.SetTexture(0, texture[i]);
                }
                else
                    device.SetTexture(0, null);
                theMesh.DrawSubset(i);
            }
        }


Naloadovani meshe:
kód:

private Mesh LoadModel(Device device, string fileName, out Texture[] texture)
        {
            device.RenderState.ZBufferEnable = false;
            device.RenderState.ZBufferWriteEnable = false;
            ExtendedMaterial[] mtrl = null;
            texture = null;
            GraphicsStream adj = null;
            Mesh docasnyMesh = Mesh.FromFile(fileName, MeshFlags.Managed, device, out adj , out mtrl);
            Mesh mesh = Mesh.Clean(CleanType.Simplification | CleanType.Optimization, docasnyMesh, adj, adj);
            mesh.OptimizeInPlace(MeshFlags.OptimizeVertexCache, adj);
            mesh.ComputeNormals(adj);
            string directory = Path.GetDirectoryName(fileName) + @"\";
            if ((mtrl != null) && (mtrl.Length > 0))
            {
                texture = new Texture[mtrl.Length];
                for (int i = 0; i < mtrl.Length; i++)
                {
                    if (File.Exists(directory + mtrl[i].TextureFilename))
                    {
                        texture[i] = TextureLoader.FromFile(device, directory + mtrl[i].TextureFilename);
                    }
                }
            }
            device.RenderState.ZBufferEnable = true;
            device.RenderState.ZBufferWriteEnable = true;
            return mesh;
        }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Lando



Založen: 29. 07. 2007
Příspěvky: 33
Bydliště: Cestice

PříspěvekZaslal: 17. srpen 2007, 09:00:10    Předmět: Odpovědět s citátem

kód:
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor | TextureArgument.Diffuse;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor | TextureArgument.Diffuse;

tohle jsem teda este nikdy nevidel a nevim jak by to melo fungovat. (to neco | necojinyho)
v tom kodu ke stazeni mas v DB3DModel.Draw
kód:
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor;

coz ti vzdycky vybere jen barvu textury. Pokud chces pouzit i svetla, mel bys vynasobit barvu textury a osvetleni
kód:
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse;
device.TextureState[0].ColorOperation = TextureOperation.Modulate;

EDIT: mohlo by se hodit pridat ke zdrojakum i ty modely, aby se to dalo vyzkouset...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 17. srpen 2007, 09:09:29    Předmět: Odpovědět s citátem

Radil jsem Ti, abys zkusil nastavit texturovací jednotky tak, aby se násobilo Texture a Diffuse. To se ale nedělá přes bitový součet, jak jsi to zkoušel Ty (nepsal Ti překladač warning, že ten enum není flags?).

Každopádně než nastavíš texturovací jednotky na ono násobení, zkusil bych nastavit je stejně jako při vykreslování kruhu, tedy nějak takto:
kód:
device.TextureState[0].ColorArgument1 = TextureArgument.Diffuse;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
device.TextureState[0].AlphaArgument1 = TextureArgument.Diffuse;
device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1;
device.TextureState[1].ColorOperation = TextureOperation.Disable;
device.TextureState[1].AlphaOperation = TextureOperation.Disable;

Hlavně nic nepřiřazuj do device.TextureState[0].ResultArgument - Ty tam přiřazuješ TextureArgument.Diffuse a přitom tam můžou být přiřazeny jen TextureArgument.Temp a TextureArgument.Current. Pro Tebe bude ideální defaultní hodnota (TextureArgument.Current), takže bych se touto property vůbec nezabýval.

Při výše popsaném nastavení bys snad měl už vidět nějaké stínování.

Když budeš chtít násobit texturu a difúzní barvu z vertex stage, tak to můžeš udělat např. takto:
kód:
device.TextureState[0].ColorArgument1 = TextureArgument.Diffuse;
device.TextureState[0].ColorArgument2 = TextureArgument.Texture;
device.TextureState[0].ColorOperation = TextureOperation.Modulate;
device.TextureState[0].AlphaArgument1 = TextureArgument.Texture;
device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1;
device.TextureState[1].ColorOperation = TextureOperation.Disable;
device.TextureState[1].AlphaOperation = TextureOperation.Disable;

Nikde ale pořád nevidím nastavení materiálu, který se používá pro výpočet osvětlení. Přesný popis výpočtu osvětlení najdeš v DirectX Documentation for C++ v kapitole Mathematics of Lighting - doporučuji nastudovat. Kdybych to měl velmi shrnout, měl bys jsi se podívat na význam těchto properties:
kód:
device.Material
device.RenderState.DiffuseMaterialSource
device.RenderState.AmbientMaterialSource
device.RenderState.EmissiveMaterialSource
device.RenderState.SpecularMaterialSource

Hlavně si v DX SDK pročti nápovědu alespoň k těmto a souvisejícím properties. Je zde totiž velká spousta možností, jak to nastavit a kdybych je měl všechny vypsat, tak bych se asi upsal Smile V tom SDK to máš velmi pěkně popsané.

P.S.: Doufám, že když jsi se tu už registroval, tak u nás na fóru zůstaneš Wink Podle mě je zde mnohem větší možnost, že Ti někdo poradí ohledně DirectX apod. než na forum.builder.cz Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 17. srpen 2007, 11:12:03    Předmět: Jeste neco? Odpovědět s citátem

Diky, to bylo presne ono Wink
Kruh uz je zase v poradku, hriste je taky vystinovany, ale s meshem je jeste problem. Nastavuju u nej material:
kód:

Material mtrl = new Material();
mtrl.Diffuse = Color.Gray;
mtrl.Emissive = Color.Gray;
mtrl.Specular = Color.Gray;
device.Material = mtrl;


Ale at nastavim jakoukoliv barvu tak ma jenom mesh nadech ty barvy, ale zadny stinovani se tam neprojevi. Chybi mi tam jeste neco? Kdyz ho nenastavim tak je mesh cerny.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 17. srpen 2007, 11:31:53    Předmět: Odpovědět s citátem

Docela se divim proc nepouzijes shadery, tohle vsechno by jsi si usetril ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 17. srpen 2007, 11:44:30    Předmět: Odpovědět s citátem

A jak jsi nastavil ty ostatní 4 properties, o kterých jsem Ti psal? A jak máš nastavený ty světla?

Manox: Ale on chce udělat úplně obyčejné osvětlení, nic extra, takže by mi to přišlo jako s kanonem na vrabce. Ve výsledku bude řešením jeho problému pár přiřazení do nějakých properties, což mi přijde pro začátečníka schůdnější než se učit novou syntaxi, ve který by pořádně asi nevěděl, co dělá. Proto mi přišlo vhodnější mu doporučit cestu fixed-function pipeline.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 17. srpen 2007, 11:49:24    Předmět: Odpovědět s citátem

Je otazka, jestli par radku pouziti shaderu a jeho samotny kod (treba podle tutorialu, zakladni osvetleni je jednoduche), by nebylo pro zacatecnika prehlednejsi nez spousta properties a ruzne nastavovani.

Kdysi jsem zkousel zapnout taky osvetleni v mdx a nakonec jsem skoncil u tech shaderu.

Diky nim si usetris to nastavovani svetla, materialu atd. A podle zakladniho tutorialu by se to melo dat zvladnout.

EDIT: a za tu dobu co pise, ze uz to resi, by to pres shadery mohl mit davno
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 17. srpen 2007, 12:01:39    Předmět: Odpovědět s citátem

Nojo, to je fakt. Jenže kdyby si aspoň otevřel DX SDK, tak už to imho mohl dávno mít Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 17. srpen 2007, 14:39:21    Předmět: njn Odpovědět s citátem

Nastaveni tech textur jsem zmenil jak jste napsal. Akorat jsem tam pridal to nastaveni Materialu.

Nastaveni svetel:
kód:

static public void SetLighting(Device device, Color color)
        {
            device.RenderState.Lighting = true;


            device.Lights[0].Type = LightType.Directional;
            device.Lights[0].Diffuse = Color.White;
            device.Lights[0].Direction = new Vector3(0, -1, -1);
            device.Lights[0].Update();
            device.Lights[0].Enabled = true;

            device.Lights[1].Type = LightType.Directional;
            device.Lights[1].Diffuse = Color.White;
            device.Lights[1].Direction = new Vector3(0, -1, +1);
            device.Lights[1].Update();
            device.Lights[1].Enabled = true;

        }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 20. srpen 2007, 07:30:22    Předmět: DirectX Odpovědět s citátem

Aha, tak chyba nebyla v nastaveni, ale ve verzi knihoven DirectX, ktery k tomu byly pridany. Pridal jsem novou verzi a meshe jsou nadherne vystinovane, ale problem je ze u jednoho modelu mam uwv texturu a jeji loading hazi v teto verzi vyjimku...

Je to obvykle chovani DirectX? Jak se spravne loaduje uwv textura (vyzaduje nejake specialni nastaveni?)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 20. srpen 2007, 09:54:31    Předmět: Chyba Odpovědět s citátem

Tak to nechapu. Vcera vecer mi fungovalo loadovani uvw textury, ale dneska rano tam pridam ty novy knihovny -> prestalo to fungovat -> vratim stary -> porad to nefunguje. Jak je to mozne? Pri tom jsem nic nemenil.

Kod na loading meshe a textury
kód:

private Mesh LoadModel(Device device, string fileName, out Texture[] texture)
        {
            device.RenderState.ZBufferEnable = false;
            device.RenderState.ZBufferWriteEnable = false;
            ExtendedMaterial[] mtrl = null;
            texture = null;
            GraphicsStream adj = null;
            Mesh docasnyMesh = Mesh.FromFile(fileName, MeshFlags.Managed, device, out adj , out mtrl);
            Mesh mesh = Mesh.Clean(CleanType.Simplification | CleanType.Optimization, docasnyMesh, adj, adj);
            mesh.OptimizeInPlace(MeshFlags.OptimizeVertexCache, adj);
            mesh.ComputeNormals(adj);
            string directory = Path.GetDirectoryName(fileName) + @"\";
            if ((mtrl != null) && (mtrl.Length > 0))
            {
                texture = new Texture[mtrl.Length];
                for (int i = 0; i < mtrl.Length; i++)
                {
                    if (File.Exists(directory + mtrl[i].TextureFilename))
                    {
                        texture[i] = TextureLoader.FromFile(device, directory + mtrl[i].TextureFilename);

                    }
                }
            }
            device.RenderState.ZBufferEnable = true;
            device.RenderState.ZBufferWriteEnable = true;
            return mesh;
        }


Na tom radku kde se loaduje textura (texture[i] = TextureLoader...) to hodi vyjimku InvalidDataException, bez blizsiho popisu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 20. srpen 2007, 10:12:56    Předmět: Odpovědět s citátem

Tak to je fakt parada... poslal jsem to kamosovi at to zkusi exe + knihovny + model s texturou... Jemu to funguje! Nechapu, proc a co s tim?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 20. srpen 2007, 10:14:20    Předmět: Odpovědět s citátem

rika se tomu debug, debug a jeste jednou debug

tim ze to sem budes psat to za tebe nikdo nevyresi - vitej do vyvojarske praxe skakani po radcich a lusteni kde to sakra muze byt

btw - podivej se do podpisu uzivatele 'nou' Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Scorpius



Založen: 16. 08. 2007
Příspěvky: 24

PříspěvekZaslal: 20. srpen 2007, 10:28:15    Předmět: Odpovědět s citátem

u me by se to debug dalo napsat asi 20x porad to debuguju, krokuju hazim breakpointy, ale proste to neni v kodu! kdyz to nebeha jen na mym PC, tak bude chyba nekde jinde
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 20. srpen 2007, 10:34:16    Předmět: Odpovědět s citátem

tak hledej - treba soubor je na spatne ceste apod.

ja rano hodinu hledal spatne poslanej parametr o 6 volani nahoru ve funkci ktera me volala

jindy stravis den hledanim uplne picoviny

ta exception by mela mit minimalne callstack tak se podivej se podivej kde to presne sleti

nema to innerexception?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna