void Panel::render(C6::UI::DC& dc) { dc.rectangle(0.f, m_position, m_background_colour); auto old_viewport = dc.pushCustomViewport(m_position); auto device = getDevice(); ID3D10DepthStencilView* dsv; device.getRawInterface()->OMGetRenderTargets(0, nullptr, &dsv); device.clearDepthStencilView(C6::D3::DepthStencilView(dsv), D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.f, 0); device.VSSetConstantBuffers(2, m_world_matrix_buffer); device.VSSetConstantBuffers(3, m_instance_info_buffer); device.PSSetShaderResources(TextureSlot::EnvMapDiffuse, m_white_cube); device.PSSetShaderResources(TextureSlot::EnvMapSpecular, m_black_cube); device.PSSetShaderResources(TextureSlot::FOWTexture, m_black); device.PSSetShaderResources(TextureSlot::lightscatter_Texture, m_black); device.PSSetShaderResources(TextureSlot::g_texLocalAO, m_white); device.PSSetShaderResources(TextureSlot::TerrainHeightTexture, m_black); device.PSSetShaderResources(TextureSlot::snowDiffuseTexture, m_black); device.PSSetShaderResources(TextureSlot::snowNormalTexture, m_black); device.PSSetShaderResources(TextureSlot::snowEdgeNoiseTexture, m_black); device.PSSetShaderResources(TextureSlot::compositorDiffuseTexture, m_black); device.PSSetShaderResources(TextureSlot::compositorSpecularTexture, m_grey); if(m_model) m_model->render(device, m_object_visibility); dc.restoreViewport(old_viewport); }
void SkeletalMeshRenderer::render() { //should have an update check and recall set if updated. if(drawBuffers_.size() > 0 && isRendering()) { auto context = Sly::display->getContext(); auto display = Sly::display; const unsigned int stride = sizeof(MeshVertex); const unsigned int offset = 0; context->IASetInputLayout(inputLayout_); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); display->setRasterizerState(rasterizerState_); display->setSamplerStates(samplerStates_); display->setBlendState(blendState_); display->setDepthStencilState(depthStencilState_); context->VSSetShader(vertexShader_, nullptr, 0); context->HSSetShader(hullShader_, nullptr, 0); context->DSSetShader(domainShader_, nullptr, 0); context->GSSetShader(geometryShader_, nullptr, 0); context->PSSetShader(pixelShader_, nullptr, 0); const auto meshTransform = (transform_) ? XMLoadFloat4x4(transform_) : XMMatrixIdentity(); //Default to identity if null (same for subMeshTransform) for(auto b = drawBuffers_.begin(); b != drawBuffers_.end(); ++b) { const auto subMeshTransform = ((*b)->transform) ? XMLoadFloat4x4((*b)->transform) : XMMatrixIdentity(); const auto transform = meshTransform * subMeshTransform; auto materialBuffer = display->getConstantBuffer("material"); auto worldBuffer = display->getConstantBuffer("world"); MaterialCB materialCB = { (*b)->material->diffuse, (*b)->material->specular }; materialBuffer->update(context, &materialCB , sizeof(MaterialCB)); WorldCB worldCB; XMStoreFloat4x4(&worldCB.world, transform); worldBuffer->update(context, &worldCB, sizeof(WorldCB)); context->VSSetConstantBuffers(0, 1, &worldBuffer->buffer); context->PSSetConstantBuffers(3, 1, &materialBuffer->buffer); context->VSSetConstantBuffers(0, 1, &worldBuffer->buffer); context->PSSetConstantBuffers(3, 1, &materialBuffer->buffer); ID3D11ShaderResourceView* srvs[4] = { (*b)->material->diffuseMap, (*b)->material->normalMap, (*b)->material->specularMap, (*b)->material->environmentMap}; context->PSSetShaderResources(0, 4, srvs); context->IASetVertexBuffers(0, 1, &(*b)->vertexBuffer, &stride, &offset ); //maybe able to group these together context->IASetIndexBuffer((*b)->indexBuffer, DXGI_FORMAT_R32_UINT, 0); context->DrawIndexed((*b)->drawCount, 0, 0); } } }
void overlay::render() { uint32_t stride = sizeof(overlay::vertex_t); uint32_t offset = 0; auto context = d3d_device::instance()->get_context(); context->IASetVertexBuffers(0, 1, vertex_buffer.GetAddressOf(), &stride, &offset); context->IASetIndexBuffer(index_buffer.Get(), DXGI_FORMAT_R32_UINT, 0); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetInputLayout(input_layout.Get()); context->VSSetConstantBuffers(0, 1, const_buffer.GetAddressOf()); context->VSSetShader(vertex_shader.Get(), nullptr, 0); context->PSSetShaderResources(0, 1, frame.GetAddressOf()); context->PSSetShader(pixel_shader.Get(), nullptr, 0); context->PSSetSamplers(0, 1, sampler_state.GetAddressOf()); context->DrawIndexed(vertex_count, 0, 0); }
int SkyBox::Render() { HRESULT hr; auto gfx = (ContextD3D11*)context_; auto pd3dImmediateContext = gfx->device_context(); context_->SetInputLayout(il_); UINT uStrides = sizeof( SkyBoxVertex ); UINT uOffsets = 0; context_->SetVertexBuffers( 0, 1, (const void**)&sky_vb_, &uStrides, &uOffsets ); context_->SetIndexBuffer(nullptr,DXGI_FORMAT_R32_UINT,0); context_->SetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); context_->PushVertexShader(&sky_vs_); context_->PushPixelShader(&sky_ps_); D3D11_MAPPED_SUBRESOURCE MappedResource; pd3dImmediateContext->Map( m_pcbVSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ; CB_VS_PER_OBJECT* pVSPerObject = ( CB_VS_PER_OBJECT* )MappedResource.pData; pmWorldViewProj = world()*dx::XMMatrixMultiply(scene_->camera()->view(),scene_->camera()->projection()); pVSPerObject->m_WorldViewProj = dx::XMMatrixTranspose(dx::XMMatrixInverse(NULL, pmWorldViewProj )); pd3dImmediateContext->Unmap( m_pcbVSPerObject, 0 ); pd3dImmediateContext->VSSetConstantBuffers( 0, 1, &m_pcbVSPerObject ); pd3dImmediateContext->PSSetSamplers( 0, 1, &sampler_state ); pd3dImmediateContext->PSSetShaderResources( 0, 1, (ID3D11ShaderResourceView*const*)&sky_trv_.data_pointer ); ID3D11DepthStencilState* pDepthStencilStateStored11 = NULL; UINT StencilRef; pd3dImmediateContext->OMGetDepthStencilState( &pDepthStencilStateStored11, &StencilRef ); pd3dImmediateContext->OMSetDepthStencilState( sky_depth_state_, 0 ); pd3dImmediateContext->Draw( 4, 0 ); pd3dImmediateContext->OMSetDepthStencilState( pDepthStencilStateStored11, StencilRef ); context_->PopVertexShader(); context_->PopPixelShader(); return S_OK; }
virtual void render() override { auto imc = mRenderer->getImmediateContext(); auto vs = std::dynamic_pointer_cast<TB::DirectXShader>(mVertexShader); auto ps = std::dynamic_pointer_cast<TB::DirectXShader>(mPixelShader); auto tex = std::dynamic_pointer_cast<TB::DirectXTexture>(mTexture); ID3D11Buffer* constants[] = { mViewConstants, nullptr, mWorldConstants }; ID3D11ShaderResourceView* srvs[] = { *tex }; ID3D11SamplerState* samplers[] = { TB::DirectXSamplerState::get() }; imc->RSSetState(TB::DirectXRasterizerState::get()); imc->VSSetConstantBuffers(0, 3, constants); imc->VSSetShader(*vs, nullptr, 0); imc->PSSetConstantBuffers(0, 3, constants); imc->PSSetShader(*ps, nullptr, 0); imc->PSSetShaderResources(0, 1, srvs); imc->PSSetSamplers(0, 1, samplers); mRenderer->clear(mRenderer->getBackBufferRTV(), math::float4(0.0f, 0.0f, 0.0f, 0.0f)); mRenderer->clear(mRenderer->getBackBufferDSV()); mScene->render(); }
void GameObject::Draw(){ //ゲームステージが無効ならリターン if (m_GameStgae.expired()){ return; } //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); auto pID3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ auto RenderStatePtr = Dev->GetRenderState(); auto Stage = m_GameStgae.lock(); auto ViewPtr = Stage->GetView(); //ビューからカメラを取り出す auto PtrCamera = ViewPtr->GetCamera(); //カメラの取得 Matrix4X4 View, Proj; View = PtrCamera->GetViewMatrix(); Proj = PtrCamera->GetProjMatrix(); //コンスタントバッファの設定 Texture3DConstantBuffer cb1; //行列の設定(転置する) cb1.Model = Matrix4X4EX::Transpose(m_WorldMatrix); cb1.View = Matrix4X4EX::Transpose(View); cb1.Projection = Matrix4X4EX::Transpose(Proj); //ライトの設定 //ステージから0番目のライトを取り出す auto PtrLight = ViewPtr->GetMultiLight()->GetLight(0); cb1.LightDir = PtrLight->GetDirectional(); cb1.LightDir.w = 1.0f; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(CBTexture3D::GetPtr()->GetBuffer(), 0, nullptr, &cb1, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionNormalTexture); UINT offset = 0; //頂点バッファの設定 pID3D11DeviceContext->IASetVertexBuffers(0, 1, m_VertexBuffer.GetAddressOf(), &stride, &offset); //インデックスバッファのセット pID3D11DeviceContext->IASetIndexBuffer(m_IndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pID3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //透明処理 pID3D11DeviceContext->OMSetBlendState(RenderStatePtr->GetAlphaBlendEx(), nullptr, 0xffffffff); //デプスステンシルは使用する pID3D11DeviceContext->OMSetDepthStencilState(RenderStatePtr->GetDepthDefault(), 0); //シェーダの設定 pID3D11DeviceContext->VSSetShader(VSTexture3D::GetPtr()->GetShader(), nullptr, 0); pID3D11DeviceContext->PSSetShader(PSTexture3D::GetPtr()->GetShader(), nullptr, 0); //リニアサンプラーを設定 ID3D11SamplerState* samplerState = RenderStatePtr->GetLinearClamp(); pID3D11DeviceContext->PSSetSamplers(0, 1, &samplerState); for (auto& m : m_Materials){ //テクスチャを設定 pID3D11DeviceContext->PSSetShaderResources(0, 1, m.m_ShaderResView.GetAddressOf()); //インプットレイアウトの設定 pID3D11DeviceContext->IASetInputLayout(VSTexture3D::GetPtr()->GetInputLayout()); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBTexture3D::GetPtr()->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullFront()); //描画 pID3D11DeviceContext->DrawIndexed(m.m_IndexCount, m.m_StartIndex, 0); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullBack()); //描画 pID3D11DeviceContext->DrawIndexed(m.m_IndexCount, m.m_StartIndex,0); } //後始末 Dev->InitializeStates(RenderStatePtr); }
void CustomDrawBox::Draw(){ //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); auto pID3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ auto RenderStatePtr = GetStage()->GetRenderState(); auto PtrT = GetComponent<Transform>(); //ステージからカメラを取り出す auto PtrCamera = GetStage()->GetTargetCamera(); //カメラの取得 Matrix4X4 View, Proj, WorldViewProj; View = PtrCamera->GetViewMatrix(); Proj = PtrCamera->GetProjMatrix(); //ストライドとオフセット UINT stride = sizeof(VertexPositionNormalTexture); UINT offset = 0; //頂点バッファの設定 auto PtrMeshResource = App::GetApp()->GetResource<MeshResource>(L"DEFAULT_CUBE"); pID3D11DeviceContext->IASetVertexBuffers(0, 1, PtrMeshResource->GetVertexBuffer().GetAddressOf(), &stride, &offset); //インデックスバッファのセット pID3D11DeviceContext->IASetIndexBuffer(PtrMeshResource->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pID3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //ステータスのポインタ //テクスチャを取得 ID3D11ShaderResourceView* pNull[1] = { 0 }; ID3D11SamplerState* pNullSR[1] = { 0 }; //テクスチャを設定 auto PtrTextureResource = App::GetApp()->GetResource<TextureResource>(L"TRACE_TX"); pID3D11DeviceContext->PSSetShaderResources(0, 1, PtrTextureResource->GetShaderResourceView().GetAddressOf()); //リニアサンプラーを設定 ID3D11SamplerState* samplerState = RenderStatePtr->GetLinearClamp(); pID3D11DeviceContext->PSSetSamplers(0, 1, &samplerState); //半透明処理 pID3D11DeviceContext->OMSetBlendState(RenderStatePtr->GetAlphaBlendEx(), nullptr, 0xffffffff); //デプスステンシルは使用する pID3D11DeviceContext->OMSetDepthStencilState(RenderStatePtr->GetDepthDefault(), 0); //シェーダの設定 pID3D11DeviceContext->VSSetShader(m_VirtexShader->GetShader(), nullptr, 0); pID3D11DeviceContext->PSSetShader(m_PixelShader->GetShader(), nullptr, 0); //インプットレイアウトの設定 pID3D11DeviceContext->IASetInputLayout(m_VirtexShader->GetInputLayout()); //コンスタントバッファの設定 ConstantBuffer cb1; ZeroMemory(&cb1, sizeof(cb1)); //行列の設定(転置する) cb1.World = Matrix4X4EX::Transpose(PtrT->GetWorldMatrix());; cb1.View = Matrix4X4EX::Transpose(View); cb1.Projection = Matrix4X4EX::Transpose(Proj); //ライトの設定 //ステージから0番目のライトを取り出す auto PtrLight = GetStage()->GetTargetLight(0); cb1.LightDir = PtrLight->GetDirectional(); //xとzだけ逆にする cb1.LightDir.x *= -1.0f; cb1.LightDir.z *= -1.0f; cb1.LightDir.w = 1.0f; //トータルタイムをコンスタントバッファに渡す float ElapsedTime = App::GetApp()->GetElapsedTime(); m_TotalTime += ElapsedTime; if (m_TotalTime >= 1.0f){ m_TotalTime = 0.0f; } cb1.Param.x = m_TotalTime; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(m_ConstantBuffer->GetBuffer(), 0, nullptr, &cb1, 0, 0); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = m_ConstantBuffer->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullFront()); //内側描画 pID3D11DeviceContext->DrawIndexed(PtrMeshResource->GetNumIndicis(), 0, 0); //ライトの向きを変える cb1.LightDir = PtrLight->GetDirectional(); cb1.LightDir.w = 1.0f; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(m_ConstantBuffer->GetBuffer(), 0, nullptr, &cb1, 0, 0); //コンスタントバッファの設定 pConstantBuffer = m_ConstantBuffer->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullBack()); //描画(外側) pID3D11DeviceContext->DrawIndexed(PtrMeshResource->GetNumIndicis(), 0, 0); //後始末 Dev->InitializeStates(RenderStatePtr); }
/** * Callback to draw things in world space. ***/ void OSVR_DirectMode::DrawWorld(void* userData, osvr::renderkit::GraphicsLibrary cLibrary, osvr::renderkit::RenderBuffer cBuffers, osvr::renderkit::OSVR_ViewportDescription sViewport, OSVR_PoseState pose, osvr::renderkit::OSVR_ProjectionMatrix sProjection, OSVR_TimeValue deadline) { static int nEye = 0; static float fAspect = 1.0f; // Make sure our pointers are filled in correctly. The config file selects // the graphics library to use, and may not match our needs. if (cLibrary.D3D11 == nullptr) { std::cerr << "SetupDisplay: No D3D11 GraphicsLibrary" << std::endl; return; } if (cBuffers.D3D11 == nullptr) { std::cerr << "SetupDisplay: No D3D11 RenderBuffer" << std::endl; return; } // auto pcContext = cLibrary.D3D11->context; auto pcDevice = cLibrary.D3D11->device; auto pcContext = cLibrary.D3D11->context; // create all bool bool bAllCreated = true; // create vertex shader if (!m_pcVertexShader11) { if (FAILED(Create2DVertexShader(pcDevice, &m_pcVertexShader11, &m_pcVertexLayout11))) { OutputDebugString(L"FAILED"); bAllCreated = false; } } // create pixel shader... if (!m_pcPixelShader11) { if (FAILED(CreatePixelShaderEffect(pcDevice, &m_pcPixelShader11, PixelShaderTechnique::FullscreenGammaCorrection))) bAllCreated = false; } // Create vertex buffer if (!m_pcVertexBuffer11) { if (FAILED(CreateFullScreenVertexBuffer(pcDevice, &m_pcVertexBuffer11))) bAllCreated = false; } // create constant buffer if (!m_pcConstantBufferDirect11) { if (FAILED(CreateMatrixConstantBuffer(pcDevice, &m_pcConstantBufferDirect11))) bAllCreated = false; } // sampler ? if (!m_pcSamplerState) { bAllCreated = false; } if ((bAllCreated) && (m_sStereoTextureViews.m_ppcTexView11[nEye])) { // Set the input layout pcContext->IASetInputLayout(m_pcVertexLayout11); // Set vertex buffer UINT stride = sizeof(TexturedVertex); UINT offset = 0; pcContext->IASetVertexBuffers(0, 1, &m_pcVertexBuffer11, &stride, &offset); // get orthographic matrix from projection and normalize it by its width (since we use a fullscreen shader here) float afProjectionD3D[16]; osvr::renderkit::OSVR_Projection_to_D3D(afProjectionD3D, sProjection); D3DXMATRIX sProj(afProjectionD3D); // due to the aspect ratio (90° horizontal, 90° vertical) of the HDK we adjust the screen by // the height, not by the width... in this case we need to set a higher FOV by following formular: // V = 2 * arctan( tan(H / 2) * aspectratio ) - so we get V 90° and H 121° sProj.m[0][0] = sProj.m[0][0] * fAspect; // < incorporate game screen aspect ratio; sProj.m[0][1] = 0.0f; sProj.m[0][3] = sProj.m[0][2]; sProj.m[0][2] = 0.0f; sProj.m[1][0] = 0.0f; sProj.m[1][1] = sProj.m[1][1]; sProj.m[1][3] = sProj.m[1][2]; sProj.m[1][2] = 0.0f; sProj.m[2][0] = 0.0f; sProj.m[2][1] = 0.0f; sProj.m[2][2] = 1.0f; // 1.0f here... fullscreen shader ! sProj.m[2][3] = 0.0f; sProj.m[3][0] = 0.0f; sProj.m[3][1] = 0.0f; sProj.m[3][2] = 0.0f; sProj.m[3][3] = 1.0f; // zoom out ? if (m_pbZoomOut) { if (*m_pbZoomOut) { sProj.m[0][0] /= 2.0f; sProj.m[1][1] /= 2.0f; } } // Set constant buffer, first update it... scale and translate the left and right image pcContext->UpdateSubresource((ID3D11Resource*)m_pcConstantBufferDirect11, 0, NULL, &sProj, 0, 0); pcContext->VSSetConstantBuffers(0, 1, &m_pcConstantBufferDirect11); // Set primitive topology pcContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // texture connected ? if ((m_sStereoTextureViews.m_ppcTexView11[nEye]) && (*m_sStereoTextureViews.m_ppcTexView11[nEye])) { if (m_eMethod == OSVR_DirectModeMethods::OSVR_D3D11_use_Game_Device) { // set texture, sampler state pcContext->PSSetShaderResources(0, 1, m_sStereoTextureViews.m_ppcTexView11[nEye]); pcContext->PSSetSamplers(0, 1, &m_pcSamplerState); } else { ID3D11Resource* pcResource = nullptr; (*m_sStereoTextureViews.m_ppcTexView11[nEye])->GetResource(&pcResource); if (!m_sStereoTextureCopies.m_pcTex11Copy[nEye]) { // get the description and create the copy texture D3D11_TEXTURE2D_DESC sDesc; ((ID3D11Texture2D*)pcResource)->GetDesc(&sDesc); sDesc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED; sDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; if (FAILED(((ID3D11Device*)m_pcGameDevice)->CreateTexture2D(&sDesc, NULL, (ID3D11Texture2D**)&m_sStereoTextureCopies.m_pcTex11Copy[nEye]))) { OutputDebugString(L"StereoSplitterDX10 : Failed to create twin texture !"); return; } // aspect ratio fAspect = (float)sDesc.Width / (float)sDesc.Height; // TODO !! DX9 // DX10 !! // get shared handle IDXGIResource* pcDXGIResource(NULL); m_sStereoTextureCopies.m_pcTex11Copy[nEye]->QueryInterface(__uuidof(IDXGIResource), (void**)&pcDXGIResource); HANDLE sharedHandle; if (pcDXGIResource) { pcDXGIResource->GetSharedHandle(&sharedHandle); pcDXGIResource->Release(); } else OutputDebugString(L"Failed to query IDXGIResource."); // open the shared handle with the temporary device ID3D11Resource* pcResourceShared; pcDevice->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&pcResourceShared)); if (pcResourceShared) { pcResourceShared->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&m_sStereoFrameTextures.m_pcFrameTexture[nEye])); pcResourceShared->Release(); } else OutputDebugString(L"Could not open shared resource."); // create shader resource view if (m_sStereoFrameTextures.m_pcFrameTexture[nEye]) { D3D11_SHADER_RESOURCE_VIEW_DESC sDescSRV; ZeroMemory(&sDescSRV, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC)); sDescSRV.Format = sDesc.Format; sDescSRV.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; sDescSRV.Texture2D.MostDetailedMip = 0; sDescSRV.Texture2D.MipLevels = 1; if (FAILED(pcDevice->CreateShaderResourceView(m_sStereoFrameTextures.m_pcFrameTexture[nEye], &sDescSRV, &m_sSteroFrameTextureSRViews.m_pcFrameTextureSRView[nEye]))) OutputDebugString(L"Failed to create shader resource view."); } else OutputDebugString(L"No Texture available."); } else { // copy the frame tex to shared texture m_pcGameDeviceContext->CopyResource(m_sStereoTextureCopies.m_pcTex11Copy[nEye], pcResource); if (pcResource) pcResource->Release(); // set texture, sampler state pcContext->PSSetShaderResources(0, 1, &m_sSteroFrameTextureSRViews.m_pcFrameTextureSRView[nEye]); pcContext->PSSetSamplers(0, 1, &m_pcSamplerState); } } } // set shaders pcContext->VSSetShader(m_pcVertexShader11, 0, 0); pcContext->PSSetShader(m_pcPixelShader11, 0, 0); // Render a triangle pcContext->Draw(6, 0); // switch eye for next call nEye = !nEye; } }
void SpriteBase::OnDraw() { auto TexPtr = App::GetApp()->GetResource<TextureResource>(m_TextureResName); auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); auto RenderState = Dev->GetRenderState(); //ワールド行列の決定 Mat4x4 World; World.affineTransformation2D( m_Scale, //スケーリング Vec2(0, 0), //回転の中心(重心) m_Rot, //回転角度 m_Pos //位置 ); //射影行列の決定 float w = static_cast<float>(App::GetApp()->GetGameWidth()); float h = static_cast<float>(App::GetApp()->GetGameHeight()); Mat4x4 Proj(XMMatrixOrthographicLH(w, h, -1.0, 1.0f)); //行列の合成 World *= Proj; //コンスタントバッファの準備 SpriteConstantBuffer sb; //エミッシブ加算。 sb.Emissive = m_Emissive; //行列の設定 sb.World = World; //コンスタントバッファの更新 pD3D11DeviceContext->UpdateSubresource(CBSprite::GetPtr()->GetBuffer(), 0, nullptr, &sb, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionColorTexture); UINT offset = 0; //頂点バッファのセット pD3D11DeviceContext->IASetVertexBuffers(0, 1, m_SquareMesh->GetVertexBuffer().GetAddressOf(), &stride, &offset); //インデックスバッファのセット pD3D11DeviceContext->IASetIndexBuffer(m_SquareMesh->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pD3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBSprite::GetPtr()->GetBuffer(); ID3D11Buffer* pNullConstantBuffer = nullptr; //頂点シェーダに渡す pD3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); //ピクセルシェーダに渡す pD3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //シェーダの設定 pD3D11DeviceContext->VSSetShader(VSPCTSprite::GetPtr()->GetShader(), nullptr, 0); pD3D11DeviceContext->PSSetShader(PSPCTSprite::GetPtr()->GetShader(), nullptr, 0); //インプットレイアウトの設定 pD3D11DeviceContext->IASetInputLayout(VSPCTSprite::GetPtr()->GetInputLayout()); //ブレンドステート switch (m_BlendState) { case BlendState::Opaque: pD3D11DeviceContext->OMSetBlendState(RenderState->GetOpaque(), nullptr, 0xffffffff); break; case BlendState::Trace: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAlphaBlendEx(), nullptr, 0xffffffff); break; case BlendState::Additive: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAdditive(), nullptr, 0xffffffff); break; } //デプスステンシルステート pD3D11DeviceContext->OMSetDepthStencilState(RenderState->GetDepthNone(), 0); //ラスタライザステート pD3D11DeviceContext->RSSetState(RenderState->GetCullBack()); //テクスチャとサンプラーの設定 ID3D11ShaderResourceView* pNull[1] = { 0 }; pD3D11DeviceContext->PSSetShaderResources(0, 1, TexPtr->GetShaderResourceView().GetAddressOf()); //ラッピングサンプラー ID3D11SamplerState* pSampler = RenderState->GetLinearWrap(); pD3D11DeviceContext->PSSetSamplers(0, 1, &pSampler); //描画 pD3D11DeviceContext->DrawIndexed(m_SquareMesh->GetNumIndicis(), 0, 0); //後始末 Dev->InitializeStates(); }