JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=565297f67aa0a56e8faa02e68aace0b4Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

HLSL: falsche Texturen bei mehreren Objektinstanzen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 10.02.2008, 11:54    Titel: HLSL: falsche Texturen bei mehreren Objektinstanzen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 10.02.2008, 15:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Faller
Junior JLI'ler


Alter: 36
Anmeldedatum: 30.11.2006
Beiträge: 88
Wohnort: Dresden
Medaillen: Keine

BeitragVerfasst am: 10.02.2008, 15:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 10.02.2008, 16:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 10.02.2008, 19:54    Titel: Antworten mit Zitat

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 Wink 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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.02.2008, 06:42    Titel: Antworten mit Zitat

Ja ich meinte CommitChanges, sry Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 11.02.2008, 09:47    Titel: Antworten mit Zitat

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 Smile
_________________
Kein Rückzug! Kein Aufgeben!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum