[ASSIMP] Problem mit Texturkoordinaten

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

[ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Hi
Ich benutze seit Kurzem ASSIMP und habe das Problem, dass die Texturen meiner importierten Modelle einfach überhaupt nicht stimmen. Hier mal ein Bild wie das ganze bei mir aussieht

http://s12b.directupload.net/file/d/186 ... wc_jpg.htm

Eigentlich müsste das so eine Art Ziegeltextur sein (in 3DS Max wird alles richtig dargestellt)
Da ich eigentlich nicht wirklich weiß wie ich die Texturkoordinaten von ASSIMP bekomme hab ich einfach das entsprechende Codestück aus dem ASSIMPVIEWER abgekupfert (hab für mich persönlich keine hilfreichen Informationen in der Dokumentation dazu gefunden)

Code: Alles auswählen

if (scene->mMeshes[i]->HasTextureCoords(0))	
   pData[j+off].Tex = D3DXVECTOR2(scene->mMeshes[i]->mTextureCoords[0][j].x, scene->mMeshes[i]->mTextureCoords[0][j].y);
Also ich geh für jedes Mesh alle Vertices durch (die j Variable) und kopier mir die Daten in meine Structure (pData)
Hat jemand irgendeine Idee wie man für jeden Vertex an die richtigen texturkoordinaten kommt? (evtl geht das ja ganz anders)

Danke schonmal im vorraus
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Aramis »

Hoi,

eigentlich machst Du alles richtig - stellt AssimpView die Textur denn richtig dar? Wenn ja würde ich vermuten, dass du beim Füllen deiner Datenstrukturen vielleicht doch irgendwo mit Deinen Zählvariablen durcheinandergekommen bist.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Zudomon »

Hallo,
Hast du in 3DSMAX denn Texturkoordinaten erstellt? Weil du ja da auch die Möglichkeit hast, direkt prozedurale Materialen (die dann 3D gemappt werden) zu erstellen. Diese würden dann in 3DSMAX korrekt aussehen, allerdings bleibt damit die Texturkoordinatengenerierung aus.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

das "witzige" ist das ASSIMPVIEW mir eigentlich nie die texturen zu meinen modellen mit anzeigt. Hab mich eigentlich durch alle Menüs geklickt um zu sehen ob man die manuell mit nachladen muss oder nicht.

Zu 3DS MAX: das muss ich nochmal kurz nachschaun wie ich das gemacht habe (sitze derzeit an einem anderen Rechner)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Die Pfade und Texturnamen in den Model-Dateien stimmen meist nicht überein mit den Namen auf Platte. Das ist ein gängiges Phänomen in praktisch allen 3Dfiles, die ich bisher so gesehen habe. Rufe in AssimpView einfach mal das Kontextmenü auf dem entsprechenden Textureintrag rechts in der Strukturansicht auf und wähle dort "Replace". Dann kannst Du die Texturdatei auswählen und die Pfade stimmen, dann müsste Deine Textur sichtbar werden.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

mhm rechts in dieser Strukturansicht (unter Display) seh ich bei AssimpView eigentlich bei all meinen objekten nur ein DefaultMaterial und darunter so ein Über Node (mit so einem N symbol) mit einem UnterNode
eine textur die ich replacen könnt ist da nicht sichtbar. Und wenn ich beim DefaultMaterial im Kontextmenü auf Add Texture... klick tut sich eigentlich absolut nichts
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Schick mir mal bitte eins von Deinen Modellen, die solche Probleme machen. thomas [bei] dreamworlds [pkt] de
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Du hast leider vergessen, die .mtl-Datei mit dazu zu schicken. Daher kann ich hier nicht beurteilen, wie die Materialien des .obj-Files aussehen. Die Texturkoordinaten des .obj-Files sind aber korrekt aus, wenn man dem Objekt mal zwangsweise ein alternatives Material überhilft.

Das 3DSMax-File hat anscheinend keine Materialien. Man kann es aber ebenso mit einem Fremdmaterial belasten, woraufhin es sich als sauber texturierte Kugel outet.

Insgesamt laden die beiden Files also korrekt. Ich vermute daher, dass Du a) eine sehr alte Assimp-Version verwendest, oder b) etwas beim Auslesen der Daten falsch machst. Du kannst die Informationen aus dem aiMesh eigentlich linear in Buffer packen und direkt rendern. Also so in der Art:

