Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 10.02.2008, 11:54 Titel: HLSL: falsche Texturen bei mehreren Objektinstanzen |
|
|
Ich habe ein Shaderprogramm geschrieben, dass lediglich Lichtberechnungen (Ambient, Diffuse, Specular, Emissive) und Transformationen durchführt.
Wenn ich das Shaderprogramm auf genau eine Objektinstanz anwende, dann wird die richtige Textur zugewiesen. Sobald ich es auf mehrere Objekte anwende, dann werden die Texturen immer den falschen Objekten zugewiesen. Es gibt auch Probleme, wenn ein Objekt mehrere Texturen beinhaltet. Dann werden auch innerhalb eines einzelnen Objektes falsche Texturen zugewiesen (genau genommen wird immer nur eine einzige Textur gerendert).
Eine Renderschleife sieht bei mir in etwa folgendermaßen aus:
CPP: | pEffect->Begin(&cPasses, 0);
for(iPass=0; iPass<cPasses; iPass++)
{
pEffect->BeginPass(iPass);
// durch alle Materialien/Texturen laufen
for(int i=0;i<Obj->m_nNumMaterials;i++)
{
pEffect->SetTexture( "Textur0", Obj->GetTexture(Obj->m_lpMeshTextures[i]));
// Mesh rendern
Obj->m_lpMesh->DrawSubset(i);
}
pEffect->EndPass();
}
pEffect->End(); |
Dieser Teil wird pro Objekt bei jedem Rendervorgang aufgerufen. Dabei greife ich immer auf die gleiche Shaderdatei zu. "Technique" ist ebenfalls immer die gleiche.
An der Meshklasse liegt es bestimmt nicht, weil das Render über Fixed-function-Pipeline ganz normal funktioniert. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 10.02.2008, 15:38 Titel: |
|
|
Wie sieht das ganze denn aus, wenn du es "auf mehrere Objekte anwendest"? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Faller Junior JLI'ler
Alter: 36 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 10.02.2008, 15:42 Titel: |
|
|
Da es bei einem objekt ja richtig funktioniert.
Und ich leider keinen grossen einblick in deine struktur habe. versuche ich einfach den rest mir mal zurecht zu denken.
ist nur ein versuch wieleicht stimmt er ja
du hast ein Obj nennen wir es 1
das du erstellst dises benutzt eine Texture x
du erstellst ei weiteres Obj 2
das nutzt andere texture
da du beim rendern aber immer nur auf 1 zugreifst gibt der dier nadürlich immer x zurück und damit renderst du dann alles.
so verstehe ich bis jetze dein code.
da dieser teil eigentlich einfach zu depugen ist würde ich folgendes machen beim erstellen der texture also beim laden würde ich mir die zeiger abschreiben.
und dann prüffen ob der rückgabe zeiger der richtige ist wenn nicht muss du den fehler in der zuweisung suchen.
hoffe das ich mit meiner verndiagnose net also weit daneben liege
mfg faller _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 10.02.2008, 16:04 Titel: |
|
|
Du musst deinem Effekt doch über die veränderungen bescheid geben, dafür sollte es die Methode CommicChanges geben, die muss man verwenden wenn man innerhalb eines der Nutzung des Effekts etwas am effekt selber verändert.
Nutze die Methode mal und sage dann ob es nun besser funktioniert. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 10.02.2008, 19:54 Titel: |
|
|
Faller hat Folgendes geschrieben: | da dieser teil eigentlich einfach zu depugen ist würde ich folgendes machen beim erstellen der texture also beim laden würde ich mir die zeiger abschreiben. |
Die Texturen werden schon richtig zugewiesen...wie gesagt: ohne Shader werden die Texturen ja den Meshes und Submeshes korrokt zugewiesen.
Fallen hat Folgendes geschrieben: | Du musst deinem Effekt doch über die veränderungen bescheid geben, dafür sollte es die Methode CommicChanges geben, die muss man verwenden wenn man innerhalb eines der Nutzung des Effekts etwas am effekt selber verändert. |
Meinst du nicht eher "CommitChanges" ?
Ich hab die Methode nirgends finden können. Weder MSDN noch Google hat mir da geholfen. Könntest du mir ein Beispiel oder ein Verweis geben?
In einer Renderschleife rufe ich folgenden Block auf:
CPP: | RenderTestShader_Testobjekt(&IdleStar);
RenderTestShader_Testobjekt(&Testobjekt);
RenderTestShader_Testobjekt(&Kugel); |
Hier werden jeweils ein Zeiger einer Meshklasse übergeben, die u.a. ein Zeiger auf das Mesh selbst beinhaltet sowie Transformationsinformationen und Materialfarben.
Der Wesentliche Inhalt der Funktion habe ich ja am Anfang aufgeführt.
Die Variablen für den Shader habe ich Global definiert (vielleicht liegts daran??). Der Rest der Funktion beinhaltet nur Übergabe von Variablen an den Shader (z.B. Transformationsmatrix, Material-, Licht- und Kameravektoren). Dort sollte die Ursache aber wohl kaum liegen.
CPP: | dwShaderFlags = 0;
iPass = 0;
cPasses = 0;
pEffect->SetTechnique("BasicShader");
//Variablenübergabe an den Shader
...
for(int i=0;i<Obj->m_nNumMaterials;i++)
{
pEffect->Begin(&cPasses, 0);
for(iPass=0; iPass<cPasses; iPass++)
{
pEffect->BeginPass(iPass);
pEffect->SetTexture( "Textur0", Obj->GetTexture(Obj->m_lpMeshTextures[i]));
// Mesh rendern
Obj->m_lpMesh->DrawSubset(i);
pEffect->EndPass();
}
pEffect->End();
} |
Dieser Teil hier wird also 3mal durchlaufen Soviel ist sicher: Die Objekte haben nicht dieselbe Textur. Aber z.B. hat Objekt A die Textur von Objekt B, dann hat Objekt C die Textur von A....irgendein System hab ich da jetzt nicht gesehen
Code: | ID3DXEffect *pEffect;
LPD3DXBUFFER pBufferErrors;
DWORD dwShaderFlags;
DWORD iPass;
UINT cPasses; |
Ist es vielleicht nicht möglich, ein FX-File für mehrere Mesh-Instanzen anzuwenden, wenn man dafür nur ein globales Handle anlegt? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.02.2008, 06:42 Titel: |
|
|
Ja ich meinte CommitChanges, sry
Propagate state changes that occur inside of an active pass to the device before rendering.
ID3DXEffect::CommitChanges _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 11.02.2008, 09:47 Titel: |
|
|
Jo, sieht so aus, als würde es würde es funktionieren. Ich habe diese Funktion genau vor der Drawfunktion und nach der Texturzuweisung zwischengeschoben.
Du bist mein Held _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
|