図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(); }