Code: Alles auswählen

- Erzeuge VertexBuffer 
- Vertex* v = Lock_VertexBuffer();
for( alle Vertizes)
{
  v[a].Pos = aiMesh->mPosition[a];
  v[a].Normal = aiMesh->mNormal[a];
  v[a].TexKoords = aiMesh->mTexCoords[0][a];
}
- Unlock_VertexBuffer();

- Erzeuge IndexBuffer
- unsigned short* i = Lock_IndexBuffer();
for( alle Flaechen)
{
  *i++ = aiMesh->mFaces[a][0];
  *i++ = aiMesh->mFaces[a][1];
  *i++ = aiMesh->mFaces[a][2];
}
- Unlock_IndexBuffer()
Mehr sollte da nicht nötig sein.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

mhm ich verwende die Assimp version 1.42 also die die auf der homepage zum download bereit steht.
Materialien lese ich zur Zeit noch gar nicht mit ein.. evtl liegt da der Fehler?

Ich lese derzeit die Position, Normalen, Tangents, und Bitangents sowie Texturkoordinaten mit ein.. und zwar eigentlich so wie dus in deinem Beispiel gezeigt hast

Code: Alles auswählen

	int j;
	int off = 0;	// offset Variable

	for(unsigned int i=0; i<scene->mNumMeshes; i++)
	{
		mBufferSize += sizeof(VertexStruct) * pMesh[i]->mNumVertices;

		// Fill the VertexBuffer with Data
		for(j=0; j < pMesh[i]->mNumVertices; j++)
		{
			pData[j+off].Pos.x = scene->mMeshes[i]->mVertices[j].x;
			pData[j+off].Pos.y = scene->mMeshes[i]->mVertices[j].y;
			pData[j+off].Pos.z = scene->mMeshes[i]->mVertices[j].z;

			if(scene->mMeshes[i]->mNormals == NULL)
				pData[j+off].Norm = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
			else
			{
				pData[j+off].Norm.x = scene->mMeshes[i]->mNormals[j].x;
				pData[j+off].Norm.y = scene->mMeshes[i]->mNormals[j].y;
				pData[j+off].Norm.z = scene->mMeshes[i]->mNormals[j].z;
			}

			if(scene->mMeshes[i]->mTangents == NULL)
				pData[j+off].Tangent = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
			else
			{
				pData[j+off].Tangent.x = scene->mMeshes[i]->mTangents[j].x;
				pData[j+off].Tangent.y = scene->mMeshes[i]->mTangents[j].y;
				pData[j+off].Tangent.z = scene->mMeshes[i]->mTangents[j].z;
			}

			if(scene->mMeshes[i]->mBitangents == NULL)
				pData[j+off].Bitangent = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
			else
			{
				pData[j+off].Bitangent.x = scene->mMeshes[i]->mBitangents[j].x;
				pData[j+off].Bitangent.y = scene->mMeshes[i]->mBitangents[j].y;
				pData[j+off].Bitangent.z = scene->mMeshes[i]->mBitangents[j].z;
			}

			if (scene->mMeshes[i]->HasTextureCoords(0))	
				pData[j+off].Tex = D3DXVECTOR2(scene->mMeshes[i]->mTextureCoords[0][j].x, scene->mMeshes[i]->mTextureCoords[0][j].y);
			else
				pData[j+off].Tex = D3DXVECTOR2(0.5f, 0.5f);
		}
		off += j;	// set new offset for Array index
	}
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Ok, das stimmt soweit. Aber übernimmst Du auch die Dreiecks-Indizes? Wenn Du die Meshes als vertexbasierte Dreieckshaufen rendern willst, darfst Du kein aiProcess_JoinIdenticalVertices angeben. In diesem Fall bekommst Du dann pro Dreieck wirklich drei Sätze Vertexdaten. Bzw. mehr, falls der Mesh auch höherwertige Polygone enthalten sollte und Du beim Import kein aiProcess_Triangulate angegeben hast. Der Standard ist aber ein Import mit aiProcess_JoinIdenticalVertices und aiProcess_Triangulate - dann bekommst Du fertig vorindizierte Vertexdaten, musst allerdings dann auch die Indizes aus aiMesh::mFaces in einen IndexBuffer umladen und den beim Rendern benutzen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

