X_OBJ... und Texturen

Previous topic - Next topic

Quentin

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)

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?

Schranz0r

Kannste nur über UV-Mapping erreichen.
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Na, Du musst halt bei doppeltem Objekt auch doppelte UV Koordinaten verwenden.
z.B:
POLYVECTOR x,y, x,y, col
also -> xy auch als UV verwenden.