Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 17. srpen 2007, 07:47:18 Předmět: Nastavení osvětlení DirectX |
|
|
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 |
|
|
Lando
Založen: 29. 07. 2007 Příspěvky: 33 Bydliště: Cestice
|
Zaslal: 17. srpen 2007, 09:00:10 Předmět: |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 17. srpen 2007, 09:09:29 Předmět: |
|
|
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 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š Podle mě je zde mnohem větší možnost, že Ti někdo poradí ohledně DirectX apod. než na forum.builder.cz |
|
Návrat nahoru |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 17. srpen 2007, 11:12:03 Předmět: Jeste neco? |
|
|
Diky, to bylo presne ono
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 |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 17. srpen 2007, 11:31:53 Předmět: |
|
|
Docela se divim proc nepouzijes shadery, tohle vsechno by jsi si usetril ? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 17. srpen 2007, 11:44:30 Předmět: |
|
|
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 |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 17. srpen 2007, 11:49:24 Předmět: |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 17. srpen 2007, 12:01:39 Předmět: |
|
|
Nojo, to je fakt. Jenže kdyby si aspoň otevřel DX SDK, tak už to imho mohl dávno mít |
|
Návrat nahoru |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 17. srpen 2007, 14:39:21 Předmět: njn |
|
|
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 |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 20. srpen 2007, 07:30:22 Předmět: DirectX |
|
|
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 |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 20. srpen 2007, 09:54:31 Předmět: Chyba |
|
|
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 |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 20. srpen 2007, 10:12:56 Předmět: |
|
|
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 20. srpen 2007, 10:14:20 Předmět: |
|
|
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' |
|
Návrat nahoru |
|
|
Scorpius
Založen: 16. 08. 2007 Příspěvky: 24
|
Zaslal: 20. srpen 2007, 10:28:15 Předmět: |
|
|
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 20. srpen 2007, 10:34:16 Předmět: |
|
|
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 |
|
|
|