converted shadow caster shader
parent
81d30ff63a
commit
b803d0e949
@ -1 +1 @@
|
|||||||
Subproject commit d25605ee3a2d67dc0b6367cd150cc6d0c6a3b661
|
Subproject commit a0b3020bdba4433c1e3f45a1d5188eab0172bd88
|
@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
|
||||||
|
material openmw_shadowcaster_default
|
||||||
|
{
|
||||||
|
create_configuration Default
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
fog_override true
|
||||||
|
|
||||||
|
vertex_program openmw_shadowcaster_vertex
|
||||||
|
fragment_program openmw_shadowcaster_fragment
|
||||||
|
|
||||||
|
shader_properties
|
||||||
|
{
|
||||||
|
shadow_transparency true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
material openmw_shadowcaster_noalpha
|
||||||
|
{
|
||||||
|
create_configuration Default
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
fog_override true
|
||||||
|
|
||||||
|
vertex_program openmw_shadowcaster_vertex
|
||||||
|
fragment_program openmw_shadowcaster_fragment
|
||||||
|
|
||||||
|
shader_properties
|
||||||
|
{
|
||||||
|
shadow_transparency false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
#include "core.h"
|
||||||
|
|
||||||
|
#define ALPHA @shPropertyBool(shadow_transparency)
|
||||||
|
|
||||||
|
#ifdef SH_VERTEX_SHADER
|
||||||
|
|
||||||
|
SH_BEGIN_PROGRAM
|
||||||
|
#if ALPHA
|
||||||
|
shInput(float2, uv0)
|
||||||
|
shOutput(float2, UV)
|
||||||
|
#endif
|
||||||
|
shUniform(float4x4 wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
||||||
|
shOutput(float2, depth)
|
||||||
|
SH_START_PROGRAM
|
||||||
|
{
|
||||||
|
// this is the view space position
|
||||||
|
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
||||||
|
|
||||||
|
// depth info for the fragment.
|
||||||
|
depth.x = shOutputPosition.z;
|
||||||
|
depth.y = shOutputPosition.w;
|
||||||
|
|
||||||
|
// clamp z to zero. seem to do the trick. :-/
|
||||||
|
shOutputPosition.z = max(shOutputPosition.z, 0);
|
||||||
|
|
||||||
|
#if ALPHA
|
||||||
|
UV = uv0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
SH_BEGIN_PROGRAM
|
||||||
|
#if ALPHA
|
||||||
|
shInput(float2, UV)
|
||||||
|
shSampler2D(texture1)
|
||||||
|
#endif
|
||||||
|
shInput(float2, depth)
|
||||||
|
SH_START_PROGRAM
|
||||||
|
{
|
||||||
|
float finalDepth = depth.x / depth.y;
|
||||||
|
|
||||||
|
|
||||||
|
#if ALPHA
|
||||||
|
// use alpha channel of the first texture
|
||||||
|
float alpha = shSample(texture1, UV).a;
|
||||||
|
|
||||||
|
// discard if alpha is less than 0.5
|
||||||
|
if (alpha < 1.0)
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
shOutputColor(0) = float4(finalDepth, finalDepth, finalDepth, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,15 @@
|
|||||||
|
shader_set openmw_shadowcaster_vertex
|
||||||
|
{
|
||||||
|
source shadowcaster.shader
|
||||||
|
type vertex
|
||||||
|
profiles_cg vs_2_0 arbvp1
|
||||||
|
profiles_hlsl vs_2_0
|
||||||
|
}
|
||||||
|
|
||||||
|
shader_set openmw_shadowcaster_fragment
|
||||||
|
{
|
||||||
|
source shadowcaster.shader
|
||||||
|
type fragment
|
||||||
|
profiles_cg ps_2_x ps_2_0 ps arbfp1
|
||||||
|
profiles_hlsl ps_2_0
|
||||||
|
}
|
@ -1,51 +0,0 @@
|
|||||||
void main_vp(
|
|
||||||
float4 position : POSITION,
|
|
||||||
float2 uv : TEXCOORD0,
|
|
||||||
|
|
||||||
out float4 oPosition : POSITION,
|
|
||||||
out float2 oDepth : TEXCOORD0,
|
|
||||||
out float2 oUv : TEXCOORD1,
|
|
||||||
|
|
||||||
uniform float4x4 wvpMat)
|
|
||||||
{
|
|
||||||
// this is the view space position
|
|
||||||
oPosition = mul(wvpMat, position);
|
|
||||||
|
|
||||||
// depth info for the fragment.
|
|
||||||
oDepth.x = oPosition.z;
|
|
||||||
oDepth.y = oPosition.w;
|
|
||||||
|
|
||||||
// clamp z to zero. seem to do the trick. :-/
|
|
||||||
oPosition.z = max(oPosition.z, 0);
|
|
||||||
|
|
||||||
oUv = uv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main_fp(
|
|
||||||
float2 depth : TEXCOORD0,
|
|
||||||
float2 uv : TEXCOORD1,
|
|
||||||
uniform sampler2D texture1 : register(s0),
|
|
||||||
|
|
||||||
out float4 oColour : COLOR)
|
|
||||||
{
|
|
||||||
float finalDepth = depth.x / depth.y;
|
|
||||||
|
|
||||||
// use alpha channel of the first texture
|
|
||||||
float alpha = tex2D(texture1, uv).a;
|
|
||||||
|
|
||||||
// discard if alpha is less than 0.5
|
|
||||||
clip((alpha >= 0.5) ? 1 : -1);
|
|
||||||
|
|
||||||
oColour = float4(finalDepth, finalDepth, finalDepth, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main_fp_noalpha(
|
|
||||||
float2 depth : TEXCOORD0,
|
|
||||||
float2 uv : TEXCOORD1,
|
|
||||||
|
|
||||||
out float4 oColour : COLOR)
|
|
||||||
{
|
|
||||||
float finalDepth = depth.x / depth.y;
|
|
||||||
|
|
||||||
oColour = float4(finalDepth, finalDepth, finalDepth, 1);
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
vertex_program depth_shadow_caster_vs cg
|
|
||||||
{
|
|
||||||
source depthshadowcaster.cg
|
|
||||||
profiles vs_1_1 arbvp1
|
|
||||||
entry_point main_vp
|
|
||||||
|
|
||||||
default_params
|
|
||||||
{
|
|
||||||
param_named_auto wvpMat worldviewproj_matrix
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment_program depth_shadow_caster_ps cg
|
|
||||||
{
|
|
||||||
source depthshadowcaster.cg
|
|
||||||
profiles ps_2_0 arbfp1
|
|
||||||
entry_point main_fp
|
|
||||||
|
|
||||||
default_params
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment_program depth_shadow_caster_ps_noalpha cg
|
|
||||||
{
|
|
||||||
source depthshadowcaster.cg
|
|
||||||
profiles ps_2_0 arbfp1
|
|
||||||
entry_point main_fp_noalpha
|
|
||||||
|
|
||||||
default_params
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
material depth_shadow_caster
|
|
||||||
{
|
|
||||||
technique
|
|
||||||
{
|
|
||||||
pass
|
|
||||||
{
|
|
||||||
// force-disable fog (relevant for DirectX profiles below SM3 that always apply fixed function fog)
|
|
||||||
fog_override true
|
|
||||||
|
|
||||||
vertex_program_ref depth_shadow_caster_vs
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment_program_ref depth_shadow_caster_ps
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
material depth_shadow_caster_noalpha
|
|
||||||
{
|
|
||||||
technique
|
|
||||||
{
|
|
||||||
pass
|
|
||||||
{
|
|
||||||
// force-disable fog (relevant for DirectX profiles below SM3 that always apply fixed function fog)
|
|
||||||
fog_override true
|
|
||||||
|
|
||||||
vertex_program_ref depth_shadow_caster_vs
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment_program_ref depth_shadow_caster_ps_noalpha
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue