Featured image of post 셰이더 프로그래밍 기본공부 21_멀티패스

셰이더 프로그래밍 기본공부 21_멀티패스

이번엔 멀티패스.
어제까지 만든 녀석을 렌더타겟으로 출력하고,
이번엔 배경을 만들어서 렌더타겟으로 출력해서 합성시켰다.

근데 왜 모델을 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;
  
}

구조는 이렇다.

Hugo로 만듦
JimmyStack 테마 사용 중