Files
linguist/samples/HLSL/jellyfish.fx
Erik Faye-Lund 6b001cf861 add support for HLSL/FX
Add support for DirectX HLSL / FX files. The FX files are
just HLSL files with some additional syntax to set
render-states and define multiple shader stages in one file.

Samples are either written by me, or taken from Chromium.
2016-02-19 11:32:46 +01:00

120 lines
2.3 KiB
HLSL

float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;
float4x4 matWorldView : WORLDVIEW;
float4x4 matWorld : WORLD;
float4x4 matView : VIEW;
uniform float4 vViewPosition;
struct VS_INPUT
{
float3 Pos: POSITION;
float3 Normal: NORMAL;
float3 Tangent: TANGENT;
float3 Binormal: BINORMAL;
};
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 reflection : TEXCOORD1;
float3 refraction : TEXCOORD2;
float fresnel : TEXCOORD3;
};
uniform float3 amt;
uniform float3 scale;
uniform float3 phase;
float3 deform(float3 p)
{
float s = 3;
float3 p2 = p * scale + phase;
s += sin(p2.x) * amt.x;
s += sin(p2.y) * amt.y;
s += sin(p2.z) * amt.z;
return p * s / 3;
}
VS_OUTPUT vs_main( VS_INPUT In )
{
VS_OUTPUT Out;
float3 pos = In.Pos;
float3 norm = In.Normal;
float3 p1 = pos + In.Tangent * 0.05;
float3 p2 = pos + In.Binormal * 0.05;
pos = deform(pos);
p1 = deform(p1);
p2 = deform(p2);
p1 -= pos;
p2 -= pos;
norm = normalize(cross(p1, p2));
float3 view = normalize(pos - vViewPosition.xyz);
Out.Pos = mul(float4(pos, 1.0), matWorldViewProjection);
Out.reflection = reflect(view, norm);
Out.refraction = reflect(view, norm * 0.4f); /* fake, but who cares? */
Out.fresnel = dot(view, norm);
norm = mul(float4(norm, 0.0), matWorldViewProjection);
return Out;
}
#define PS_INPUT VS_OUTPUT
#if 0
textureCUBE reflectionMap;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#else
// textures
texture reflectionMap
<
string type = "CUBE";
string name = "test_cube.dds";
>;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#endif
struct PS_OUTPUT
{
float4 color : COLOR0;
};
PS_OUTPUT ps_main( PS_INPUT In )
{
PS_OUTPUT Out;
float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5;
float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction));
float fresnel = In.fresnel;
// float fresnel = abs(normalize(In.normal).z);
Out.color = lerp(reflection, refraction, fresnel) * pow(1.0 - fresnel * 0.75, 1.0);
return Out;
}
technique blur_ps_vs_2_0
{
pass P0
{
VertexShader = compile vs_2_0 vs_main();
PixelShader = compile ps_2_0 ps_main();
}
}