Seite 1 von 1

Assimp, problem mit Texturkoordinaten

Verfasst: 19.08.2010, 17:23
von Altair
Hallo,

ich hab jetzt versucht ein 3ds. Modell mit Assimp zu laden, die Vertices werden richtig geladen, aber wenn ich die Texturkoordinaten lade, wird die Textur komplett falsch angezeigt (Pixelmüll). Hier ein Foto wie es Aussieht http://img46.imageshack.us/i/ground.png/

Laden tu ich die Daten so

Code: Alles auswählen

Assimp::Importer importer;
const aiScene* Scene;

Scene = importer.ReadFile("Ground.3ds", aiProcess_MakeLeftHanded);

aiMesh* Mesh;
Mesh = *Scene->mMeshes;

int NumVertex = Mesh->mNumVertices;

Vertex* vertices = new VertexTex[NumVertex ];

for(int i = 0; i < NumVertex ; i++)
{
	           vertices[i].xyz.x = Mesh->mVertices[i].x;
	           vertices[i].xyz.z = Mesh->mVertices[i].y; // Z und Y werden vertauscht, weil das Modell sonst um 90 Grad um die X-Achste verdreht ist
	           vertices[i].xyz.y = Mesh->mVertices[i].z;

	           vertices[i].TexCoord.x = Mesh->mTextureCoords[0][i].x;
	           vertices[i].TexCoord.y = Mesh->mTextureCoords[0][i].y;
}
Ohne Texturkoordinaten wird das Modell richtig angezeigt

Vielen Dank im voraus
Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 19.08.2010, 18:13
von kimmi
Hast du in deiner vertexDescription Texturkoordinaten mit angegeben?

Gruß Kimmi

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 19.08.2010, 18:19
von Altair
Ja mach ich, lade den richtigen Shader und das Input Layout wird auch erstellt. Wenn ich ein einfaches Viereck mit einer Textur überziehe, wird auch eine Textur angezeigt. Wenn ich das Modell ohne Textur anzeige und mit einer Vertexfarbe überziehe, dann wird das Modell auch richtig angezeigt. Es wird nur wie in Foto angezeigt, sobald ich eine Textur überziehen will.

Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 19.08.2010, 19:14
von Chromanoid
sicher dass es am ladecode liegt?

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 08:17
von Schrompf
Der Ladecode scheint valide. Assimps Strukturen sind ja explizit darauf ausgelegt, dass man nur noch in den VertexBuffer rüberkopieren muss. Zeige mal bitte Deine Vertexdeklaration, den Shadercode und die "VertexTex"-Struktur

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 15:05
von Altair
Die Vertexdeklartion sieht so aus:

Code: Alles auswählen

