//-------------------------------------------------------------------------------------- // void RenderState::Impl::CreateRasterizerState( // D3D11_CULL_MODE cullMode, //カリング // D3D11_FILL_MODE fillMode, //塗り // ID3D11RasterizerState** pResult, //受け取るインターフェイス // bool Scissor = false //画面分割するかどうか // ); // 用途: ラスタライザステートを作成するヘルパー関数 // 戻り値: なし //-------------------------------------------------------------------------------------- void RenderState::Impl::CreateRasterizerState(D3D11_CULL_MODE cullMode, D3D11_FILL_MODE fillMode, ID3D11RasterizerState** pResult, bool Scissor){ try{ auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); D3D11_RASTERIZER_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.CullMode = cullMode; desc.FillMode = fillMode; desc.DepthClipEnable = true; desc.MultisampleEnable = true; desc.ScissorEnable = Scissor; HRESULT hr = pDx11Device->CreateRasterizerState(&desc, pResult); if (FAILED(hr)){ // 初期化失敗 throw BaseException( L"ラスタライザステート作成に失敗しました。", L"if(FAILED(pDx11Device->CreateRasterizerState()))", L"RenderState::Impl::CreateRasterizerState()" ); } } catch (...){ throw; } }
HRESULT CPlanBuffer::Init() { m_nVtxNum = 4; m_nVtxStride = sizeof(VertexTexture); m_nVtxOffset = 0; m_nIdxNum = 6; m_nIdxStart = 0; m_nIdxPlus = 0; Init_Vtx(); Init_Idx(); Init_TextureShader(); CreateRasterizerState(); return S_OK; }
static inline int UpdateRasterState(GIDevice *icontext) { struct pipe_context *context; if ((context = icontext->context) == NULL) { return GI_ERROR; } void *rs_state; ClearRasterState(icontext); struct pipe_rasterizer_state rstate; memset(&rstate, 0, sizeof(rstate)); rstate.line_width = 4.0f; rstate.line_smooth = 1; rstate.gl_rasterization_rules = 1; if ((rs_state = CreateRasterizerState(context, &rstate)) == NULL) { return 0; } context->bind_rasterizer_state(context, rs_state); icontext->rs_state = rs_state; return 1; }
// ╔════════════════════════════════════════════════════════════════════════════════════╗ // ║ Constructor and Destructor. ║ // ╚════════════════════════════════════════════════════════════════════════════════════╝ Shader::Shader(ID3D11Device* p_device, HWND p_windowHandle) { // Set variables to initial values. m_matrixBuffer = 0; m_lightSourceBuffer = 0; m_lightBuffer = 0; m_vertexShader = 0; m_pixelShader = 0; m_layout = 0; m_samplerState = 0; m_shadowMapSamplerState = 0; m_rasterizerState = 0; // Compile and create the shaders. CreateVertexShader(p_device); CreatePixelShader(p_device); // Create the states. CreateRasterizerState(p_device); CreateSamplerStates(p_device); // Setup buffers. SetupBuffers(p_device); }
//-------------------------------------------------------------------------------------- // class ShadowMapRenderTarget: public RenderTarget; // 用途: シャドウマップのレンダリングターゲット //-------------------------------------------------------------------------------------- //構築と破棄 ShadowMapRenderTarget::ShadowMapRenderTarget(float ShadowMapDimension) : pImpl(new Impl(ShadowMapDimension)) { try{ //デバイスとコンテキストインターフェイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pSwapChain = Dev->GetSwapChain(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //シャドウマップテクスチャの作成 D3D11_TEXTURE2D_DESC shadowMapDesc; ZeroMemory(&shadowMapDesc, sizeof(D3D11_TEXTURE2D_DESC)); shadowMapDesc.Width = static_cast<UINT>(pImpl->m_ShadowMapDimension); shadowMapDesc.Height = static_cast<UINT>(pImpl->m_ShadowMapDimension); shadowMapDesc.MipLevels = 1; shadowMapDesc.ArraySize = 1; shadowMapDesc.SampleDesc.Count = 1; shadowMapDesc.Usage = D3D11_USAGE_DEFAULT; shadowMapDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; shadowMapDesc.Format = DXGI_FORMAT_R24G8_TYPELESS; ThrowIfFailed( pD3D11Device->CreateTexture2D(&shadowMapDesc, nullptr, &pImpl->m_DepthStencil), L"シャドウマップテクスチャの作成に失敗しました。", L"pD3D11Device->CreateTexture2D(&shadowMapDesc, nullptr, &m_DepthStencil)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //深度ステンシルビュー作成 D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc; ZeroMemory(&depthStencilViewDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC)); depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; depthStencilViewDesc.Texture2D.MipSlice = 0; ThrowIfFailed( pD3D11Device->CreateDepthStencilView(pImpl->m_DepthStencil.Get(), &depthStencilViewDesc, &pImpl->m_DepthStencilView), L"深度ステンシルビューの作成に失敗しました。", L"pD3D11Device->CreateDepthStencilView(&m_DepthStencil, &depthStencilViewDesc, &m_DepthStencilView)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //シェーダーリソースビュー作成 D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; ZeroMemory(&shaderResourceViewDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC)); shaderResourceViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; shaderResourceViewDesc.Texture2D.MipLevels = 1; ThrowIfFailed( pD3D11Device->CreateShaderResourceView(pImpl->m_DepthStencil.Get(), &shaderResourceViewDesc, &pImpl->m_ShaderResourceView), L"シェーダーリソースビューの作成に失敗しました。", L"pD3D11Device->CreateShaderResourceView(m_DepthStencil.Get(), &shaderResourceViewDesc, &m_ShaderResourceView)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); D3D11_RASTERIZER_DESC shadowRenderStateDesc; ZeroMemory(&shadowRenderStateDesc, sizeof(D3D11_RASTERIZER_DESC)); shadowRenderStateDesc.CullMode = D3D11_CULL_FRONT; shadowRenderStateDesc.FillMode = D3D11_FILL_SOLID; shadowRenderStateDesc.DepthClipEnable = true; ThrowIfFailed(pD3D11Device->CreateRasterizerState(&shadowRenderStateDesc,&pImpl->m_ShadowRenderState), L"シャドウマップのラスタライザステートの作成に失敗しました。", L"pD3D11Device->CreateRasterizerState(&shadowRenderStateDesc,&pImpl->m_ShadowRenderState)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //ビューポートの作成 //シャドウレンダリングビューポート ZeroMemory(&pImpl->m_ViewPort, sizeof(D3D11_VIEWPORT)); pImpl->m_ViewPort.Height = pImpl->m_ShadowMapDimension; pImpl->m_ViewPort.Width = pImpl->m_ShadowMapDimension; pImpl->m_ViewPort.MinDepth = 0.f; pImpl->m_ViewPort.MaxDepth = 1.f; } catch (...){ throw; } }