also das Triangulate hab ich mit angegeben. das JoinIdenticalVertices hab ich NICHT mehr mit angegeben. Weil wie du schon gesagt hast ich (derzeit) noch mit VertexBufefr rendere und ich mit dem Flag dann unzusammenhängende Dreiecke im Endeffekt hatte.
Es ist mir echt ein Rätsel warum das nicht funktioniert. Die Metalbox die ich dir zb geschickt habe hat bei mir eigentlich kaum eine sichtbare Textur sondern nur dieses Grau von der Textur als Farbe aber sonst eigentlich nichts von der Textur (keine Struktur etc sichtbar)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Der Metall-Quader war eine .obj-Datei. Die speichert ihre Materialien in einer separaten Datei mit .mtl-Erweiterung. Diese Datei hattest Du aber nicht mitgeschickt. Wenn Du die Datei auch nicht hast, erklärt das zum Beispiel, warum Du kein Material auf dem Quader siehst. Das ist aber immernoch ein anderes Problem als das ursprüngliche mit den falschen Texturkoordinaten. Und ehrlich gesagt bin ich langsam verwirrt, was denn genau überhaupt Dein Problem ist.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

mein problem ist das mein Objekt bei mir mit meienr Applikation so ausschaut

http://s8.directupload.net/file/d/1868/ljjxsxe8_jpg.htm


obwohl es so ausschaun müsste

http://s2.directupload.net/file/d/1868/mp3d63nf_png.htm

(object ist ein .3ds file)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Tja, das kann an vielem liegen.

a) enthält die Datei überhaupt Material-Definitionen? Kriegt man nur mit einem Programm raus, was die Datei inkl. Materialien laden kann. Daher Verweis auf AssimpView.
b) Lädt Assimp die Datei korrekt? Das ist eine knifflige Frage, ist aber bei dem 3DS-Format inzwischen mit ziemlicher Sicherheit mit "Ja" zu beantworten. Kann aber immernoch "Nein" vorkommen - nichts ist jemals perfekt. Ist nur schwer rauszukriegen.
c) Wendest Du beim Rendern die Materialdefinitionen auch an? Im einfachsten Fall ziehst Du erstmal nur den Dateinamen der Textur aus der Material-Property, lädst die Textur, und aktivierst sie vor dem entsprechenden Zeichenaufruf. Wenn Du das nicht tust, bleibt das Modell grau - Assimp ist nur eine Lade-Bibltiothek für 3D-Szenen, die Umsetzung der geladenen Daten ist Aufgabe der Engine.

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Mhm im AssimpView scheint er bei dem Modell das Material zu laden, denn es wird ind er Baumstruktur rechts eins angezeigt und man sieht auch einen unterschied wenn man auf No Material klickt
Textur ist im AssimpView allerdigns nicht zu sehen (auch kein Eintrag dafür rechts in dieser Baumstruktur)
http://s2.directupload.net/file/d/1868/2kkcebrv_jpg.htm