D3D11_INPUT_ELEMENT_DESC Desc[] =
				{
					{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
					{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
				};

				unsigned int NumSize = sizeof(Desc) / sizeof(Desc[0]);

Device->CreateInputLayout(Desc, NumSize,
					Vertexshader.GetVertexBlob()->GetBufferPointer(),
					Vertexshader.GetVertexBlob()->GetBufferSize(),
					&InputLayout);

DeviceContext->IASetInputLayout(InputLayout)
Ich erstelle das Input Layout, und es sollen nur die Positon und die Texturkoordinaten in den Shader.
Der Shader sieht so aus:

Code: Alles auswählen

cbuffer ConstantBuffer : register( b0 )
{
    matrix World;
    matrix View;
    matrix Projection;
};

Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );

struct VertexPosTex
{
	float4 Pos : SV_POSITION;
	float2 TexCoord : TEXCOORD0;
};

VertexPosTex VS_POS_TEX(float4 Pos : POSITION, float2 Tex : TEXCOORD)
{
	VertexPosTex Vertex;
	Vertex.Pos = mul(Pos, World);
	Vertex.Pos = mul(Vertex.Pos, View);
	Vertex.Pos = mul(Vertex.Pos, Projection);

	Vertex.TexCoord = Tex;

	return Vertex;
}

float4 PS_POS_TEX(VertexPosTex Input) : SV_TARGET
{
	return txDiffuse.Sample(samLinear, Input.TexCoord);
}
Die Struktur sieht so aus:

Code: Alles auswählen

struct Vertex
{
Math::CVector3 xyz;
Math::CVector2 TexCoord;
};
Die Matrix Variablen in den Shader setze ich mit Hilfe von Constantbuffer, die Textur Variablen in den Shader setze ich mit den Funktionen "PSSetShaderResources" und "PSSetSamplers".
Wenn ich ein einfaches Viereck erstelle und es mit einer Textur überziehe wird die auch ganz normal angezeigt. Aber ich hab mir mal die ganzen Texturkoordinaten in eine Logdatei schreiben lassen, und da kamen für manche Werte größer 1 raus, kann das Normal sein?

Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 15:29
von Schrompf
Der Code sieht soweit ok aus. Evtl. hast Du irgendwelche groben Dummheiten in Deinen Vektorklassen drin... virtuelle Funktionen oder sowas, die das Klassen-Speicherlayout vergrößern. Das kann ich von hier aus aber nicht beurteilen. Debugge mal durch und schau, was für Wege die Werte nehmen.

Und was natürlich auch immer Schuld sein kann: der Exporter, der Müll in das File geschrieben hat, oder Assimp, das Müll aus dem File gelesen hat. Theorie 1 lässt sich überprüfen, indem man einen alternativen Viewer für das Dateiformat der Wahl sucht und schaut, was der anzeigt. Wenn das stimmt, kann es auch sein, dass Assimp Müll lädt. Das kannst Du überprüfen, indem Du das File mal im AssimpViewer lädst. Wenn dort auch Unsinn sichtbar ist, ist der Schuldige klar. Wenn AssimpView dagegen korrekt anzeigt, liegt der Fehler in Deinem Code.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 15:32
von Altair
Meine Vektorenklassen haben keine virtuellen Funktionen, aber ich werde mal mit den Assimp Viewer mal schauen ob er es normal lädt
Edit: Muss ich den Assimp Viewer selber kompilieren?

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 15:43
von Schrompf
Nein, den müsste es auch als vorkompiliertes Paket geben... schau mal auf der Sourceforge-Seite durch die Downloads.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 16:00
von Altair
Also das Modell wird angezeigt, allerdings ohne Textur, ich hab auch kein Button oder im Menüfeld ein Befehl gefunden um die Textur zu laden.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 16:08
von Schrompf
Dass Du da keine Textur siehst, ist zu erwarten. Der Texturpfad wird vom Exporter meist relativ hinterlegt und ist demzufolge von einem anderen Programm aus nicht aufzufinden. Schau mal mit nem Texteditor in die Datei, wie der Texturpfad aussieht. Oder studiere die Debugausgaben des Viewers in der rechten oberen Ecke - da müsste eine Meldung stehen, wenn ein Material eine Texturdatei benannt hatte, die nicht gefunden werden konnte. Wir wollen hier ja schließlich rauskriegen, ob die Texturkoordinaten korrekt exportiert worden, nicht ob die Materialdaten stimmen. Ich kann's nur nochmal wiederholen: man kann sich auf Materialdaten nicht verlassen. Geht nicht. Punkt.

Man kann in AssimpView irgendwie per Drag&Drop Texturdateien den Texturen zuweisen. Aber da kenne ich mich nicht so aus. Und wie gesagt: Materialdaten sind eh für den Arsch, die Texturkoordinaten sind das Wichtige.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 20.08.2010, 16:54
von Altair
Wenn ich die Textur, mit Drag&Drop wird die Textur, nur als Hintergrundbild angezeigt. Mit den Texteditor kann ich nicht reingucken, weil die Datei in Binärform ist. Kann es vielleicht sein, dass in der Modelldatei auch Indizes gespeichert sind, und ich ohne Indexbuffer render, weil ich die Daten mit Assimp so geladen habe, dass ein Vertexbuffer reicht?

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 12:45
von Altair
Sry für den Doppelpost. Ich hab mal versucht ein anderes Modell zu laden, eine Kugel und hab da eine Textur übergezogen, da wird die Textur leider auch falsch angezeigt. Könnte es wirklich daran, dass die Daten in den Datein so ausgelegt sind, dass man die mit Indices benutzen sollte?

Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 13:01
von Schrompf
Nein. Assimp spuckt per Design Daten aus, bei denen alle Daten für einen Vertex zusammenpassen, so dass man die direkt in einen Vertex- und IndexBuffer reinschreiben kann. Aber schick mir mal bitte das File, das bei Dir Probleme macht, an thomas(bei)dreamworlds(pkt)de - ich würde da gerne mal einen Blick drauf werfen.

[edit]Randbemerkung: wenn Du y und z der Position vertauschst, rotierst Du das Objekt nicht, sondern spiegelst es an einer Diagonalebene. Das bedeutet, dass es Dir auch die Flächenorientierung rumdreht. Wenn Du damit leben kannst - prima. Ansonsten würde ich aber doch eher eine Rotationsmatrix ansetzen anstatt einer Spiegelung.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 13:09
von Altair
Hab sie dir geschickt und vielen Dank für deine Hilfe :)

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 14:32
von Schrompf
Moin Altair,

