이번엔 멀티패스.
어제까지 만든 녀석을 렌더타겟으로 출력하고,
이번엔 배경을 만들어서 렌더타겟으로 출력해서 합성시켰다.
근데 왜 모델을 ScreenAlignedQuad 로 하면 안되냐고!!!!
왜 Sphere에다가 해야 ScreenAlignedQuad 모양이 나오는 거냐곳!!!
거기다가 왜 예제에는 렌더 순서가 Model -> Back 순서인 거냣!
그렇게 하면 안나오잖았
아마도 위 문제 때문에 그런게 아닐까라고도 생각하지만.
어쨌거나 Back-> Model 순서로 그려서 해결. 상식적으로도 이게 맞나.
하여간 원래 모습
여기에 배경 추가해서 합성
다시 이걸 텍스쳐로 pass 따 내서 pow 함수로 밝기 올려줌.
이번엔 3패스라 코드가 열라 길다.
//Drawback Vertex
float4x4 matViewProjection;
struct VS_INPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
//Output.Position = mul (matViewProjection, float4(Input.Position.xyz,1.0f));
//Output.Texcoord = Input.Texcoord;
Input.Position.xy = sign (Input.Position.xy);
Output.Position = float4 (Input.Position.xy, 1.0f, 1.0f);
Output.Texcoord = (float2(Output.Position.x , - Output.Position.y)+1.0f)/2.0f;
return( Output );
}
//drawback pixel
sampler2D Texture0;
float4 ps_main(float2 Texcoord : TEXCOORD0) : COLOR0
{
float4 c0 = tex2D(Texture0, Texcoord);
return c0;
}
//DrawMesh Vertex
float3 fvLightPosition;
float3 fvEyePosition;
float4x4 matView;
float4x4 matViewProjection;
struct VS_INPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
float3 Normal : NORMAL0;
float3 Binormal : BINORMAL0;
float3 Tangent : TANGENT0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
float3 ViewDirection : TEXCOORD1;
float3 LightDirection : TEXCOORD2;
};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
Output.Position = mul( Input.Position, matViewProjection );
Output.Texcoord = Input.Texcoord;
float3 fvObjectPosition = mul (matView,Input.Position);
float3 fvViewDirection = fvEyePosition - fvObjectPosition;
float3 fvLightDirection = fvLightPosition - fvObjectPosition;
float3 fvNormal = mul(matView, Input.Normal );
float3 fvBinormal = mul(matView, Input.Binormal);
float3 fvTangent = mul(matView, Input.Tangent );
Output.ViewDirection.x = dot(fvTangent,fvViewDirection);
Output.ViewDirection.y = dot(fvBinormal,fvViewDirection);
Output.ViewDirection.z = dot(fvNormal,fvViewDirection);
Output.LightDirection.x = dot(fvTangent,fvLightDirection);
Output.LightDirection.y = dot(fvBinormal,fvLightDirection);
Output.LightDirection.z = dot(fvNormal,fvLightDirection);
return( Output );
}
//DrawMesh Pixel
float4 fvAmbient;
float4 fvSpecular;
float4 fvDiffuse;
float fSpecularPower;
sampler2D baseMap;
sampler2D bumpMap;
struct PS_INPUT
{
float2 Texcoord : TEXCOORD0;
float3 ViewDirection : TEXCOORD1;
float3 LightDirection : TEXCOORD2;
};
float4 ps_main(PS_INPUT Input) : COLOR0
{
float3 fvLightDirection = normalize (Input.LightDirection);
float3 fvNormal = normalize ((tex2D(bumpMap,Input.Texcoord).xyz *2.0f)-1.0f);
float fNDotL = dot (fvNormal, fvLightDirection);
float3 fvReflection = normalize (((2.0*fvNormal)*(fNDotL))-fvLightDirection);
float3 fvViewDirection = normalize (Input.ViewDirection );
float fRDotV = max(0.0f,dot(fvReflection,fvViewDirection));
float4 fvBaseColor = tex2D (baseMap,Input.Texcoord);
float4 fvTotalAmbient = fvAmbient * fvBaseColor;
float4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor;
float4 fvTotalSpecular = fvSpecular * pow(fRDotV,fSpecularPower);
return saturate (fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular);
}
//DrawPower Vertex
struct VS_INPUT
{
float4 Position : POSITION0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
Input.Position.xy = sign (Input.Position.xy);
Output.Position = float4 (Input.Position.xy, 0.0f, 1.0f);
Output.Texcoord = (float2(Output.Position.x , - Output.Position.y)+1.0f)/2.0f;
return( Output );
}
//DrawPower Pixel
float fPower;
sampler2D Texture0;
float4 ps_main(float2 Texcoord : TEXCOORD0) : COLOR0
{
float4 c0 = tex2D(Texture0, Texcoord);
c0 = pow (c0, fPower);
return c0;
}
구조는 이렇다.