Beim Rendern selber mach ich derzeit eigentlich noch nichts mit Materialen. Ich lade erstmal das Modell und fülle den vertexBuffer. Danach lad ich die Textur extra (geb dazu den Pfad zur Textur noch manuell an). erzeuge mir danach eine ShaderResourceView und übergeb diese mittels SetResource meinem Shader (das ganze scheint auch zu klappen weil ich ja bei manchen Modellen Teile der Textur dann erkennen kann, nur halt toal falsch, verzerrt etc)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Grmpf. Bei "manchen" Modellen halt. Aber das sind andere Modelle als diese eine hier, von dem Du ein Bild gemacht hast. Und ich vermute stark, dass das auch getrennte Probleme sind. Bitte nicht immer zwischen den verschiedenen Baustellen hin- und herhüpfen.

Bleiben wir mal bei dieser einen Scheibe.3ds. Assimp generiert ein Dummy-Material, wenn die Datei gar kein Material enthält. Weißt Du, ob die Datei Materialien enthält? Was siehst Du, wenn Du in Deinem Programm durch den Material-Auslese-Code durchdebuggst? Kann das Programm, womit die diese Datei erzeugt hast, die auch wieder lesen? Und kommt dann auch wieder das Model mit Material raus?

Ähnliche Maßnahmen müsste man dann auch bei dem Model ausprobieren, wo Du zwar das Material gelesen bekommst, aber die Textur zerhackstückelt ist. Dazu müsste ich dann auch wissen, welches konkrete Format es ist.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

ok werd ich dann nachschauen.

Materialien hab ich bei meinem programm noch gar nicht verwendet. Auch da wo die Kugel so zerstückelt war hab ich nichts mit Materialien gemacht sondern nach erzeugen des vertexbuffers die textur seperat geladen.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Ahso, na dann sag das doch. D.h. zumindest, wir können den ganzen Materialcode erstmal außer Betracht lassen.

Wenn Du manuell die Textur setzt, und da die beiden Objekte, die Du mir geschickt hast, bei mir sauber laden und korrekte Texturkoordinaten haben, muss der Fehler also beim Befüllen der VertexBuffer oder beim Rendern sein. Oder es ist irgendein seltsamer Bug im Loader, der dann aber wie durch einen dummen Zufall dadurch korrigiert wird, dass ich beim Import grundsätzlich immer aiProcess_JoinIdenticalVertices angebe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

also beim Rendern glaub ich persönlich nicht das da der Fehler liegt. Weil da setz ich ja nur den VertexBuffer und ruf danach Draw auf

was mir irgendwie komisch vorkommt ist folgendes: Zur EInfachkeit halber hab ich wieder die metal_box.obj hergenommen (weniger Vertices)

das .obj File hat folgende Daten (Normalen hab ich heir mal weggelassen)

Code: Alles auswählen

v  -13.2647 38.1621 37.7836
v  -13.2647 32.7198 -38.3926
v  -0.3920 32.7198 -38.3926
v  -0.3920 38.1621 37.7836
v  -13.2647 44.7657 38.0777
v  -0.3920 44.7657 38.0777
v  -0.3920 39.3234 -38.0986
v  -13.2647 39.3234 -38.0986
# 8 vertices

vt 12.8727 0.0000 0.0000
vt 12.8727 24.1005 0.0000
vt 0.0000 24.1005 0.0000
vt 0.0000 0.0000 0.0000
vt 12.8727 6.5610 0.0000
vt 0.0000 6.5610 0.0000
vt 24.1005 0.0000 0.0000
vt 24.1005 6.5610 0.0000
# 8 texture coords

g Box04
usemtl wire_113135006
s 2
f 1/1/1 2/2/1 3/3/1 
f 3/3/1 4/4/1 1/1/1 
s 4
f 5/4/2 6/1/2 7/2/2 
f 7/2/2 8/3/2 5/4/2 
s 8
f 1/4/3 4/1/3 6/5/3 
f 6/5/3 5/6/3 1/4/3 
s 16
f 4/4/4 3/7/4 7/8/4 
f 7/8/4 6/6/4 4/4/4 
s 32
f 3/4/5 2/1/5 8/5/5 
f 8/5/5 7/6/5 3/4/5 
s 64
f 2/4/6 1/7/6 5/8/6 
f 5/8/6 8/6/6 2/4/6 
# 12 faces
die erste f Zeile f 1/1/1 2/2//1 3/3/1 gibt ja an das der erste Vertex die Texturkoordinate 1 erhhält, der 2 auch die erste und der dritte Vertex auch die erste Texturkoordinate (so hab ich das verstanden)