AssimpView lädt die Datei korrekt. Das sieht man zwar nicht, da die Datei kein Material enthält, aber mit dem Debugger sehe ich Texturkoordinaten, die für mich valide aussehen... anscheinend hast Du in jede Richtung 4 Texturwiederholungen auf dem Mesh drauf, die Texkoords gehen von 0.0f bis knapp 4.0f. Theoretisch könnte man in AssimpView mittels Kontextmenü auf dem Material-Eintrag im Szenegraphen eine Diffuse-Textur hinzufügen, so dass Du das auch sehen kannst, aber der entsprechende Eintrag scheint nicht implementiert... tja. Das Leben ist hart.

Nach allem, was ich von der 3ds-Datei bisher gesehen habe, lädt Assimp die jedenfalls korrekt. Schau mal durch Deinen Rendercode, ob Du da was falsch machst. Oder nimm Dir PIX und steppe mal durch einen VertexShader und PixelShader, ob die Werte aus dem VertexBuffer korrekt ankommen.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 14:49
von Altair
Vielen Dank für deine Hilfe und Mühe.
Ich bin mal mit PIX durch den Vertexshader durchgegangen, und die Werte werden von Vertexbuffer nicht richtig an den Vertexshader weitergeleitet, also guck ich mir mal an was ich bei den Vertexbuffer falsch mache.

Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 21.08.2010, 16:44
von Altair
So, ich hab den Fehler gefunden, irgentwie wurde die größe des Vertexbuffers nicht richtig ausgerechnet, aber das Problem ist jetzt gelöst. Die Textur wird jetzt richtig angezeigt, nur verkerht herrum, z.B. würde Südamerika im Norden liegen und Nordamerika in Süden, aber das hab ich so gelöst, dass ich das Modell um die Z-Achse drehe.
Vielen Dank für eure Mühe und Hilfe

Mfg Altair

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 25.08.2010, 05:18
von Eisflamme
Das Modell um die z-Achse drehen klappt aber wirklich nur bei der Erde. ;)

Ich habe als v-Koordinate 1-v genommen und das funktioniert dann.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 26.08.2010, 12:49
von Krishty
Prüf mal, ob die u-Koordinate in [-1, 0] ist statt [0, 1] (das fällt bei normalem Texture-Wrapping nicht auf) – ich muss nämlich immer u = 1 + u; und v = 1 - v; rechnen. Liegt aber scheinbar nicht an Assimp.

Re: Assimp, problem mit Texturkoordinaten

Verfasst: 28.08.2010, 22:18
von Altair
Jetz klappt es auch, ohne die z-Achse zu rotieren, dankeschön :D