PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eine Textur auf mehrere Polygone in OpenGL


Dee
2003-10-17, 12:03:06
Vielleicht ist die Frage so simpel, daß sie noch niemand gestellt hat, im englischen OpenGL-Forum finde ich leider die Antwort nicht.

Ich hab ein zweidimensionales Objekt, welches aus mehreren Polygonen besteht. (Nicht unbedingt Dreiecke!)
Nun will ich auf das gesamt Objekt eine Textur aus einer Datei ziehen. Wie geht das?

Um genau zu sein: Ich will nur einen einzigen Buchstaben auf dieses Objekt projezieren. Am besten wäre also eine zweifarbige Textur, wovon eine Farbe durchsichtig sein soll und die andere z.B. weiß.

Wenn jemand einen guten Vorschlag hat, bitte posten.

Gruß und Danke, Dee

Xmas
2003-10-17, 12:38:42
Ich glaube das Laden der Textur ist komplizierter als das Texturieren selbst ;)

In welchem Dateiformat liegt die Textur vor? auxDIBImageLoad() (eine Funktion von GLaux) kann BMPs laden.

Chroma Keying ("eine Farbe durchsichtig") ist in OpenGL nicht möglich (bzw. nur mit größerem Aufwand), stattdessen kannst du Alpha-Testing/Blending verwenden. Dafür müsstest du aber für deine Textur den Alpha-Kanal generieren.

Wenn es wirklich nur eine zweifarbige Textur sein soll, gibt es noch eine andere Variante, dafür müsste die Textur aber 8-bit sein.


Zum Texturieren selbst: Damit die Textur über mehrere Polygone geht, musst du lediglich die passenden Texturkoordinaten verwenden. Als Beispiel die Texturkoordinaten für eine Textur über 4 Quads gezogen:


(0,0)----(0.25,0)----(0.5,0)----(0.75,0)----(1,0)
| | | | |
| | | | |
| | | | |
(0,1)----(0.25,1)----(0.5,1)----(0.75,1)----(1,1)

Dee
2003-10-17, 22:37:34
Also die Texture liegt als Qimage vor. Hätte vielleicht erwähnen sollen, daß ich in QT programmiere.

Hier der Code:

QImage tex1;
tex1.load("gllogo.bmp")
tex1 = QGLWidget::convertToGLFormat(tex1); // flipped 32bit RGBA

Wenn die Texture, dann im Speicher sitzt, wird sie in der Beispieldatei irgendwie per

glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() );

auf das Polygon geklebt. Leider verstehe ich hier die Zuweisung von glTexImage2D nicht. Zumal ich hier auch nichts mit Texturkoordinaten sehe.

Könntest Du mir auf die Sprünge helfen, was ich übersehen hab.

Im übrigen hab ich hier ein Buch, wo durchsichtige Texturen kurz auf zwei Seiten erklärt sind, nur durch gl-Befehle... Kann ja also net so schwer sein! *g*

Gruß, Dee

che g
2003-10-18, 15:40:02
Original geschrieben von Dee
Wenn die Texture, dann im Speicher sitzt, wird sie in der Beispieldatei irgendwie per

glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() );

auf das Polygon geklebt. Leider verstehe ich hier die Zuweisung von glTexImage2D nicht. Zumal ich hier auch nichts mit Texturkoordinaten sehe.

Könntest Du mir auf die Sprünge helfen, was ich übersehen hab.

Im übrigen hab ich hier ein Buch, wo durchsichtige Texturen kurz auf zwei Seiten erklärt sind, nur durch gl-Befehle... Kann ja also net so schwer sein! *g*

Gruß, Dee

Die Funktion glTexImage2d(...) klebt noch gar nichts. Sie übermittelt nur einige Informationen an OpenGL damit du die Textur überhaupt verwenden kannst.
Damit die Textur auf das Polygon kommt musst du in deiner Zeichenfunktion vor jedes glVertex*(...) ein glTexCoord*(...) setzen. Das sind dann die Texturkoordinaten die Xmas erwähnt hat.

Ich rate dir allerdings zuerst einmal auf http://nehe.gamedev.net/ vorbeizuschauen, dort gibt es exzellente Tutorials wo alles erklärt wird. (Für die meisten Lessons gibt es auch Conversions in alle möglichen Sprachen).

MfG

Xmas
2003-10-18, 16:31:09
Original geschrieben von Dee
Im übrigen hab ich hier ein Buch, wo durchsichtige Texturen kurz auf zwei Seiten erklärt sind, nur durch gl-Befehle... Kann ja also net so schwer sein! *g*
Ist auch nicht so schwer, aber eben mit Transparenzinformationen im Alpha-Kanal. Chroma-Keying ist nicht ohne "Pixel Shader"-Extensions möglich.

Wie che g schon schrieb, übergibt glTexImage2D lediglich die Textur zur Verwendung als "aktuelle Textur" an den Treiber (danach wird dein QImage-Objekt übrigens nicht mehr benötigt). Diese Textur wird dann so lange verwendet, bis du Texturing abschaltest oder eine andere Textur lädst.

Dee
2003-10-19, 00:05:49
Ah, jetzt wird's klarer! :) Da in dem Beispielprog, was ich als Vorlage verwendet habe, mit glu-Objekten hantiert wird, ist die Texturierung dort wohl anders realisiert.

Hab mich aber im Übrigen nun zu einer texturfreien Implementierung entschlossen. Habe einfach die Buchstaben als Polygon realisiert. Sieht vielleicht net ganz so schön aus wie ein Bitmap, aber erfüllt seinen Zweck - und ich weiß wenigstens, was ich mache. ;)

Aber was mich interessiert: Was kann "Chroma-Keying" denn so besonderes, daß es dazu Shader-Unterstützung braucht? Transparenz allein kann es nicht sein, oder?

Gruß, Dee

Xmas
2003-10-19, 02:28:56
Original geschrieben von Dee
Aber was mich interessiert: Was kann "Chroma-Keying" denn so besonderes, daß es dazu Shader-Unterstützung braucht? Transparenz allein kann es nicht sein, oder?
Chroma-Keying "kann" nichts besonderes. Es ist nur so dass
- OpenGL dieses Feature niemals direkt anbot
- DirectX seit Version 8.0 kein Chroma Keying mehr bietet
- es keine aktuelle Hardware gibt die dieses Feature direkt unterstützt
Weswegen man es eben durch Shader-Instruktionen nachbilden muss, wenn man es denn unbedingt braucht (was allerdings eh ein absoluter Ausnahmefall ist).