新規記事の投稿を行うことで、非表示にすることが可能です。
2018年08月07日
《その433》シェーダ(平行光線の場合)(2)
シェーダ(平行光線の場合)
本ブログ《431》の続きです。
「VS2017 VC++ DirectX11アプリ(ユニバーサルWindows)」のサンプルアプリに陰影処理を加えるため、《431》では、
Sample3DSceneRenderer.cpp
に 頂点法線ベクトルのデータを加えました。
今回は、
ShaderStructures.h
SamplePixelShader.hlsl
SampleVertexShader.hlsl
の改変についてです(改変は ほんの一部だけです)。
SamplePixelShader.hlsl と SampleVertexShader.hlsl には、
float4 pos : SV_POSITION;
float3 nrm : NORMAL;
などの 見慣れない記述が出てきます。
これは、これらのファイルが HLSL というプログラム言語で書かれているためです。HLSL は C++ に似ているので、なんとなく分かる気がする言語です。
以下は、ShaderStructures.h のコードです。
#pragma once
namespace App20
{
// MVPマトリックスを頂点シェーダに送信するために使用する定数バッファ
// MVP_Matrix
// Model_Matrix(モデル変換行列), View_Matrix(ビュー変換行列), Projection_Matrix(プロジェクション変換行列)
struct ModelViewProjectionConstantBuffer
{
DirectX::XMFLOAT4X4 model;
DirectX::XMFLOAT4X4 view;
DirectX::XMFLOAT4X4 projection;
};
// 頂点シェーダへの頂点ごとのデータの送信に使用
struct VertexPositionColor
{
DirectX::XMFLOAT3 pos;
DirectX::XMFLOAT3 nrm;
};
}
以下は、SamplePixelShader.hlsl のコードです。
// ピクセルシェーダを通じて渡されるピクセルごとの色データ
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float3 nrm : NORMAL;
};
// (補間済み)色データのパススルー関数
float4 main(PixelShaderInput input) : SV_TARGET
{
// light処理をしたピクセルの色成分を返します。
float3 lightDirection = normalize(float3(1, -0.5, -0.2)); // 平行光線の方向ベクトルです。
float lightMagnitude = 0.6f * saturate(dot(input.nrm, -lightDirection)) + 0.4f;
return float4(0,1,0,0) * lightMagnitude;
}
以下は、SampleVertexShader.hlsl のコードです。
// ジオメトリを作成するために 3つの基本的な列優先のマトリックスを保存する定数バッファ
cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
matrix model;
matrix view;
matrix projection;
};
// 頂点シェーダへの入力として使用する頂点ごとのデータ
struct VertexShaderInput
{
float3 pos : POSITION;
float3 nrm : NORMAL;
};
// ピクセルシェーダを通じて渡されるピクセルごとの色データ
struct PixelShaderInput
{
float4 pos : SV_POSITION;
float3 nrm : NORMAL;
};
// GPU で頂点処理を行うための簡単なシェーダ
PixelShaderInput main(VertexShaderInput input)
{
PixelShaderInput output;
float4 pos = float4(input.pos, 1.0f);
pos = mul(pos, model);
pos = mul(pos, view);
pos = mul(pos, projection);
output.pos = pos;
float4 nrm = float4(normalize(input.nrm), 0.0f);
nrm = mul(nrm, model);
output.nrm = normalize(nrm.xyz);
return output;
}