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

1

26.02.2011, 09:49

Textur verschwommen bei transformierten Vertices

Hallo zusammen.

Ich wollte in meinem Spiel mal kurzerhand einen Ladebildschirm erstellen. Das ging auch recht flott, doch das Bild, das über den ganzen Bildschirm angezeigt werden soll, ist total verschwommen. Und das, obwohl die Auflösung des Bilds die doppelte Grösse des Bildschirms hat.

Ist das hier auch schon jemandem passiert? (z.B. beim Interface) In Breakanoid scheint es ja gut zu funktionieren.

Hier der code:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void CGame::LoadScreen() 
{ 
//Textur laden
LPDIRECT3DTEXTURE9 pTitle = tbTextureManager::Instance().GetTexture("Data\\Ladescreen.jpg"); 

//Vertex initialisieren
#define TITLE_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
struct STitleVertex 
{ 
tbVector3 cPosition;float fRHW; 
D3DCOLOR Color; 
tbVector2 vTex; 
}; 
STitleVertex aVertex[4]; 

//Szene beginnen 
tbDirect3D& D3D = tbDirect3D::Instance(); 
D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0); 
D3D->BeginScene(); 
D3D.SetFVF(TITLE_FVF); 
D3D.SetTexture(0, pTitle); 

//Die vier Vertices/Ecken erstellen 
//Links unten 
aVertex[0].cPosition = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f); 
aVertex[0].fRHW = 1.0f; 
aVertex[0].Color = tbColor(1.0f, 1.0f, 1.0f); 
aVertex[0].vTex = tbVector2(0.0f, 1.0f); 
//Links oben 
aVertex[1].cPosition = tbVector3(0.0f, 0.0f, 0.0f); 
aVertex[1].fRHW = 1.0f; 
aVertex[1].Color = tbColor(1.0f, 1.0f, 1.0f); 
aVertex[1].vTex = tbVector2(0.0f, 0.0f); 
//Rechts unten 
aVertex[2].cPosition = tbVector3(D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.5f); 
aVertex[2].fRHW = 1.0f; 
aVertex[2].Color = tbColor(1.0f, 1.0f, 1.0f); 
aVertex[2].vTex = tbVector2(1.0f, 1.0f); 
//Rechts oben 
aVertex[3].cPosition = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f); 
aVertex[3].fRHW = 1.0f; 
aVertex[3].Color = tbColor(1.0f, 1.0f, 1.0f); 
aVertex[3].vTex = tbVector2(1.0f, 0.0f); 

//Zeichnen! 
D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(STitleVertex)); 

//Szene beenden 
D3D->EndScene(); 
//Textur löschen 
tbTextureManager::Instance().ReleaseTexture(pTitle); 
//Bildpuffer sichtbar machen 
D3D->Present(NULL, NULL, NULL, NULL); 
}

2

26.02.2011, 11:07

Sieht nach falschen Texturkoordinaten aus.
Mehr Aufschluss würde ein Screenshot geben. ;)
fka tm

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.02.2011, 11:18

Ich vermute mal das liegt daran dass der Texturfilter sich einmischt. Entweder Texturefiltering abschalten oder Texturkoordinaten anpassen.

Btw: Seh ich das richtig dass du in jedem Frame die Textur neu aus der Datei lädst, einmal damit renderst und dann wieder freigibst? Wenn ja: Warum?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

26.02.2011, 12:17

Ich nehme mal an, dass der "Load(ing)Screen" nur ein einziges Mal gezeichnet wird. Nicht sehr elegant, aber zweckmäßig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

26.02.2011, 12:52

Also, ich hab herausgefunden, woran es liegt. Ich habe das Programm auf dem Laptop ausgeführt. Dieser hat ein spezielles System betreffend Grafikkarte. Solange er an einer Stromquelle angeschlossen ist, läuft er im Leistungsmodus. Unterwegs wechselt er dann in den Normalmodus. Er wechsel also den Treiber und/oder die Hardware.

Nunja, ironischerweise spinnt die Textur nur im Leistungsmodus. Manchmal übertreibt es ATI ^^

Trotzdem würde ich das Problem natürlich gern weg bekommen. Es kann ja nicht sein, dass ein Game auf manchen PCs läuft, und auf anderen nicht.

@BlueCold

Genau^^ Da die Render-Move-Schleife ja nicht weiterläuft solange die Klassen am hochfahren sind, brauche ich nicht mehr als ein Bild.

Das wirft auf jeden Fall die Frage auf, wie man denn aufwändigere Ladebildschirme (mit Animationen, evtl sogar interaktiv) erzeugt. Ausser mit Threading fiel mir bisher noch keine Lösung ein.

MfG Sydon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

26.02.2011, 12:55

Ausser mit Threading fiel mir bisher noch keine Lösung ein.

Genau da liegt auch schon die Lösung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige