図0011a
Texture2D g_texture : register(t0); SamplerState g_sampler : register(s0); float4 main(PSPNTInput input) : SV_TARGET { //法線ライティング float3 lightdir = normalize(LightDir.xyz); float3 N1 = normalize(input.norm); float4 Light = saturate(dot(N1, -lightdir) * Diffuse) + Emissive; Light.a = Diffuse.a; //テクスチャを設定 Light = g_texture.Sample(g_sampler, input.tex) * Light; return saturate(Light); }
float4 main(PSPNTInput input) : SV_TARGET
{
//法線ライティング
float3 lightdir = normalize(LightDir.xyz);
float3 N1 = normalize(input.norm);
float4 Light = saturate(dot(N1, -lightdir) * Diffuse);
Light.a = Diffuse.a;
//テクスチャを設定
Light = g_texture.Sample(g_sampler, input.tex) * Light;
return saturate(Light + Emissive);
}
void CubeObject::OnDraw() {
auto Dev = App::GetApp()->GetDeviceResources();
auto pD3D11DeviceContext = Dev->GetD3DDeviceContext();
auto RenderState = Dev->GetRenderState();
//行列の定義
Mat4x4 World, View, Proj;
//ワールド行列の決定
World.affineTransformation(
m_Scale, //スケーリング
Vec3(0, 0, 0), //回転の中心(重心)
m_Qt, //回転角度
m_Pos //位置
);
//転置する
World.transpose();
//ビュー行列の決定
View = XMMatrixLookAtLH(Vec3(0, 2.0, -5.0f), Vec3(0, 0, 0), Vec3(0, 1.0f, 0));
//転置する
View.transpose();
//射影行列の決定
float w = static_cast<float>(App::GetApp()->GetGameWidth());
float h = static_cast<float>(App::GetApp()->GetGameHeight());
Proj = XMMatrixPerspectiveFovLH(XM_PIDIV4, w / h, 1.0f, 100.0f);
//転置する
Proj.transpose();
//コンスタントバッファの準備
PNTStaticConstantBuffer sb;
sb.World = World;
sb.View = View;
sb.Projection = Proj;
//ライティング
Vec4 LightDir(0.5f, -1.0f, 0.5f, 0.0f);
LightDir.normalize();
sb.LightDir = LightDir;
//ディフューズ
sb.Diffuse = Col4(1.0f, 1.0f, 1.0f, 1.0f);
//エミッシブ加算。
sb.Emissive = Col4(0.4f, 0.4f, 0.4f, 0);
//コンスタントバッファの更新
pD3D11DeviceContext->UpdateSubresource(CBPNTStatic::GetPtr()->GetBuffer(), 0, nullptr, &sb, 0, 0);
//ストライドとオフセット
UINT stride = sizeof(VertexPositionNormalTexture);
UINT offset = 0;
//頂点バッファのセット
pD3D11DeviceContext->IASetVertexBuffers(0, 1,
m_CubeMesh->GetVertexBuffer().GetAddressOf(), &stride, &offset);
//インデックスバッファのセット
pD3D11DeviceContext->IASetIndexBuffer(m_CubeMesh->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0);
//描画方法(3角形)
pD3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
//コンスタントバッファの設定
ID3D11Buffer* pConstantBuffer = CBPNTStatic::GetPtr()->GetBuffer();
ID3D11Buffer* pNullConstantBuffer = nullptr;
//頂点シェーダに渡す
pD3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer);
//ピクセルシェーダに渡す
pD3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer);
//シェーダの設定
pD3D11DeviceContext->VSSetShader(VSPNTStatic::GetPtr()->GetShader(), nullptr, 0);
pD3D11DeviceContext->PSSetShader(PSPNTStatic::GetPtr()->GetShader(), nullptr, 0);
//インプットレイアウトの設定
pD3D11DeviceContext->IASetInputLayout(VSPNTStatic::GetPtr()->GetInputLayout());
//ブレンドステート
if (m_Trace) {
//透明処理
pD3D11DeviceContext->OMSetBlendState(RenderState->GetAlphaBlendEx(), nullptr, 0xffffffff);
}
else {
//透明処理しない
pD3D11DeviceContext->OMSetBlendState(RenderState->GetOpaque(), nullptr, 0xffffffff);
}
//デプスステンシルステート
pD3D11DeviceContext->OMSetDepthStencilState(RenderState->GetDepthDefault(), 0);
//テクスチャとサンプラーの設定
ID3D11ShaderResourceView* pNull[1] = { 0 };
pD3D11DeviceContext->PSSetShaderResources(0, 1,
m_TextureResource->GetShaderResourceView().GetAddressOf());
ID3D11SamplerState* pSampler = RenderState->GetLinearClamp();
pD3D11DeviceContext->PSSetSamplers(0, 1, &pSampler);
if (m_Trace) {
//透明処理の場合は、ラスタライザステートを変更して2回描画
//ラスタライザステート(裏面描画)
pD3D11DeviceContext->RSSetState(RenderState->GetCullFront());
//描画
pD3D11DeviceContext->DrawIndexed(m_CubeMesh->GetNumIndicis(), 0, 0);
//ラスタライザステート(表面描画)
pD3D11DeviceContext->RSSetState(RenderState->GetCullBack());
//描画
pD3D11DeviceContext->DrawIndexed(m_CubeMesh->GetNumIndicis(), 0, 0);
}
else {
//ラスタライザステート(表面描画)
pD3D11DeviceContext->RSSetState(RenderState->GetCullBack());
//描画
pD3D11DeviceContext->DrawIndexed(m_CubeMesh->GetNumIndicis(), 0, 0);
}
//後始末
Dev->InitializeStates();
}