Jetzt ist es aber bei meinem Befüllen des Buffers so das der erste Vertex ausgelesen wird und in die Struktur gespeichert wird und zusätzlich die erste Texturkoordinate (x,y) zu diesem Vertex abgespeichert wird. Danach wird der Index des Struktur Arrays um 1 erhöht und der nächste Vertex ausgelesen. Am selben Platz wird jetzt die nächste Texturkoordinate ausgelesen und gespeichert (x = 12.8727 y=24,1005) Allerdings gibt die erste f Zeile im obj File ja an das der 2 Vertex auch die 1. Texturkoordinate erhalten soll!
Ich denke mal das wird der Fehler sein

Falls dies das Problem ist weiß ich allerdings nicht wie ich die 8 Texturkoordinaten dieses Objekts den richtiogen Vertices zuordnen soll. Weil in diesen Faces Zeilen ist das ganze ja ziemlich durcheinander!
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Aramis »

Weil in diesen Faces Zeilen ist das ganze ja ziemlich durcheinander!
Dafür hast Du ja Assimp, die Lib sortiert Dir alles schön fein säuberlich - Im Obj-File mehrfach referenzierte Texturkoordinaten werden intern dupliziert. Die Indices in aiFace werden stets als Offsets in die einzelnen Datenarrays (aiMesh::mVertices, mNormals, ...) ausgewertet.

Bei deinem Zylindermodell würde ich vermuten, dass 3DS-Max entweder keine brauchbaren Texturkoordinaten oder gar keinen Textureintrag exportiert hat. Wenn du mir das File schickst, kann ich es im Debugger durchgehen und nachgucken ob das tatsächlich der Fall ist. 3DS-Max korrekte UV-Koordinaten zu entlocken ist iirc nicht so einfach.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Ok ich kann zumidnest einen kleinen Teilerfolg vermelden! Die Textur ist jetzt sichtbar. Ich hab dazu "einfach" eine Zeile in meiner Vertex Struktur gelöscht und auf einmal war sie da!

Code: Alles auswählen


	struct VertexStruct
	{
		D3DXVECTOR3 Pos;
		D3DXVECTOR3 Norm;
		D3DXVECTOR3 Tangent;
		D3DXVECTOR3 Bitangent;
// hier stand D3DXVECTOR4 Color; obwohl ich im InputLayout und auch sonst keine VertexFarbe mehr verwende
		D3DXVECTOR2 Tex;
	};
Kaum war diese Zeile entfernt ist die Textur sichtbar. Für mich irgendwie nicht so recht nachvollziehbar das das der Grund war. Heir ein Bild vom cylinder.3ds Model mit der Textur

http://s4.directupload.net/file/d/1870/38w9pznk_jpg.htm


Allerdings müsste das ganze aussehen wie hier

http://s2.directupload.net/file/d/1868/mp3d63nf_png.htm

Also die Texturkacheln sind bei mir jetzt irgendwie extrem winzig. Fällt euch da evtl irgendein spezieller Grund ein? Im Shader hab ich als SamplerState

Code: Alles auswählen

SamplerState samAnistropic
{
    Filter = ANISOTROPIC;
    AddressU = Wrap;
    AddressV = Wrap;
};
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Also lag der Fehler doch beim Rendering. Wenn Du da in der Vertexstruktur vier floats für die Farbe ablegst, DirectX allerdings erzählst, dass an der Stelle zwei floats für Texturkoords lägen, dann wird DirectX wohl die ersten beiden Floats Deiner Farbe als Texturkoordinaten benutzen... und die werden wahrscheinlich immer (1, 1) oder sowas gewesen sein.

