diff options
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)); +} |