Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

1

30.09.2004, 13:20

Textur wird falsch geladen ???

Ich habe versucht eine Textur mit Davids 2D-Methode von Seite 247 (2.15.5) zu rendern. Da wird 2D-Grafik so angezeigt, das die Projektions- und Sichtmatrix auf die Einheitsmatrix gesetzt werden. Von meiner Textur wird jedoch stets nur das Linke, obere Pixel angezeigt (Also die ganze Textur ist nur mit der Farbe dieses Pixels gefüllt). Ich suche jetzt den Fehler schon lange und eigentlich kann er nur in der D3DXCreateTextureFromFileEx()-Funktion liegen, was jedoch eher unwahrschindlich ist. Die grösse der Erstellten Textur ist 1024x1024(da liegt der Fehler also nicht). Ich schreibe hier jetzt einfach mal den Code hin und hoffe das irgendjemand so nett ist, den Fehler für mich zu sehen, denn ich komm einfach nicht drauf.

Bild-Lade-Funktion (Fehlerhandlings wurden Übersichtlichkeitshalber entfernt):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Variablen der Klasse

LPDIRECT3DTEXTURE9 Texture;     //Textur des Bildes

LPDIRECT3DDEVICE9  D3DDevice;   //Direct3D-Device

D3DSURFACE_DESC    TextureInfo; //Informationen über die Textur

D3DXIMAGE_INFO     ImageInfo;   //Informationen über das Bild

VERTEX             *Vertices;   //Vertices des Texturrechteckes


//Bild als Textur laden

D3DXCreateTextureFromFileEx(this->D3DDevice, (LPCSTR)ImageName, D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, &this->ImageInfo, NULL, &this->Texture);

//Informatinen über die Textur speichern

this->Texture->GetLevelDesc(0, &this->TextureInfo);

//Vertices berechnen

this->Vertices=(VERTEX*)malloc(4*sizeof(VERTEX));

this->Vertices[0].Position = Vector3(-0.8f, 0.8f, 0.5f);
this->Vertices[1].Position = Vector3(0.8f, 0.8f, 0.5f);
this->Vertices[2].Position = Vector3(0.8f, -0.8f, 0.5f);
this->Vertices[3].Position = Vector3(-0.8f, -0.8f, 0.5f);
this->Vertices[0].Tex0     = Vector2(0.0f, 1.0f);
this->Vertices[1].Tex0     = Vector2(1.0f, 1.0f);
this->Vertices[2].Tex0     = Vector2(1.0f, 0.0f);
this->Vertices[3].Tex0     = Vector2(0.0f, 0.0f);
this->Vertices[0].Diffuse  = Color(0.0f, 0.0f, 0.0f, 1.0f);
this->Vertices[1].Diffuse  = Color(0.0f, 0.0f, 0.0f, 1.0f);
this->Vertices[2].Diffuse  = Color(0.0f, 0.0f, 0.0f, 1.0f);
this->Vertices[3].Diffuse  = Color(0.0f, 0.0f, 0.0f, 1.0f);

this->D3DDevice ist ein gültiges Direct3D-Device
ImageName ist der Name des Bildes (Vorhandensein des Bildes geprüft!)

Render-Funktion (Fehlerhandlings wurden Übersichtlichkeitshalber entfernt):

C-/C++-Quelltext

1
2
this->D3DDevice->SetTexture(0, this->Texture);
this->D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, this->Vertices, sizeof(VERTEX));

Clear, BeginScene, EndScene und Present wurden korrekt aufgerufen!

Noch ein paar Definitionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
typedef struct _VERTEX
{
    Vector3 Position;
    Color   Diffuse;
    Vector2 Tex0;
}VERTEX;

#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)


Beleuchtung und Culling wurden ausgeschaltet, Vertexformat gesetzt, TexturStageStates: ColorOp=SELECTARG1, ColorArg1=TEXTURE (also die Diffuse Farbe ist zur Zeit noch überflüssig)

Es erscheint in der Mitte ein Rechteck in der Farbe des Pixels in der linken oberen Ecke der Textur (Position 0/0)

Ich hoffe jemand kann mir helfen...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Lurnas

Frischling

Beiträge: 78

Beruf: Schüler

  • Private Nachricht senden

2

05.10.2004, 17:02

weiß keiner Rat?
geht mal auf diese Seite (hat NICHTS mit Programmieren zu tun):

http://www.bader-porzellan.de

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

3

05.10.2004, 18:52

Doch, ich :P

Ich hab das Problem heute gelöst, aber ich verstehs nicht.

Die Diffuse Farbe muss vom Typ DWORD sein, auch wenn sie nicht benutzt wird, dann geht alles. Aber ich kann mir nicht erklären, wieso eine ganze Textur mit einer Farbe gefüllt wird, wenn ein Parameter vom falschen Typ ist, also ich versteh den Zusammenhang einfach nicht, aber ist auch egal, hauptsache es läuft jetzt :huhu:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

4

05.10.2004, 22:49

Die Antwort ist schnell erklärt:
Ob du den Wert nun benutzt oder nicht, spielt keine Rolle. Für D3D ist er da und im Vertexformat definiert. Mit dem Typ Color ist der einzelne Vertex jedoch zu groß. Deswegen liest er nun die falschen Werte für die Texturkoordinate ein.
Ich nehme an das es sich um die Color-Klasse der Tribase handelt. Die wird afaik mit dem ctor auf null gesetzt. Also hat jeder Vertex die Texturkoordinaten von 0,0 ;)


Jedes Element in einem Vertex hat nicht nur eine bestimmte Position sondern auch eine bestimmte Größe.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige