SDL/OpenGL/Textur

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

SDL/OpenGL/Textur

Beitrag von 475 »

Hallo Gemeinde,

leider schaffe ich es einfach nicht eine Textur mehrfach auf eine Oberfläche zu zeichnen. Die Textur wird immer gestreckt.

Hier der Code:

Code: Alles auswählen

SDL_Surface		*pngImage;
GLuint			texid;

pngImage = IMG_Load(filename);
glGenTextures(1, &texid);
glBindTexture(GL_TEXTURE_2D, texid);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pngImage->w, pngImage->h, 0, GL_RGB, GL_UNSIGNED_BYTE, pngImage->pixels);
SDL_FreeSurface(pngImage);

....

glEnable(GL_TEXTURE_2D);
GLint		w, h;

glBindTexture(GL_TEXTURE_2D, texid);

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);

GLboolean resident;
if (!glAreTexturesResident(1, &texid, &resident))
	printf("[E] TexturID %i was not loaded\n", texid);

glBegin(GL_QUADS);
	glColor4f(r1,g1,b1,a1);
	glTexCoord2f(0,1);glVertex3f(x1,y1,z1);
	glColor4f(r2,g2,b2,a2);
	glTexCoord2f(1,1);glVertex3f(x2,y2,z2);
	glColor4f(r3,g3,b3,a3);
	glTexCoord2f(1,0);glVertex3f(x3,y3,z3);
	glColor4f(r4,g4,b4,a4);
	glTexCoord2f(0,0);glVertex3f(x4,y4,z4);
glEnd();
glDisable(GL_TEXTURE_2D);
Ich hoffe einer von euch findet den Fehler. Ich suche schon ziemlich lange, aber ich komme einfach nicht dahinter.

Danke.
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Das "glColor4f(r1,g1,b1,a1);" ist unnoetig, da du eine Textur hast.
"glTexCoord2f(0,1);"
Diese beiden Parameter geben das Verhaeltnis der Texturdimension zur Dimension der Flaeche an.
Also sprich, moechtest Du, dass die Textur 4 mal auf der Flaeche gemappt wird, sollte das so aussehen:

Code: Alles auswählen

glBegin(GL_QUADS);
glTexCoord2f(0,2);glVertex3f(x1,y1,z1);
glTexCoord2f(2,2);glVertex3f(x2,y2,z2);
glTexCoord2f(2,0);glVertex3f(x3,y3,z3);
glTexCoord2f(0,0);glVertex3f(x4,y4,z4);
glEnd();
Gruß ....
Zuletzt geändert von joggel am 05.02.2011, 10:41, insgesamt 1-mal geändert.
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Super danke dir.

Die glColor4f habe ich gemacht, damit ich die Textur einfärben kann.


Gibt es eine Möglichkeit wie ich errechnen kann, wie oft er für ein Quad mappen muss? Das Quad hat ja Float werte und die Textur Pixel.
Wenn der Quad also 100 Pixel breit ist, sollte die Textur, wenn sie 10 Pixel hat, 10x gemappt werden.
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Das ist egal, ob es float ist.
Egal wie gross das Quad ist, egal wie gross die Textur ist.
Gib einfach ueber die Texturkoordinaten an, wie oft du es mappen möchtest.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: SDL/OpenGL/Textur

Beitrag von Sternmull »

Die Textur wird immer auf den quadratischen Bereich der Texturkoordinaten zwischen (0,0) und (1,1) abgebiltet, kommt da drin also genau ein mal vor. Außerhalb dieses Bereiches hängt es davon ab ob GL_CLAMP oder GL_REPEAT gesetzt wurde, bei dir wird sie dort also wiederholt. Zeichnest du nun ein Quad und gibst ihm die Texturkoordinaten (0,0) und (5,1), so wird die Textur 5 mal in X-Richtung wiederholt dargestellt, damit das nicht gestreckt oder gestaucht ist, muss das Quad das gleiche Seitenverhältnis haben.
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Entschuldigung, aber ich habe mich glaube ich nicht richtig ausgedrückt:
Ich weiß nicht, wie oft ich mappen muss, damit die Textur am Bildschirm die exakte größe der Png hat. Hat der Quader also eine Breite von 100 Pixeln, soll 10x, bei 20 nur 2x gemappt werden. Aber woher weiß ich, wieviel Pixel 0.5f z.B. entspricht?
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Also, du möchtest 1 mal das Bild (png) auf das Quad abbilden?
Dann nimm Texturkoordinaten (0,0) und (1,1).

