31
GLBasic - de / X_OBJ... und Texturen
« on: 2008-Nov-17 »
Eine Sache mit der Texturierung von Objekten ist mir noch nicht so ganz klar. In jedem Beispiel, sei es hier in GLBasic (Samples) oder in OpenGL-Tutorien, werden als Texturkoordinaten immer nur 0 und 1 verwendet. Wenn ich jedoch Objekte unterschiedlicher Größe habe und belege beide Objekte mit der gleichen Textur, so erscheinen die Texturen auch in unterschiedlicher Auflösung, wenn ich als Koordinaten nur 0 und 1 verwende. Wenn ich jedoch die Texturkoordinaten im Verhältnis umrechne (also 1 = 100%, Dreisatz
, dann erscheint die Textur auf allen Flächen in der gleichen Auflösung, egal wie groß die Fläche ist.
Folgendes Beispiel soll das verdeutlichen:
zunächst werden zwei Quadrate gezeichnet, eines mit 100 Punkten Kantenlänge, eines mit 50. Als Texturkoordinaten verwende ich bei beiden nur 0 und 1.
die zwei Quadrate darunter haben die gleiche Dimension, die Texturkoordinaten für das kleinere Quadrat wurden jedoch im Verhältnis angeaßt. (die verwendete Textur findet sich im Anhang)
wie man sieht, hat im unteren Beispiel die Textur auf beiden Flächen die gleiche Auflösung. Somit wirken auch unterschiedliche große Stücke der "Mauer" wie aus einem Guß. Im obigen Beispiel dagegen meint man, im rechten Mauerteil wären kleinere Steine verbaut worden.
Meine eigentliche Frage:
Ist das der Weg, wie man das Ziel "gleiche Texturauflösung auf unterschiedlich großen Flächen" erreicht? Oder gibt es da einfachere oder bessere Wege?

Folgendes Beispiel soll das verdeutlichen:
zunächst werden zwei Quadrate gezeichnet, eines mit 100 Punkten Kantenlänge, eines mit 50. Als Texturkoordinaten verwende ich bei beiden nur 0 und 1.
die zwei Quadrate darunter haben die gleiche Dimension, die Texturkoordinaten für das kleinere Quadrat wurden jedoch im Verhältnis angeaßt. (die verwendete Textur findet sich im Anhang)
Code: (glbasic) [Select]
LOADSPRITE "mauer.png", 0
c = RGB(255, 255, 255)
X_OBJSTART 0
X_OBJADDVERTEX -100, 100, 0, 0, 0, c
X_OBJADDVERTEX -100, 0, 0, 0, 1, c
X_OBJADDVERTEX 0, 100, 0, 1, 0, c
X_OBJADDVERTEX 0, 0, 0, 1, 1, c
X_OBJEND
X_OBJSTART 1
X_OBJADDVERTEX 0, 50, 0, 0, 0, c
X_OBJADDVERTEX 0, 0, 0, 0, 1, c
X_OBJADDVERTEX 50, 50, 0, 1, 0, c
X_OBJADDVERTEX 50, 0, 0, 1, 1, c
X_OBJEND
X_OBJSTART 2
X_OBJADDVERTEX -100, -10, 0, 0, 0, c
X_OBJADDVERTEX -100, -110, 0, 0, 1, c
X_OBJADDVERTEX 0, -10, 0, 1, 0, c
X_OBJADDVERTEX 0, -110, 0, 1, 1, c
X_OBJEND
X_OBJSTART 3
X_OBJADDVERTEX 0, -10, 0, 0, 0, c
X_OBJADDVERTEX 0, -60, 0, 0, 0.5, c
X_OBJADDVERTEX 50, -10, 0, 0.5, 0, c
X_OBJADDVERTEX 50, -60, 0, 0.5, 0.5, c
X_OBJEND
GLOBAL KEY_LEFT = 203
GLOBAL KEY_RIGHT = 205
GLOBAL KEY_UP = 200
GLOBAL KEY_DOWN = 208
GLOBAL KEY_W = 17
GLOBAL KEY_S = 31
GLOBAL camx, camy, camz, camdx, camdy, camdz
GLOBAL angle, factor
camy = 0
camdx = 0
camdy = 0
camdz = 0
angle = 90
distance = 300
WHILE TRUE
IF KEY(KEY_LEFT)
DEC angle, 1
ENDIF
IF KEY(KEY_RIGHT)
INC angle, 1
ENDIF
IF KEY(KEY_W) THEN DEC distance, 3
IF KEY(KEY_S) THEN INC distance, 3
IF KEY(KEY_UP) THEN DEC camy, 5
IF KEY(KEY_DOWN) THEN INC camy, 5
camx = COS(angle) * distance
camz = SIN(angle) * distance
X_MAKE3D 1, 1000, 45
X_CAMERA camx, camy, camz, camdx, camdy, camdz
FOR i = 0 TO 3
X_SETTEXTURE 0, -1
X_DRAWOBJ i, 0
NEXT
SHOWSCREEN
WEND
wie man sieht, hat im unteren Beispiel die Textur auf beiden Flächen die gleiche Auflösung. Somit wirken auch unterschiedliche große Stücke der "Mauer" wie aus einem Guß. Im obigen Beispiel dagegen meint man, im rechten Mauerteil wären kleinere Steine verbaut worden.
Meine eigentliche Frage:
Ist das der Weg, wie man das Ziel "gleiche Texturauflösung auf unterschiedlich großen Flächen" erreicht? Oder gibt es da einfachere oder bessere Wege?