このブログを検索

2019年12月16日月曜日

【C++】 DirectX11 - ライト改良(Phongの反射モデル)

【C++】 DirectX11 - ライト改良(Phongの反射モデル)
(2019年12月16日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.以下の6つのファイルを作成してビルドを行う。
(1)Main.h
(2)Main.cpp
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

(1)~(5)コード非公開

(6)PixelShader.hlsl
cbuffer ConstantBuffer : register(b0)
{
    matrix world;
    matrix view;
    matrix projection;
    float4 lightpos;
    float4 eyepos;
}

struct VS_OUTPUT
{
    float4 pos : SV_POSITION;
    float3 normal : NORMAL0;
};

//--------------------------------------------------------------------------------------
// ピクセルシェーダ
//--------------------------------------------------------------------------------------
float4 main(VS_OUTPUT input) : SV_TARGET
{
    //アンビエント
    float3 ambient = float3(1.0f, 1.0f, 0.0f) * 0.6f;

    //ディフューズ
    float3 L = normalize(lightpos.xyz);
    float3 N = normalize(input.normal);
    float NL = dot(N, L);
    float3 diffuse = float3(1.0f, 1.0f, 1.0f) * saturate(NL) * 0.3f;

    //スペキュラ
    float3 R = 2.0f * N * NL - L;
    float3 V = normalize(eyepos.xyz - input.normal);
    float RV = saturate(dot(R, V));
    float3 specular = float3(1.0f, 1.0f, 1.0f) * pow(RV, 10.0f) * 0.15f;

    return float4(ambient + diffuse + specular, 1.0f);
}


6.実行結果


■参考文献
~プログラミング~ DirectX 11でフォン反射モデル

0 件のコメント:

コメントを投稿