- Edited
It seems like every other game engine has this built-in by now, so here's a cubemap reflection shader written in Godot's shading language. It makes things really shiny.<br><br><img src="https://lut.im/Lcq9n2y40l/GPDuaWCZV0YOpbu7.png" alt="" height="400" width="500"><br><br>I just took GlaDOSik's original shader and used some magic math to make it so the only necessary parameter is the actual cubemap.<br>
// -- VERTEX SHADER -- //<br><br>//Based on: http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter07.html<br>//By GlaDOSik with help from romulox_x (http://forum.godotdevelopers.org/index.php?topic=8988)<br>//Shader-based camera position by fluffrabbit with help from falsaber and Hiesetsu<br><br>vec4 invcamx = INV_CAMERA_MATRIX.x;<br>vec4 invcamy = INV_CAMERA_MATRIX.y;<br>vec4 invcamz = INV_CAMERA_MATRIX.z;<br>vec4 invcamw = INV_CAMERA_MATRIX.w;<br><br>vec3 CameraPosition = -invcamw.xyz * mat3( invcamx.xyz, invcamy.xyz, invcamz.xyz );<br><br>vec3 vertexW = WORLD_MATRIX * SRC_VERTEX; //vertex from model to world space<br>vec3 N = normalize(WORLD_MATRIX * vec4(SRC_NORMAL.x, SRC_NORMAL.y, SRC_NORMAL.z, 0.0)).xyz; //normal from model space to world space<br>vec3 I = normalize(vertexW - CameraPosition); //incident vector (from camera to vertex)<br>vec3 R = reflect(I, N); //reflection vector (from vertex to cube map)<br>R.z *= -1;<br>VAR2.xyz = R;<br><br>// -- FRAGMENT SHADER -- //<br><br>uniform cubemap cube;<br>color envColor = texcube(cube,VAR2.xyz);<br>DIFFUSE = envColor.xyz;<p>Attached are an example project and a Blender file to generate a cubemap.</p><br>