Dein neues Texturproblem sieht danach aus, wie als würdest Du noch was mit den Texturkoordinaten anstellen, bevor Du sie benutzt. Machst Du beim Füllen der VertexBuffers mit denen irgendwas anderes als das reine Umstapeln? Poste auch mal den kompletten Shader-Code, den Du für diese eine Objekt benutzt. Der Samplerstate definiert nur so Sachen wie das Verhalten beim Samplen außerhalb des (0, 1)-Koordinatenbereiches und den Filter, der hat bei dem aktuellen Problem also keine Relevanz.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Also anch dem umkopierend er Daten in meien Struktur mach ich nur mehr folgendes

Code: Alles auswählen

	D3D10_BUFFER_DESC bd;
	bd.Usage = D3D10_USAGE_DEFAULT;
	bd.ByteWidth = mBufferSize;
	bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
	bd.CPUAccessFlags = 0;
	bd.MiscFlags = 0;

	D3D10_SUBRESOURCE_DATA InitData;
	InitData.pSysMem = pData;
engine->pD3DDevice->CreateBuffer(&bd, &InitData, &pVertexBuffer)

	ePrimitiveTopology = D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST;

	//set stride and offset
	uiStride = sizeof(VertexStruct);
	uiOffset = 0;
danach die SahderResourceView von der Textur setzen, InputLayout setzen, VertexBuffer setzen, Topology setzen und dann der Draw aufruf

der Shader code:

Code: Alles auswählen

// PS_INPUT - input variables to the pixel shader
// This struct is created and fill in by the
// vertex shader

matrix World;
matrix View;
matrix Projection;
float3 view_position;

float4 g_vLightColors;
float4 g_vLightDirections;
float4 g_vLightPositions;
float  g_vLightAttenuation;
    


struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 WorldPos : TEXCOORD0;
float3 Norm : TEXCOORD1;
float3 ViewDir : TEXCOORD2;
float3 LightDir : TEXCOORD3;
float2 Tex : TEXCOORD4;
};

////// Texture Samplers
extern Texture2D baseTexture;
SamplerState samAnistropic
{
    Filter = ANISOTROPIC;
    AddressU = Wrap;
    AddressV = Wrap;
};

////////////////////////////////////////////////
// Vertex Shader - Main Function
///////////////////////////////////////////////
PS_INPUT VS(float4 Pos : POSITION, float3 Norm : NORMAL, float2 Tex :TEXCOORD)
{
PS_INPUT psInput;

psInput.Pos = mul( Pos, World );
psInput.Pos = mul( psInput.Pos, View );
psInput.Pos = mul( psInput.Pos, Projection );

// Position des Vertex in den World Space transformieren
psInput.WorldPos = mul(Pos, World);

// Normale in den World Space transformieren
psInput.Norm = normalize(mul(Norm, (float3x3)World));

// Kammera zu Licht Richtung berechnen
psInput.ViewDir = mul(view_position, (float3x3)World) - psInput.WorldPos;

psInput.LightDir = g_vLightPositions -  psInput.WorldPos;

psInput.Tex = Tex;

return psInput;
}

