nuclide/platform/base_glsl.pk3dir/glsl/reflect.glsl

54 lines
1.4 KiB
GLSL

//======= Copyright (c) 2015-2020 Vera Visions LLC. All rights reserved. =======
//
// Purpose:
//
// Non-lit surface that predominantly offers environment cube reflection
// modulated by the diffusemap's RGB. This is used for glass, for example.
//==============================================================================
!!ver 110
!!permu FOG
!!samps diffusemap=0 normalmap=1 cubemap:samplerCube=2
#include "sys/defs.h"
varying vec2 tex_c;
varying vec3 eyevector;
varying mat3 invsurface;
#ifdef VERTEX_SHADER
void main ()
{
tex_c = v_texcoord;
invsurface[0] = v_svector;
invsurface[1] = v_tvector;
invsurface[2] = v_normal;
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
eyevector.x = dot( eyeminusvertex, v_svector.xyz );
eyevector.y = dot( eyeminusvertex, v_tvector.xyz );
eyevector.z = dot( eyeminusvertex, v_normal.xyz );
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
#include "sys/fog.h"
void main ()
{
vec3 out_f;
vec3 diffuse_f = texture2D(s_diffusemap, tex_c).rgb;
vec3 normal_f = texture2D(s_normalmap, tex_c).rgb - 0.5;
normal_f.x *= 0.2;
normal_f.y *= 0.2;
normal_f = normalize(normal_f);
vec3 rtc = reflect( normalize( -eyevector ), normal_f );
rtc = rtc.x * invsurface[0] + rtc.y * invsurface[1] + rtc.z * invsurface[2];
rtc = ( m_model * vec4( rtc.xyz, 0.0 ) ).xyz;
diffuse_f = textureCube(s_cubemap, rtc).rgb * (diffuse_f * 2.5);
gl_FragColor = fog4(vec4( diffuse_f, 1.0 ));
}
#endif