diff --git a/files/shaders/CMakeLists.txt b/files/shaders/CMakeLists.txt index 31db4a3eb..0738b5783 100644 --- a/files/shaders/CMakeLists.txt +++ b/files/shaders/CMakeLists.txt @@ -11,6 +11,7 @@ set(SHADER_FILES terrain_vertex.glsl terrain_fragment.glsl lighting.glsl + parallax.glsl ) copy_all_files(${CMAKE_CURRENT_SOURCE_DIR} ${DDIR} "${SHADER_FILES}") diff --git a/files/shaders/parallax.glsl b/files/shaders/parallax.glsl new file mode 100644 index 000000000..52ea0d2cc --- /dev/null +++ b/files/shaders/parallax.glsl @@ -0,0 +1,8 @@ +#define PARALLAX_SCALE 0.04 +#define PARALLAX_BIAS -0.02 + +vec2 getParallaxOffset(vec3 eyeDir, mat3 tbn, float height) +{ + vec3 TSeyeDir = normalize((vec4(normalize(tbn * eyeDir),0)).xyz); + return TSeyeDir.xy * ( height * PARALLAX_SCALE + PARALLAX_BIAS ); +} diff --git a/files/shaders/terrain_fragment.glsl b/files/shaders/terrain_fragment.glsl index e1b519932..14f00a2e1 100644 --- a/files/shaders/terrain_fragment.glsl +++ b/files/shaders/terrain_fragment.glsl @@ -25,12 +25,11 @@ varying vec3 passViewPos; varying vec3 passNormal; #if @parallax -#define PARALLAX_SCALE 0.04 -#define PARALLAX_BIAS -0.02 uniform mat4 osg_ViewMatrixInverse; #endif #include "lighting.glsl" +#include "parallax.glsl" void main() { @@ -53,9 +52,7 @@ void main() #if @parallax vec3 cameraPos = osg_ViewMatrixInverse[3].xyz; vec3 eyeDir = normalize(cameraPos - (osg_ViewMatrixInverse * vec4(passViewPos, 1)).xyz); - vec3 TSeyeDir = normalize((vec4(normalize(tbn * eyeDir),0)).xyz); - - adjustedUV += TSeyeDir.xy * ( normalTex.a * PARALLAX_SCALE + PARALLAX_BIAS ); + adjustedUV += getParallaxOffset(eyeDir, tbn, normalTex.a); // update normal using new coordinates normalTex = texture2D(normalMap, adjustedUV);