Meinst du das?

[Edit]
Achso, ich verstehe glaube ich.
Du müsstest das Quad skalieren.
Ja, du setzt die Groesse des Quads auf (1,1) und skalierst auf die größe der PNG.
Ab besten noch die orthogonale Projektion einschalten, Frustum auf die skalierte Groesse setzen.... *denke ich*

Aber irgendwie erschliest sich mir nicht der Sinn was Du vorhast.
Vlt. kannst Du kurz das erklären...
Zuletzt geändert von joggel am 05.02.2011, 11:03, insgesamt 2-mal geändert.
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Nein, ich möchte die Textur so oft draufmappen, wie der Quader groß ist.

Also Quaderlänge = 0.1f (sagen wir das entspricht 100 Pixel) und die Textur hat 10 Pixel, dann soll 10x gemappt werden.
Ist die Quaderlänge 200 Pixel, dann 20x mappen. Jedoch weiß ich nur die x.xf breite, nicht aber die Pixel um das zu errechnen.

[EDIT]
So in der Richtung meine ich:
num_repeat_x = breite_quad / breite_textur

Folgendes habe ich vor:
Ich habe z.B. eine Hauswände unterschiedlicher größe. Nun will ich eine Textur drauf legen, welche sich wiederholt (Backsteine). Aber da die größe der Wände unterschiedlich ist, kann ich nicht fest angeben, wie oft er wiederholen soll.
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Ahh, ich verstehe.

Okay, dann würde ich da wie folgt vorgehen:
Du legst einfach mal fest, wie groß deine Mauer sein soll, um die Textur genau 1mal zu mappen.
Also, bspw.: 200,200 ==> Texturkoordinaten (1,1).
bei Mauer (400,200) ==> Texturkoordinaten (2,1).

Also num_x_repeat = mauer_width/200 . Die 200 is eben diese Breite, wo genau 1mal gemappt wird.
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Bei der Textur weiß ich die Pixelbreite, jedoch bei der Mauer nur die "1.0f" koordinaten. Wie kann ich errechnen, wieviel Pixel diese "1.0f" sind?

Du empfielst also statt einem Quader mehrere zu machen mit je 1er Textur?
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Es ist ja auch egal, wie gross deine Textur is...
Das is doch sch**** egal!

Ja, man kann die Pixelbreite der Mauer errechnen, frag mich jetzt aber nicht genau wie, da ich auch denke, dass das für das Problem keine Rolle spielt.
Und nein, ich denke du kannst das auch mit eben nur einem Quad machen....
Und wieso sind wir jetzt bei Quader...?

*ich bin verwirrt*
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Quad meinte ich entschuldigung :)

Nunja, ich will eben dass die Textur nicht "verwaschen" aussieht wenn man nahe hingeht, desswegen wollte ich diese so oft drauflegen wie es geht, ohne zu strecken/stauchen.
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Ahhhh, okay.
Dann nimm Texturkoordinaten (1000,1000) ... oder so!!

Oder nimm Texturen mit verschiedener Auflösung... je nach dem wie nah du Dich an der Mauer befindest.
Google mal nach Megatexturen oder Virtual Texture.

Aber ... naja.

Troll?
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Warum Troll?
Aber ich werde nach Megatexturen und Virtual Texture googeln.

[EDIT]
Was will ich mit so großen Texturen?
Warum 1000,1000 nehmen?
Und vor allem wozu mehr Texturen als nötig?

Es muss doch irgendwie möglich sein, eine Textur ohne großen Aufwand mehrfach perfekt draufzulegen.
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Sorry, kein Troll.

Aber um eine Textur mehrfach draufzulegen, verwendet man die Texturkoordinaten dazu, wie oben gesagt.
Das die dann "verwaschen" aussehen, liegt daran, das sie dann hoch-skaliert werden, und dabei an Qualität verlieren.
Du könntest zum Beispiel sehr große Texturen verwenden, dadurch ist die Qualität eben besser, wenn du nah an der Mauer stehst.
Nachteil: Große Texturen verbraucne mehr Speicher.
Deswegen: Mega oder Virtualtexturen... aber da habe ich nicht so die Ahnung, weiß nur, das man damit sehr gute Auflösungen hinbekommt.

