Nanashi-soft○プログラマ専用○DirectX11開発○
//ポリゴン頂点構造体PMDからの読み込みデータ中には既に法線ベクトルはあるので,セットする部分を追加
struct Vertex3D {
float pos[3]; //頂点データ(x-y-z)
float col[4]; //マテリアル(r-g-b-a)
float tex[2]; //テクスチャー(x-y)
float nor[3]; //法線ベクトル(x-y-z)
};
//頂点レイアウト
//5番目のパラメータは先頭からのバイト数なので,COLORにはPOSITIONのfloat型4バイト×3を記述
D3D11_INPUT_ELEMENT_DESC hInElementDesc[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 4*3, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 4*3 + 4*4, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 4*3 + 4*4 + 4*2, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
for(int i=0; i < TYOUTEN; i++){法線ベクトルの計算は,光が当たったところと,影になったところを表すものだそうです
hVectorData[i].pos[0] = modeldata->vertex[i].pos[0];
hVectorData[i].pos[1] = modeldata->vertex[i].pos[1];
hVectorData[i].pos[2] = modeldata->vertex[i].pos[2];
hVectorData[i].col[0] = 0.0f;
hVectorData[i].col[1] = 0.0f;
hVectorData[i].col[2] = 0.0f;
hVectorData[i].col[3] = 0.0f;
hVectorData[i].tex[0] = modeldata->vertex[i].uv[0];
hVectorData[i].tex[1] = modeldata->vertex[i].uv[1];
hVectorData[i].nor[0] = modeldata->vertex[i].normal_vec[0];
hVectorData[i].nor[1] = modeldata->vertex[i].normal_vec[1];
hVectorData[i].nor[2] = modeldata->vertex[i].normal_vec[2];
}
struct ConstantBufferメインループで,光源も送り込みます
{
XMMATRIX mWorld;
XMMATRIX mView;
XMMATRIX mProjection;
XMFLOAT4 mLight;
};
XMFLOAT4 LightPos = XMFLOAT4(0.0f, 40.0f, -70.0f, 1.0f);……で,どういう計算をすればいいのか?
hConstantBuffer.mLight = LightPos;
//入力用次に,ピクセルシェーダーですが,マテリアルもテクスチャーもかければいいっぽいです(本当かどうかは不明)
struct vertexIn
{
float4 pos : POSITION0;
float4 col : COLOR0;
float2 tex : TEXCOORD0;
float3 nor : NORMAL0; //法線ベクトル
};
//出力用
struct vertexOut
{
float4 pos : SV_POSITION;
float4 col : COLOR;
float2 tex : TEXCOORD0;
float4 col2: COL2; //計算結果をピクセルシェーダーに送る用
};
//変換用行列
cbuffer ConstantBuffer : register( b0 )
{
matrix World; //ワールド変換行列
matrix View; //ビュー変換行列
matrix Projection; //透視射影変換行列
float4 Light; //ライト
}
vertexOut vs_main(vertexIn IN)
{
vertexOut OUT;
//頂点処理
OUT.pos = mul(IN.pos, World);
OUT.pos = mul(OUT.pos, View);
OUT.pos = mul(OUT.pos, Projection);
OUT.col = IN.col;
OUT.tex = IN.tex;
//光源処理
float3 L = normalize(Light.xyz);
//法線ベクトル処理
float3 nor;
//ワールド変換
nor = mul(IN.nor, (float3x3)World);
nor = normalize(nor);
//光源と法線の内積を求める
OUT.col2 = dot(nor, L);
return OUT;
}
//入力用
struct pixcelIn
{
float4 pos : SV_POSITION;
float4 col : COLOR;
float2 tex : TEXCOORD0;
float4 col2: COL2;
};
Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );
float4 ps_main(pixcelIn IN) : SV_Target
{
pixcelIn OUT;
OUT.col = saturate(IN.col2) * txDiffuse.Sample(samLinear, IN.tex);
return OUT.col;
}
float4 ps_main2(pixcelIn IN) : SV_Target
{
pixcelIn OUT;
OUT.col = saturate(IN.col2) * IN.col;
return OUT.col;
}
//光源と法線の内積を求める
OUT.col2 = dot(nor, L);
OUT.col2.a = 1.0f; //α値を無効にする
return OUT;