DirectX11의 툰 셰이더

DirectX11로 간이적인 툰셰이더의 구현을 하고 싶습니다.

툰 셰이더란?





툰 셰이더는 이렇게 음영이 분명합니다. 애니메이션 톤의 게임 등에서 사용되고 있습니다.

ToonMap 클래스



툰 셰이더는 툰 셰이더에 대한 텍스처를 제공합니다.

확산 반사광 등은 계산에 의해 색을 결정합니다만, 툰 셰이더는 이 텍스처로부터 색을 결정합니다.
조명을 계산한 후 UV 좌표의 X 성분으로 값을 이 이미지에서 조명 값을 가져옵니다.

ToonMap.h
ID3D11Device* g_d3dDevice;  //構築済みとする
ID3D11DeviceContext* g_d3dDeviceContext  //構築済みとする

public:
    ToonMap() {}
    ~ToonMap() {}

    //初期化
    void Init();
    //テクスチャをピクセルシェーダーに設定する、モデルをドローする時に呼んでください
    void SetShaderResourceView();
private:
    ID3D11ShaderResourceView* m_srv = nullptr; 

ToonMap.cpp
void ToonMap::Init()
{
    //テクスチャを読み込みます
    DirectX::CreateDDSTextureFromFile(
    g_d3dDevice, // D3Dデバイス
    L"Assets/shader/toonmap.dds",  //テクスチャのファイルパス
    nullptr,   //nullptrでいい
    &m_srv  //シェーダーリソースビュー
    );
}

void ToonMap::SetShaderResourceView()
{
    //ピクセルシェーダーにテクスチャを設定します。
    ID3D11ShaderResourceView* srvArray[]{
            m_SRV
    };
    d3dDeviceContext->PSSetShaderResources(4, 1, srvArray);
}

셰이더



model.fx
Texture2D<float4> toonMap : register(t4);  //toonシェーダー用のテクスチャー

//以下の実装と頂点シェーダーの実装は省きます
Texture2D<float4> albedoTexture : register(t0);  //モデルのテクスチャー
sampler Sampler : register(s0);  //サンプラー
//ディレクションライト
cbuffer LightCb : register(b1) {
    float3 dligDirection;
};
///ピクセルシェーダーの入力
struct PSInput{
    float3 Normal       : NORMAL;
    float2 TexCoord     : TEXCOORD0;
};

//ピクセルシェーダー
float4 PSMain( PSInput In ) : SV_Target0
{
    //モデルのテクスチャから色をフェッチする
    float4 color =  albedoTexture.Sample(Sampler, In.TexCoord);

    //ハーフランバート拡散照明によるライティング計算
    float p =  dot(In.Normal * -1.0f, dligDirection.xyz);
    p = p * 0.5f + 0.5f;
    p = p * p;

    //計算結果よりトゥーンシェーダー用のテクスチャから色をフェッチする
    float4 Col = toonMap.Sample(Sampler,float2(p,0.0f));

    //求まった色を乗算する
    return albedoColor *= Col.xyz;
}     

이 사이트를 참고로했습니다.
htp://진베리 ckp로j. 웨 b. FC2. 작은 m/pg35. html

좋은 웹페이지 즐겨찾기