PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CupeMaps in OpenGL (zeckensack, demirug??)


Chris Lux
2004-03-17, 19:40:28
Hi,
ich versuch gerade eine statische cubemap für Reflexionen zu nutzen, nur irgendwie bin ich gerade sehr durcheinander.

1. die faces sind nach dem linke hand system benannt, dh das face auf das die camera schaut (in ogl neg z-achse) ist das positive z face -> also das FRONT face -> negatives z face = BACK

-----
| |
| top |
| |
----- ----- ----- -----
| | | | |
|left |front|right|back |
| | | | |
----- ----- ----- -----
| |
|bottm|
| |
-----
-----
| |
| py |
| |
----- ----- ----- -----
| | | | |
| nx | pz | px | nz |
| | | | |
----- ----- ----- -----
| |
| ny |
| |
-----
(left handed system -> auf pz front und auf nz back laden)


2. wenn ich die texturen lade und ein einfachen reflexionsshader bastle erscheinen (auf einer testkugel) die texturen alle verdreht:

vertex program:
normal_out = normalize(mul(glstate.matrix.invtrans.modelview[0], float4(normal_in,1)).xyz);
worldpos_out = mul(glstate.matrix.modelview[0], position_in).xyz;

fragment program:
float4 reflective = texCUBE(cubetex_in, reflect(worldpos_in, normal_in));


setzte ich den image origin von LOWER_LEFT auf UPPER_LEFT (ich verwende devil) ist die reflexion an sich in ordnung, NUR erscheint aber auf der kugel direkt sichtbar das FRONT face, was ja nicht sein kann. genauso wenn man die reflexion genauer betrachtet sind die seiten des weltcubes nicht gespiegelt. auch ohne den shader mit den normalen texgen sachen für reflectionmapping sieht es genauso aus.

habe ich da was in der spec überlesen oder habe ich an irgend einer stelle einen denkfehler drin? wenn ich eine normalisations-cubemap nutzen würde wären solche verdrehnungen sehr fatal, warum müsste ich für korrekte reflextionen alle fläschen um 180° drehen (bis auf die TOP und BOTTOM fläche)? (dieses vorgehen habe ich aus der bubble-nvidia demo)

wenn jemand ähnliche erfahrungen machen musste, bitte teilt euch mit ;)

Chris Lux
2004-03-17, 20:23:10
ok,
in meiner laderoutine half folgendes in verbindung damit, dass ich für pos z das back und für neg z für das front image:

switch ((*face).first)
{
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: iluFlipImage();iluMirror();break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: break;
}


ausgehend von diesem link:
http://www.r3.nu/~cass/nv/cubemap_image_orientation.ppt

aber das sowas ned in der spec steht find ich komisch.

zeckensack
2004-03-19, 02:16:00
Es gibt eben zwei mögliche Betrachtungsweisen, wo bei jedem face "links unten" sein könnte.
1)Du stellst dir als Bezugssystem einen flach aufgefalteten Würfel vor - genau wie in deiner Skizze.

2)Du betrachtest den Würfel direkt im Raum.


Nimm ein Blatt Papier, schneide deine Klapp-Skizze aus, und male in jedes Feld einen Pfeil der nach "links unten" zeigt. Dann falte den Würfel zusammen. Gegenüberliegende Pfeilpaare sind nun orthogonal zueinander, nicht parallel.


Für eine dieser beiden Betrachtungsweisen muss man sich eben entscheiden ;)

HTH :)

Chris Lux
2004-03-19, 07:04:44
Original geschrieben von zeckensack
Es gibt eben zwei mögliche Betrachtungsweisen, wo bei jedem face "links unten" sein könnte.
1)Du stellst dir als Bezugssystem einen flach aufgefalteten Würfel vor - genau wie in deiner Skizze.

2)Du betrachtest den Würfel direkt im Raum.


Nimm ein Blatt Papier, schneide deine Klapp-Skizze aus, und male in jedes Feld einen Pfeil der nach "links unten" zeigt. Dann falte den Würfel zusammen. Gegenüberliegende Pfeilpaare sind nun orthogonal zueinander, nicht parallel.


Für eine dieser beiden Betrachtungsweisen muss man sich eben entscheiden ;)

HTH :)

von der vorstellung her ist das kein großes problem für mich. eher, dass die vorstellung kaum mit der realität übereinstimmt (genauso wie die spec).

schau dir mal das ppt aus dem link von oben an. denn malt man den 'pfeil' nach links unten zeigt der aber auf die koordinate (1,1) des faces (gilt für -x, +x, -y, +y), wesshalb beim laden die images für diese faces um 180° gedreht werden müssen. dies ist das problem, was durch die konfomität mit dem renderman cube map system entsteht, was nicht der vorstellung eines openGL systems entspricht.

in der spec steht auch, dass wenn man sich vorstellt 'im' würfel zu stehen, man das das linke hand system nutzen soll, was bedeutet, dass man der positiven z achse entlang schaut. aber bastelt man nach dieser anleitung den würfel zusammen sind genau +z und -z vertauscht. das bedeutet, dass man doch das rechte hand system nutzen muss.

zusammengefasst, heisst das, dass man beim laden auf das lokale koordinatensystem des jeweiligen faces achten muss, damit die images korrekt liegen.

;) sorry das ich deiner sesamstrassen-vorstellung widersprechen muss. (du kannst ja mal images basteln mit den pfeilen, die normal laden und du wirst sehen wo deine pfeile hinzeigen ;))