mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
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.
120 lines
2.3 KiB
HLSL
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();
|
|
}
|
|
}
|