「かげ」を付けよう
//頂点情報
struct VERTEX
{
XMVECTOR position;
XMVECTOR uv;
XMVECTOR normal;
};
//頂点インプットレイアウト
D3D11_INPUT_ELEMENT_DESC layout[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },//位置
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, sizeof(XMVECTOR) , D3D11_INPUT_PER_VERTEX_DATA, 0 },//UV座標
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, sizeof(XMVECTOR)*2 , D3D11_INPUT_PER_VERTEX_DATA, 0 },//法線
};
pDevice->CreateInputLayout(layout, 3, pCompileVS->GetBufferPointer(), pCompileVS->GetBufferSize(), &pVertexLayout);
VERTEX vertices[] =
{
{ XMVectorSet(-1.0f, 1.0f, -1.0f, 0.0f), XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f), XMVectorSet(●,▲,■, 0.0f) }, // 四角形の頂点(左上)
{ XMVectorSet(1.0f, 1.0f, -1.0f, 0.0f), XMVectorSet(0.25f, 0.0f, 0.0f, 0.0f), XMVectorSet(●,▲,■, 0.0f) }, // 四角形の頂点(右上)
{ XMVectorSet(1.0f, -1.0f, -1.0f, 0.0f), XMVectorSet(0.25f, 0.5f, 0.0f, 0.0f), XMVectorSet(●,▲,■, 0.0f) }, // 四角形の頂点(右下)
{ XMVectorSet(-1.0f,-1.0f, -1.0f, 0.0f), XMVectorSet(0.0f, 0.5f, 0.0f, 0.0f), XMVectorSet(●,▲,■, 0.0f) }, // 四角形の頂点(左下)
:
:
:
ランバートの余弦則を使って明るさを求める。
ピクセルシェーダーでやるほどの処理ではないので、頂点シェーダーで計算する。
求めた明るさとテクスチャの色を掛け算したものが最終的に表示する色になる。
//───────────────────────────────────────
// 頂点シェーダー出力&ピクセルシェーダー入力データ構造体
//───────────────────────────────────────
struct VS_OUT
{
float4 pos : SV_POSITION; //位置
float2 uv : TEXCOORD; //UV座標
float4 color : COLOR; //色(明るさ)
};
//───────────────────────────────────────
// 頂点シェーダ
//───────────────────────────────────────
VS_OUT VS(float4 pos : POSITION, float4 uv : TEXCOORD, float4 normal : NORMAL)
{
//ピクセルシェーダーへ渡す情報
VS_OUT outData;
//ローカル座標に、ワールド・ビュー・プロジェクション行列をかけて
//スクリーン座標に変換し、ピクセルシェーダーへ
outData.pos = mul(pos, matWVP);
outData.uv = uv;
float4 light = float4(-1, 0.5, -0.7, 0);
light = normalize(light);
outData.color = dot(normal, light);
//まとめて出力
return outData;
}
//───────────────────────────────────────
// ピクセルシェーダ
//───────────────────────────────────────
float4 PS(VS_OUT inData) : SV_Target
{
return g_texture.Sample(g_sampler, inData.uv) * inData.color;
}
ワールド行列を受けとって法線を変形させる
//───────────────────────────────────────
// コンスタントバッファ
// DirectX 側から送信されてくる、ポリゴン頂点以外の諸情報の定義
//───────────────────────────────────────
cbuffer global
{
float4x4 matWVP; // ワールド・ビュー・プロジェクションの合成行列
float4x4 matW; //ワールド行列
};
:
:
:
//───────────────────────────────────────
// 頂点シェーダ
//───────────────────────────────────────
VS_OUT VS(float4 pos : POSITION, float4 uv : TEXCOORD, float4 normal : NORMAL)
{
:
:
:
//法線を回転
normal = ●●●●●●●●●;
float4 light = float4(-1, 0.5, -0.7, 0);
light = normalize(light);
outData.color = dot(normal, light);
//まとめて出力
return outData;
}
<Quad.h>
//コンスタントバッファー
struct CONSTANT_BUFFER
{
XMMATRIX matWVP;
XMMATRIX matW;
};
<Quad.cpp>
void Quad::Draw(XMMATRIX& worldMatrix)
{
//コンスタントバッファに渡す情報
D3D11_MAPPED_SUBRESOURCE pdata;
CONSTANT_BUFFER cb;
cb.matWVP = XMMatrixTranspose(worldMatrix * Camera::GetViewMatrix() * Camera::GetProjectionMatrix());
cb.matW = ●●●●●●●●●●●●●●●;
Direct3D::pContext->Map(pConstantBuffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &pdata);
//───────────────────────────────────────
// 頂点シェーダ
//───────────────────────────────────────
VS_OUT VS(float4 pos : POSITION, float4 uv : TEXCOORD, float4 normal : NORMAL)
{
:
:
float4 light = float4(-1, 0.5, -0.7, 0);
light = normalize(light);
outData.color = clamp(dot(normal, light), 0, 1);
//まとめて出力
return outData;
}
//───────────────────────────────────────
// ピクセルシェーダ
//───────────────────────────────────────
float4 PS(VS_OUT inData) : SV_Target
{
float4 diffuse = g_texture.Sample(g_sampler, inData.uv) * inData.color;
float4 ambient = g_texture.Sample(g_sampler, inData.uv) * float4(0.2, 0.2, 0.2, 1);
return diffuse + ambient;
}