///////////////////////////////////////////////
// Pixel Shader
///////////////////////////////////////////////
float4 PS(PS_INPUT psInput) : SV_Target
{
	float4 baseColor = baseTexture.Sample(samAnistropic, psInput.Tex) ;


float3 LightDir_Directional = normalize(g_vLightDirections);
psInput.ViewDir = normalize(psInput.ViewDir);
float LenSq = dot( psInput.LightDir, psInput.LightDir );
psInput.LightDir = normalize(psInput.LightDir);

// Lichtdämpfung Point Light berechnen
float Attn = min(( g_vLightAttenuation * g_vLightAttenuation ) / LenSq, 1.0f);

// Lichtanteil Point Light berechnen
float4 I_Point = saturate( dot( normalize( psInput.Norm ), psInput.LightDir ) ) * Attn;

// Lichtanteil Directional berechnen
float4 I_Directional = min(saturate(dot(normalize(psInput.Norm), LightDir_Directional)), 1.0f);

// Specular Point Light Lichtanteil berechnen
float3 Reflect_Point = normalize(2 * I_Point * psInput.Norm - psInput.LightDir);
float4 Specular_Point = pow(saturate(dot(Reflect_Point, psInput.ViewDir)), 16);

// Sepcular Directional Werte berechnen
float3 Reflect_Directional = normalize(2*I_Directional*psInput.Norm-LightDir_Directional);
float4 Specular_Directional = pow(saturate(dot(Reflect_Directional, psInput.ViewDir)), 16);

// Diffuse Lichtanteil berechnen
float DiffuseAttn = clamp(0, 1, dot(psInput.Norm, g_vLightDirections));


//return mergedColor;
return g_vLightColors*baseColor*(I_Directional*(Specular_Directional+DiffuseAttn) + I_Point + Specular_Point);


}

// Define the technique
technique10 Render
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}


Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Der Shader ist ok, daher scheint die Texturskalierung nicht herzukommen. Wie sieht Deine InputDeclaration aus? Und machst Du evtl. irgendeinen Vervielfachungstrick mit der Textur? Z.b bei der View-Erstellung davon, oder beim Laden?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Zudomon »

Wird das Objekt denn bei dem Assimp Viewer jetzt korrekt angezeigt?
Falls nicht könnte ja sein, wie Schrompf schon sagt, dass die Texturkoordinaten in 3DSMAX nochmal durch eine Matrix transformiert werden. Vielleicht durch die Objektmatrix oder so.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Also Assimp View zeigt mir bei keinen meiner Modelle eine Textur mit an (In der Baumstruktur bei AssimpView fehlt so ein Eintrag auch immer, siehe Seite 1 vom thread da hab ich mal ein Screenshot davon gepostet)

Hier mein inputLayout

