Deferred shading at Direct3D11 (0)

I'm currently writing a test program for deferred shading at Direct3D11.
Direct3D11 で GBuffer を生成して, Deferred shading を行うテストプログラムを作成中です.


Debug draw of normal buffer in world coordinate.
ワールド座標系の法線を書き込んだバッファの可視化.



Debug draw of position buffer in world coordinate.
ワールド座標系の位置座標を書き込んだバッファの可視化.



Result of diffuse lighting using the G-Buffer and a single directional light.
GBuffer とディレクショナルライトでライティングを行った結果.



Debug draw of diffuse albedo texture.
Diffuse Albedo テクスチャを書き込んだバッファの可視化.


Debug draw of specular albedo texture.
Specular Albedo テクスチャを書き込んだバッファの可視化.

//--------------------------------------------------------------------------------------
//
// Dx11GBufferLightPrepass.hlsl                  ( hanecci 2011/12/30 )
//
//--------------------------------------------------------------------------------------

cbuffer cbTransformMatrix : register( b0 )
{
    float4x4        mWorldViewProjectionMatrix : packoffset( c0 );
    float4x4        mWorldViewMatrix           : packoffset( c4 );
    float4x4        mProjectionMatrix          : packoffset( c8 );
    float4x4        mWorldMatrix               : packoffset( c12 );
    float4x4        mViewProjectionMatrix      : packoffset( c16 );
};

//--------------------------------------------------------------------------------------

struct VS_INPUT
{
    float4 vPosition    : POSITION;
    float3 vNormal      : NORMAL;
};

//--------------------------------------------------------------------------------------

struct VS_OUTPUT
{
    float4 vPositionCS  : SV_Position;
    float3 vNormalWS    : NORMALWS;
    float3 vPositionWS  : POSITIONWS;
};

//--------------------------------------------------------------------------------------

struct PS_INPUT
{
    float4 vPositionSS : SV_Position;
    float3 vNormalWS   : NORMALWS;
    float3 vPositionWS : POSITIONWS;
};

//--------------------------------------------------------------------------------------

struct PS_OUTPUT
{
    float4 vNormal         : SV_Target0;
    float4 vPosition       : SV_Target1;
};

//--------------------------------------------------------------------------------------

VS_OUTPUT MainVS( VS_INPUT input )
{
    VS_OUTPUT output;

    output.vPositionWS = mul( input.vPosition, mWorldMatrix ).xyz;

    output.vNormalWS   = normalize( mul( input.vNormal, 
                                        ( float3x3 ) mWorldMatrix ) );

    output.vPositionCS = mul( input.vPosition,
                              mWorldViewProjectionMatrix );

    return output;
}

//--------------------------------------------------------------------------------------

PS_OUTPUT MainPS( PS_INPUT input )
{
    PS_OUTPUT output;

    output.vPosition = float4( input.vPositionWS, 0.2f );

    float3 normalWS  = normalize( input.vNormalWS );
    output.vNormal   = float4( normalWS, 0.4f );

    return output;
}

//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
//
// Dx11DeferredShading.hlsl ( hanecci, 2011/12/31 )
//
//--------------------------------------------------------------------------------------

Texture2D    mNormalTexture   : register( t1 );
Texture2D    mPositionTexture : register( t2 );

//--------------------------------------------------------------------------------------

static const float3 cLightDir           = float3( 0.0f, -1.0f, 0.0f );
static const float3 cLightDiffuseColor  = float3( 1.0f, 1.0f, 1.0f );
static const float3 cLightSpecularColor = float3( 1.0f, 1.0f, 1.0f );

//--------------------------------------------------------------------------------------

struct VS_Input
{
    float3 vPosition  : POSITION;
    float2 vTexcoord0 : TEXCOORD0;
};

//--------------------------------------------------------------------------------------

struct PS_Input
{
    float4 vPosition  : SV_Position;
};

//--------------------------------------------------------------------------------------

PS_Input MainVS( VS_Input vs_input )
{
    PS_Input ps_input   = ( PS_Input ) 0;
    ps_input.vPosition  = float4( vs_input.vPosition, 1.0f );

    return ps_input;
}

//--------------------------------------------------------------------------------------

void
getGBufferAttributes( in  float2 screenPos,
                      out float3 normal,
                      out float3 position )
{
    int3 sampleIndices = int3( screenPos.xy, 0 );

    normal   = mNormalTexture.Load( sampleIndices ).xyz;
    position = mPositionTexture.Load( sampleIndices ).xyz;
}

//--------------------------------------------------------------------------------------

float3
calcDirectionalLighting( float3 worldNormal,
                         float3 worldPosition,
                         float3 lightWorldDir,
                         float3 lightDiffuseColor,
                         float3 lightSpecularColor )
{
    float3 color = float3( 0.0f, 0.0f, 0.0f );

    float3 lightDir = - lightWorldDir;

    float dotValue  = max( dot( lightDir, worldNormal ), 0.0f );

    color = dotValue * lightDiffuseColor;

    return color;
}

//--------------------------------------------------------------------------------------

float4
MainPS( PS_Input ps_input ) : SV_Target
{
    float3 worldNormal;
    float3 worldPosition;

    getGBufferAttributes( ps_input.vPosition.xy,
                          worldNormal,
                          worldPosition );


    float4 color = float4( 0.0f, 0.0f, 0.0f, 1.0f );

    color.xyz = calcDirectionalLighting( worldNormal,
                                         worldPosition,
                                         cLightDir,
                                         cLightDiffuseColor,
                                         cLightSpecularColor );

    return color;
}

//--------------------------------------------------------------------------------------