Seite 1 von 1
SDL/OpenGL/Textur
Verfasst: 05.02.2011, 01:27
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:13
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ß ....
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:23
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:43
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:46
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:52
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?
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:55
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...
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 10:59
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:16
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:21
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?
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:28
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*
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:32
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:42
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?
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 11:44
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:05
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 :(
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:12
von 475
Schade, aber danke dir.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:16
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
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:22
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:
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:28
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:32
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:35
von 475
Danke. So funktioniert es :)
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:39
von joggel
Also ich checks nicht!!
Was war dein Problem?
Was willst Du genau machen?
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:42
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.
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:46
von joggel
Achso ... :)
Re: SDL/OpenGL/Textur
Verfasst: 05.02.2011, 12:49
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.