Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- float4x4 mProj;
- float4x4 mView;
- float4x4 mWorldMatrixArray;
- int lightCount = 0;
- float4 lightAmbient[3] : LIGHTARRAYAMBIENT;
- float4 lightDiffuse[3] : LIGHTARRAYDIFFUSE;
- float4 lightDir[3] : LIGHTARRAYDIR;
- float4 CamPos = 0.0f;
- float4 mtrAmbient : MATERIALAMBIENT;
- float4 mtrDiffuse : MATERIALDIFFUSE;
- float4 Ambient;
- bool Skinning = 0;
- bool CanDiffuse = 0;
- bool CanFog = 0;
- float4 Fog;
- float4 FogColor : FOGCOLOR;
- float3x3 TexTrans;
- float3x3 TexTrans2;
- texture t;
- sampler samp =
- sampler_state
- {
- Texture = <t>;
- MinFilter = POINT;
- MagFilter = POINT;
- MipFilter = NONE;
- AddressU = CLAMP;
- AddressV = CLAMP;
- };
- sampler2D samp1 : register(s0);
- sampler2D samp2 : register(s1);
- struct VS_INPUT
- {
- float3 vPosition : POSITION0;
- float3 BlendWeights : BLENDWEIGHT;
- float4 BlendIndices : BLENDINDICES;
- float3 vNormal : NORMAL0;
- float2 vUV : TEXCOORD0;
- };
- struct VS_OUTPUT
- {
- float4 vPosition : POSITION0;
- float4 Diffuse : COLOR0;
- float2 vUV : TEXCOORD0;
- float2 vUV2 : TEXCOORD1;
- float3 vNormal : NORMAL0;
- float3 vCamDir : NORMAL1;
- float3 vLightDir : NORMAL2;
- float vFog : FOG;
- };
- float4x4 getMatrix(int nIdx)
- {
- if (!Skinning)
- return mWorldMatrixArray;
- float fIdx = ((float) nIdx / 256.0f);
- float4x4 m = float4x4(
- tex2Dlod(samp, float4(float2(0.0, fIdx), 0.0f, 0.0f)),
- tex2Dlod(samp, float4(float2(1.0f / 3.0f, fIdx), 0.0f, 0.0f)),
- tex2Dlod(samp, float4(float2(2.0f / 3.0f, fIdx), 0.0f, 0.0f)),
- tex2Dlod(samp, float4(float2(1.0f, fIdx), 0.0f, 0.0f)));
- return m;
- }
- float3 getMulSkinnedPos(float3 vPos, int nIdx, float fWeight,float4x4 mWord)
- {
- if (nIdx == 0)
- return (mul(float4(vPos, 1.0f), mWord) * fWeight).xyz;
- return (mul(float4(vPos, 1.0f), getMatrix(nIdx)) * fWeight).xyz;
- }
- float4 getDiffuse(float3 pos,float3 normal)
- {
- float4 Diffuse = Ambient;
- for (int i = 0; i < lightCount; i++)
- {
- if (CanDiffuse)
- {
- if (lightDir[i].w < 0.0f)
- {
- // Point Light
- float fDist = distance(lightDir[i].xyz, pos);
- float lMul = fDist * lightAmbient[i].x;
- if (lMul < 1.0f)
- {
- float3 fColor = lerp(0.f, lightDiffuse[i].xyz, lMul);
- float3 normlPos = normalize(lightDir[i].xyz);
- float fIntenzity = max(-dot(normal, normlPos), 0.0f);
- float3 mulVar = (fIntenzity * mtrDiffuse.xyz) * fColor;
- Diffuse.xyz += mulVar;
- }
- }
- else
- {
- //Direction Light
- float fIntenzity = saturate(-dot(normal, lightDir[i].xyz));
- float4 mulVar = fIntenzity * mtrDiffuse * lightDiffuse[i];
- Diffuse += max(mulVar, mtrAmbient * lightAmbient[i]);
- }
- }
- else
- Diffuse += mtrAmbient * lightAmbient[i];
- }
- return saturate(float4(Diffuse.xyz, mtrDiffuse.w));
- }
- VS_OUTPUT VSkin(VS_INPUT Input)
- {
- VS_OUTPUT Output;
- float3 Position = float3(0.0f, 0.0f, 0.0f);
- float3 Normal = 0.0f;
- float4x4 mWorld = getMatrix(0);
- if (Skinning)
- {
- int4 aiIndices = D3DCOLORtoUBYTE4(Input.BlendIndices);
- float fWeight = 1.0f;
- for (int i = 0; i < 3; i++)
- {
- if(Input.BlendWeights[i] > 0.0f)
- {
- Position += getMulSkinnedPos(Input.vPosition, aiIndices[i], Input.BlendWeights[i],mWorld);
- fWeight -= Input.BlendWeights[i];
- }
- }
- if(fWeight)
- {
- Position += getMulSkinnedPos(Input.vPosition, aiIndices[3], fWeight,mWorld);
- }
- }
- else
- {
- Position = Position = mul(float4(Input.vPosition, 1.0f), mWorld);
- }
- Normal = mul(Input.vNormal, (float3x3) mWorld);
- Output.vCamDir = Position - CamPos.xyz;
- Output.vPosition = mul(float4(Position, 1.0f), mView);
- Output.vFog = CanFog ? Fog.w < 0.0f ? saturate((Fog.y - Output.vPosition.z) / (Fog.y - Fog.x)) : (length(Output.vPosition.xyz) * Fog.z) : 1;
- Output.vPosition = mul(Output.vPosition, mProj);
- Output.vNormal = normalize(Normal);
- Output.vLightDir = lightDir[0].xyz;
- Output.Diffuse = getDiffuse(Position,Output.vNormal);
- Output.vUV = mul(float3(Input.vUV, 1.0f), TexTrans).xy;
- Output.vUV2 = mul(float3(Input.vUV, 1.0f), TexTrans2).xy;
- return Output;
- }
- float4 TextureFactor;
- float4 PixelArg;
- uint nPsShader;
- float4 comp(float Arg, float4 c , float4 t)
- {
- return Arg >= 0 ? c : t;
- }
- float4 PixelShaderFunction(VS_OUTPUT Input): COLOR0
- {
- float4 colorTex1 = comp(PixelArg.x, tex2D(samp1, Input.vUV), TextureFactor);
- float4 colorTex2 = comp(PixelArg.y, tex2D(samp2, Input.vUV2), TextureFactor);
- float4 color = 0;
- switch (nPsShader)
- {
- case 0:
- {
- color = colorTex1;
- }
- break;
- case 1:
- {
- color = (colorTex1 * colorTex2);
- }
- break;
- case 2:
- {
- color = (colorTex1 * 2.0f) * colorTex2;
- }
- break;
- case 3:
- {
- color = (colorTex1 * 4.0f) * colorTex2;
- }
- break;
- case 4:
- {
- color = (colorTex1 + colorTex2);
- }
- break;
- case 5:
- {
- color = colorTex1 + colorTex2 - 0.5f;
- }
- break;
- case 6:
- {
- color = float4((2 * (colorTex1 + colorTex2 - 0.5f)).xyz, colorTex1.w);
- }
- break;
- case 7:
- {
- color = (colorTex1 - colorTex2);
- }
- break;
- case 8:
- {
- color = (mad(-colorTex1, colorTex2, colorTex2) + colorTex2);
- }
- break;
- case 9:
- {
- float blend = 1 - Input.Diffuse.w;
- float4 colb = colorTex1 * Input.Diffuse.wwww;
- color = mad(colorTex2, blend, colb);
- }
- break;
- case 10:
- {
- float blend = 1 - colorTex2.w;
- float4 colb = colorTex1 * colorTex2.w;
- color = mad(colorTex2, blend, colb);
- }
- break;
- case 11:
- {
- float blend = 1 - TextureFactor.w;
- float4 colb = colorTex1 * TextureFactor.w;
- color = mad(colorTex2, blend, colb);
- }
- break;
- case 12:
- {
- float blend = 1 - colorTex2.w;
- color = mad(colorTex2, blend, colorTex1);
- }
- break;
- case 13:
- {
- float blend = 1 - colorTex1.w;
- float4 colb = colorTex1 * colorTex1.w;
- color = mad(colorTex2, blend, colb);
- }
- break;
- case 14:
- {
- float3 blend = mad(colorTex2, colorTex1.wwww, colorTex1);
- color = float4(blend, colorTex1.w);
- }
- break;
- case 15:
- {
- float4 blend = mad( colorTex1,colorTex2, colorTex1.wwww);
- color = float4(blend.xyz, colorTex1.w);
- }
- break;
- case 16:
- {
- float blend = 1 - colorTex1.w;
- float3 col = mad(colorTex2, blend, colorTex1);
- color = float4(col, colorTex1.w);
- }
- break;
- case 17:
- {
- float4 blend = 1 - colorTex1;
- float3 colr = mad(colorTex2, blend, colorTex1.wwww);
- color = float4(colr, colorTex1.w);
- }
- break;
- case 18:
- {
- color = dot(colorTex1, colorTex2);
- }
- break;
- case 19:
- {
- color = mad(colorTex1, colorTex2, colorTex1);
- }
- break;
- case 20:
- {
- color = lerp(colorTex1, colorTex2, colorTex1);
- }
- break;
- case 21:
- {
- //Set alpha and specular color
- float rcp = 1 / 257.0f;
- float idk = mad(256.0f, colorTex2.y, colorTex2.z) * rcp;
- float alpha = mad(256.0f, colorTex2.w, colorTex2.x);
- colorTex1.w = alpha * rcp;
- //Compute specular color
- float3 View = normalize(Input.vCamDir) - lightDir[0].xyz;
- float3 Colr = normalize(View);
- float3 Normal = normalize(Input.vNormal);
- float sColor = dot(Colr, Normal);
- sColor = max(sColor, 0.0f);
- sColor = pow(sColor, PixelArg.z);
- color = mad(idk, sColor, colorTex1);
- }
- break;
- }
- float4 finalTex = float4(color.xyz * Input.Diffuse.xyz, min(color.w,Input.Diffuse.w));
- if (!CanFog || Input.vFog > 0.9999f)
- return finalTex;
- return float4(lerp(FogColor.xyz, finalTex.xyz, Input.vFog), finalTex.w);
- }
- technique TSkinning
- {
- pass p0
- {
- VertexShader = compile vs_3_0 VSkin();
- PixelShader = compile ps_3_0 PixelShaderFunction();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement