|
float4 black={0.0f,0.0f,0.0f,0.0f};
uniform matrix mWVP;
uniform matrix mV;
uniform matrix mP;
uniform texture tex;
uniform texture toontex;
uniform float k;
uniform float4 LightDirection;
//实际纹理
sampler2D tt= sampler_state
{
Texture = <tex>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
//灰度图
sampler2D tx = sampler_state
{
Texture = <toontex>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
struct CVS_INPUT
{
float4 position : POSITION; //float4
float4 normal : NORMAL; //float3
float2 texcoord : TEXCOORD0;
};
struct CVS_OUTPUT
{
float4 position : POSITION;
float3 texcoord : TEXCOORD0;
};
CVS_OUTPUT CartoonVS(CVS_INPUT input)
{
CVS_OUTPUT output = (CVS_OUTPUT)0;
output.position = mul(input.position, mVP);
input.normal.w=0.0f;
LightDirection.w=0.0f;
//法向量转换到世界坐标
float3 worldNormal = (mul(input.normal, mWVP));
//光照方向转换到世界坐标
LightDirection = (mul(LightDirection, mWVP));
//得到光照与法向量的角度
float u = dot(LightDirection,worldNormal);
//保存角度
if( u < 0.0f )u = 0.0f;
output.texcoord =float3(input.texcoord,u);//float3(input.texcoord,0);
return output;
}
struct CPS_INPUT
{
float3 texcoord : TEXCOORD0;
};
struct CPS_OUTPUT
{
float4 color : COLOR;
};
CPS_OUTPUT CartoonPS(CPS_INPUT input)
{
CPS_OUTPUT output = (CPS_OUTPUT)0;
//通过阶层数计算灰度图的颜色
float4 vIntensity = tex2D(tt, input.texcoord.xy);
//与实际颜色合成
vIntensity *= tex2D(tx, float2(input.texcoord.z,0.5f)).r;
output.color =vIntensity;
return output;
}
struct OUTLINE_INPUT
{
float4 position : POSITION;
float4 normal : NORMAL0;
};
struct OUTLINE_OUTPUT
{
float4 position : POSITION;
float4 color : COLOR;
};
OUTLINE_OUTPUT Main(OUTLINE_INPUT input)
{
OUTLINE_OUTPUT output = (OUTLINE_OUTPUT)0;
input.position = mul(input.position, mWV);
input.normal.w = 0.0f;
input.normal = mul(input.normal, mWV);
input.position += k * input.normal;
output.position = mul(input.position, mP);
output.color = black;
return output;
}
technique CartoonTech
{
pass P0
{
VertexShader = compile vs_2_0 CartoonVS();
PixelShader = compile ps_2_0 CartoonPS();
}
pass P1
{
VertexShader = compile vs_2_0 Main();
PixelShader = NULL;
CullMode = CW;
}
}
这个HLSL 怎么翻译成OGRE脚本可以用的啊
是在搞不懂他那个脚本是怎么搞的,实验了好久好久都不行。[em7] [em7] [em7]
谢谢大家了!
|
|