Code: Alles auswählen

    D3D10_INPUT_ELEMENT_DESC layout[] =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		{ "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT,	0, 24,	D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
		{ "BINORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT,	0, 36,	D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
		{ "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D10_INPUT_PER_VERTEX_DATA, 0 }
	};
Hier meine Textur Lade Methode bei der die ShaderResourceView erstellt wird (und gleich danach mittels SetResource dem shader übergeben wird)

Code: Alles auswählen

ID3D10ShaderResourceView* Texture::LoadTexture(InitD3D10** engine, wchar_t* textureName)
{
	ID3D10ShaderResourceView* pTextureRV = NULL;
	ID3D10Resource*  pResource = NULL;
	ID3D10Texture2D* pTexture = NULL;
	HRESULT hr = NULL;


	//Loads the texture into a temporary ID3D10Resource object
	hr = D3DX10CreateTextureFromFile((*engine)->pD3DDevice, textureName, NULL, NULL, &pResource, NULL);
    if(FAILED(hr))
	{
		char message[256];
		sprintf_s(message, sizeof(message), "Textur %s konnte nicht in ID3D10Resource geladen werden.", textureName);

		Globals::ShutdownEngine("Texture", message);
		return NULL;
	}

	//Translates the ID3D10Resource object into a ID3D10Texture2D object
	pResource->QueryInterface(__uuidof( ID3D10Texture2D ), (LPVOID*)&pTexture);
	if(pTexture == NULL)
	{
		char message[256];
		sprintf_s(message, sizeof(message), "Textur %s konnte nicht von ID3D10Resource nach ID3D10Texture2D konventiert werden.", textureName);

		Globals::ShutdownEngine("Texture", message);
		return NULL;
	}

    //Get the texture details
	D3D10_TEXTURE2D_DESC TexDesc;
	pTexture->GetDesc(&TexDesc);

    //Create a shader resource view of the texture
	D3D10_SHADER_RESOURCE_VIEW_DESC SRVDesc;
	ZeroMemory(&SRVDesc, sizeof(SRVDesc));
	SRVDesc.Format = TexDesc.Format;
	SRVDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
	SRVDesc.Texture2D.MipLevels = TexDesc.MipLevels;
		
	(*engine)->pD3DDevice->CreateShaderResourceView(pTexture, &SRVDesc, &pTextureRV);

	//Release allocated memory
	pResource->Release();
	pTexture->Release();

	return pTextureRV;
}
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Warum ist Dein TEXCOORD als 4 floats deklariert und nicht als zwei wie in der Vertexstruktur? Daran wird's wahrscheinlich nicht liegen, aber falsch isses trotzdem :-) genauso die speicherlecks, wenn die Texturlade-Funktion durch einen Fehler vorzeitig abbricht.

Ansonsten kann es wirklich eine Textur-Transformation in 3DSMax sein, die nicht vernünftig exportiert wurde. Immerhin ist ja auch kein Material im File angekommen, wer weiß also, was der Exporter noch alles ausgelassen hat. Hast Du bei der Konstruktion mit irgendwelchen Texturmodifikatoren gearbeitet?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
beuschl
Beiträge: 34
Registriert: 26.07.2009, 08:47

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von beuschl »

Ok thx, das mit dem InputLayout hab ich ganz übersehn! Und wegen den Speicherlecks. Ich programmier meist so das das was ich erreichen will zuerst mal richtig funktionieren soll und danach kümmer ich mich um solche Dinge dann

Der Fehler scheitn tatsächlich beim Modelieren zu liegen und nicht im programm selber. Ich habe es eben mit einem Modell aus dem Internet versucht und da war die textur nicht so extrem klein und wurde 100te mal gekachelt. Da hat eigentlich alles ziemlich richtig ausgesehn!

Ich danke aufjedenfall schonmal allen die soviel Geduld bewiesen haben und mir geholfen haben!

THX
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Zudomon »

Wird der Input im VS nicht automatisch aufgefüllt? Also wenn das Vertexformat z.B. 2 Floats für Texcoords vorsieht und im Shader aber 4 Floats als Input angegeben werden, läuft das alles trotzdem ohne Probleme. Die beiden zusätzlichen Floats sind dann ebend nicht vernünftig initialisiert.

Versuch doch mal in 3DSMAX, sofern du das nicht getan hast, deinen Zylinder mit dem UVW-Mapping in ein fertiges Mesh zu mergen. Also alle Modifikatoren zusammenführen, damit du am Ende nur noch ein normales Dreiecksnetz hast. Vielleicht klappt es ja dann.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Problem mit Texturkoordinaten

Beitrag von Schrompf »

Zudomon hat geschrieben:Wird der Input im VS nicht automatisch aufgefüllt? Also wenn das Vertexformat z.B. 2 Floats für Texcoords vorsieht und im Shader aber 4 Floats als Input angegeben werden, läuft das alles trotzdem ohne Probleme. Die beiden zusätzlichen Floats sind dann ebend nicht vernünftig initialisiert.
Äh... nein. Die Input-Deklaration beschreibt das Speicherlayout der Vertexstruktur - die MUSS stimmen, und zwar Byte für Byte. Was Du meinst, ist die Eingabestruktur im VertexShader - da kann man einzelne Elemente größer machen als angeliefert, die übrigen Elemente werden dann zu (0, 0, 0, 1) ergänzt.
Versuch doch mal in 3DSMAX, sofern du das nicht getan hast, deinen Zylinder mit dem UVW-Mapping in ein fertiges Mesh zu mergen. Also alle Modifikatoren zusammenführen, damit du am Ende nur noch ein normales Dreiecksnetz hast. Vielleicht klappt es ja dann.
Jupp, das ist bei den meisten Exportern notwendig, um eine sinnvolle Datei rauszubekommen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten