Cubemap shader

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Cubemap shader
Hallo,
wir kommen gerade nicht mit unserem cubemap Shader weiter, ich habe mir folgendes gedacht:
im Vertex shader berechne ich:

normal = gl_NormalMatrix * gl_Normal;
view = gl_NormalMatrix*normalize(gl_Vertex.xyz - camerapos);

wobei camerapos ein uniform im worldspace ist.
und dann im fragment shader:

vec3 reflTexCoord = reflect(normalize(view), normalize(normal)); 
gl_FragColor.rgb = textureCube(cubemap, reflTexCoord);

aber dummerweise rotiert sich die reflektion wenn ich unsere kugel anstosse mit.


Also das hier leuchtet mir grad nicht ein:

view = gl_NormalMatrix*normalize(gl_Vertex.xyz - camerapos);

Du brauchst ja einfach nur die Vertexposition im Viewspace(?), ungefähr so:

view=gl_ModelViewMatrix*gl_Vertex;

camerapos brauchst du dafür garnicht extra übergeben.

Edit: So schaut die Cubemap aber wahrscheinlich aus allen Richtungen gleich aus fällt mir auf. :-/ :rolleyes: :nuts:


wenn die camerapos nirgendwo Einfluss hat, sieht man immer die gleiche Seite der Cubemap, egal von welcher Seite man auf das Objekt schaut.


Ja, hab das grad mit einer Spheremap verwechselt.


Das gl_Vertex ist ja im Modelspace, und camerapos wahrscheinlich Worldspace.

normal = mat3(modelmatrix) * gl_Normal;
view = normalize(modelmatrix * gl_Vertex - camerapos);

Vielleicht geht das. :smiley:


@ team: Die campos scheint sich garnicht zu ändern, sollte die nicht jeden Frame ein Update erhalten?
edit: In Binduniforms wird zwar jeden Frame mittels des Pointers auf die Campos die Werte aktualisiert, aber sobald das Objekt auf dessen Position der Pointer zeigt zerstört wird, können natürlich auch keine neuen Werte gelesen werden. Es müssten eigentlich in jedem Frame Game::world.currentCam->GetPosP() ausgewertet werden!


so ich habe jetzt mal versucht die camerapos uniform aus einem float** zu holen, jedoch ohne Erfolg, aus irgendeinem Grund bekomme ich nicht den gleichen pointer bei binduniforms zurück, den ich bei adduniform reinschreibe :confused:
ich versuche jetzt die cubemap im eyespace zu erzeugen.


Servus,

wuerde es dich sehr frustrieren, wenn ich dir sage, dass du fuer Environment Cube Maps gar keinen Shader brauchst? Den Texturlookup kannst du ausschliesslich mittels Koordinatengenerierung von OpenGL und der Texturmatrix realisieren. Aber du hast natuerlich recht, die Campos muss irgendwie eingehen (dafuer die Matrix). Wir holen uns die aktuelle Trafo der Game::world.currentCam. In Kombination mit der Position in der Map reicht es, um den Texturlookup korrekt durchzufuehren. Mehr sei hier aber jetzt noch nicht verraten.

Gruss,
Frank


ja für den einfachen Fall reicht das, aber was wenn wir mal refraction oder reflection mit bumpmapping machen wollen?


OK OK, in dem Fall koennte man folgendes machen. Plan A, nicht das Camera-Objekt ins Nirvana befoerdern. :slight_smile: Ansonsten gibt es auch noch die Moeglichkeit, campos_player zu verwenden. Die Idee ist, dass dieser Wert bei jedem Update neu gesetzt wird (game.cpp Zeile 594). Be aware, das ist nicht zwingend die CurrentCam, die sich ja auch waerend einer RenderAction noch aendern darf. Solltet ihr eine andere Kamera brauchen, so koenntet ihr analog vorgehen. Dazu muesstet ihr allerdings den Code ergaenzen.

Gruss
Frank


also ich bin irgendwie am verzweifeln.
wenn ich versuche ohne shader auszukommen seh ich nur eine rote kugel weil rot als diffuse color im material angegeben ist.
ausserdem, sollte gl_ProjectionMatrix[3].xyz nicht auch die position der kamera sein? funktioniert auch nicht, will heissen ändert sich nicht
(0.5+0.5*normalize() liefert immer die gleiche farbe)
ich habs jetzt nochmal mit shadern und der campos_player versucht, aber es klappt wieder nicht…
Könnt ihr mal reinschauen und uns einen tipp geben, ich würde gerne mit der Aufgabe weiterkommen.
(wir sind team9)


So habs jetzt doch noch hinbekommen. Habe alle Berechnungen in den Eyespace verschoben und spar mir alle Uniforms, dazu musste ich natürlich die Cubemap anpassen.