Du musst dich wahrscheinlich damit abfinden, dass die Texturen verschwommen sind :(
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Schade, aber danke dir.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von Krishty »

Du musst das Verhältnis von Fensterausmaß zu Texturausmaß berechnen – float(windowWidth) / float(textureWidth) (die Division muss als Gleitkommazahl erfolgen! – analog für Y) und dann als Texturkoordinate für die beiden Vertices an den Maximalkanten verwenden. So wird bei einem 100 Pixel breiten Fenster eine 10 Pixel breite Textur 10× nebeneinander dargestellt.

Es gibt noch mehr Feinheiten zu Beachten … bei DirectX wäre das die Definition der Pixelmitte; bei OpenGL kenne ich mich mit den Details nicht aus.

Und wer zu Hölle sind die zwölf Lurker hier? So viele haben wir sonst nicht einmal im kompletten Forum …


Ups, hast du schon allein rausgekriegt – hatte ich überlesen; sry. Ich verstehe die Frage dann auch nicht. Texturdimensionen von 3D-Objekten kann man nur in derselben räumlichen Maßeinheit wie die Vertex-Koordinaten angeben; d.h. wenn man ein Haus texturieren möche und eine Backsteintextur hat, dann legt man fest, dass die Textur zwei Meter breit ist (weil 15 Backsteine drauf sind), errechnet die Breite der Wand in Metern, teilt, und hat die Wiederholrate.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

@Krishty
Ich glaube das ist nicht das Problem.

So sehe ich das Problem:
Es gibt eine Welt, in der man sich bewegen kann (also 3D).
Kommt man an eine Mauer, die textuiert ist, wirkt die Textur "verwaschen".

Frage ist nun:
Wie kann man die Qualität der Textur verbessern?


[Edit]
Oh... hast schon gemerkt!
Ja, waren ziemlich viel Zuschauer hier ... :shock:
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

@Krishty: Das durchgestrichene kannst du weg machen, genau das suche ich.

Nehmen wir an, ich habe X1 mit -0.5f und X2 mit +0.5f. Die Auflösung ist 1024, also müsste die Breite 512 entsprechen.
Die Textur hat 48 Pixel also passt sie 10x rein und auf die 34 wird dann skaliert. Manchmal kommt man nicht auf die einfachsten Dinge :)

Danke dir.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von Krishty »

Wenn du dann skalierst, wird sie aber unscharf – die Karte muss dann alle 15 Pixel einen Pixel zurückspringen und dadurch stimmen die Texelmitten (Texel = Texture Element) nicht mehr mit den Pixelmitten des Bildschirms überein. Zwischen den Texeln wird dann interpoliert und das nimmt man als Unschärfe wahr. Die 0,666…-fache Wiederholung am Ende (oder 0,333… an beiden Ecken) würde ich also schon beibehalten, wenn es dem Zweck der Anwendung nicht zuwider läuft.
Zuletzt geändert von Krishty am 05.02.2011, 12:36, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Danke. So funktioniert es :)
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Also ich checks nicht!!
Was war dein Problem?

Was willst Du genau machen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von Krishty »

Was Zweidimensionales; das war afaik der Knackpunkt.
Einfach die Textur in Originalgröße im Fenster anzeigen – und sollte das Fenster größer sein, mit Kopien auffüllen. So wie Hintergrundbilder bei Websites, die auch immer gleich groß bleiben, egal, wie groß die Browser-Anzeigefläche ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: SDL/OpenGL/Textur

Beitrag von joggel »

Achso ... :)
475
Beiträge: 11
Registriert: 29.03.2002, 23:13
Wohnort: AKW
Kontaktdaten:

Re: SDL/OpenGL/Textur

Beitrag von 475 »

Stimmt @Krishty. Jetzt wo du es so erklärst, blickt glaube ich jeder durch :)

Mein Problem war, dass ich einfach nicht auf die einfache Möglichkeit gekommen bin die Breite des Quads mittels der Auflösung zu berechnen und damit dann die Anzahl der Wiederholungen.
Antworten