diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-15 01:09:49 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-15 01:57:16 +0300 |
commit | 810464e5f721a14bc3b6e3071f63a93f2ff68043 (patch) | |
tree | c8c1e0cc336200368b207a60cfa13e94f049669c /source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl | |
parent | 246ee82a2f3c7e076c711659d876909dc4b410ea (diff) |
Eevee: Group octahedron map functions into one file.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl b/source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl new file mode 100644 index 00000000000..631b325ae37 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/octahedron_lib.glsl @@ -0,0 +1,38 @@ + +vec2 mapping_octahedron(vec3 cubevec, vec2 texel_size) +{ + /* projection onto octahedron */ + cubevec /= dot( vec3(1), abs(cubevec) ); + + /* out-folding of the downward faces */ + if ( cubevec.z < 0.0 ) { + cubevec.xy = (1.0 - abs(cubevec.yx)) * sign(cubevec.xy); + } + + /* mapping to [0;1]ˆ2 texture space */ + vec2 uvs = cubevec.xy * (0.5) + 0.5; + + /* edge filtering fix */ + uvs *= 1.0 - 2.0 * texel_size; + uvs += texel_size; + + return uvs; +} + +vec4 textureLod_octahedron(sampler2DArray tex, vec4 cubevec, float lod, float lod_max) +{ + vec2 texelSize = 1.0 / vec2(textureSize(tex, int(lod_max))); + + vec2 uvs = mapping_octahedron(cubevec.xyz, texelSize); + + return textureLod(tex, vec3(uvs, cubevec.w), lod); +} + +vec4 texture_octahedron(sampler2DArray tex, vec4 cubevec) +{ + vec2 texelSize = 1.0 / vec2(textureSize(tex, 0)); + + vec2 uvs = mapping_octahedron(cubevec.xyz, texelSize); + + return texture(tex, vec3(uvs, cubevec.w)); +} |