void RenderingDevice::SetMaterial(const Material &material) { SetRasterizerState(material.GetRasterizerState()); SetBlendState(material.GetBlendState()); SetDepthStencilState(material.GetDepthStencilState()); for (size_t i = 0; i < material.GetSamplers().size(); ++i) { auto& sampler = material.GetSamplers()[i]; if (sampler.GetTexture()) { D3DLOG(mDevice->SetTexture(i, sampler.GetTexture()->GetDeviceTexture())); } else { D3DLOG(mDevice->SetTexture(i, nullptr)); } SetSamplerState(i, sampler.GetState()); } // Free up the texture bindings of the samplers currently being used for (size_t i = material.GetSamplers().size(); i < mUsedSamplers; ++i) { D3DLOG(mDevice->SetTexture(i, nullptr)); } mUsedSamplers = material.GetSamplers().size(); material.GetVertexShader()->Bind(); material.GetPixelShader()->Bind(); }
//初期化 void TilingFixedBox::OnCreate() { auto PtrTrans = GetComponent<Transform>(); PtrTrans->SetScale(m_Scale); PtrTrans->SetRotation(m_Rotation); PtrTrans->SetPosition(m_Position); auto Coll = AddComponent<CollisionObb>(); Coll->SetFixed(true); vector<VertexPositionNormalTexture> vertices; vector<uint16_t> indices; MeshUtill::CreateCube(1.0f, vertices, indices); float UCount = m_Scale.x / m_UPic; float VCount = m_Scale.y / m_VPic; for (size_t i = 0; i < vertices.size(); i++) { if (vertices[i].textureCoordinate.x >= 1.0f) { vertices[i].textureCoordinate.x = UCount; } if (vertices[i].textureCoordinate.y >= 1.0f) { vertices[i].textureCoordinate.y = VCount; } } //描画コンポーネントの追加 auto PtrDraw = AddComponent<BcPNTStaticDraw>(); //描画コンポーネントに形状(メッシュ)を設定 PtrDraw->CreateOriginalMesh(vertices, indices); PtrDraw->SetOriginalMeshUse(true); PtrDraw->SetFogEnabled(true); //自分に影が映りこむようにする PtrDraw->SetOwnShadowActive(true); //描画コンポーネントテクスチャの設定 PtrDraw->SetTextureResource(L"WALL_TX"); //タイリング設定 PtrDraw->SetSamplerState(SamplerState::LinearWrap); }
Context* Context::Create(const HWND i_renderingWindow) { IDirect3D9* direct3dInterface = nullptr; IDirect3DDevice9* direct3dDevice = nullptr; if (!CreateInterface(direct3dInterface) || !CreateDevice(direct3dInterface, i_renderingWindow, direct3dDevice) || !SetSamplerState(direct3dDevice) ) goto OnError; Context *context = new Context(i_renderingWindow); if (context) { context->direct3dDevice = direct3dDevice; context->direct3dInterface = direct3dInterface; } else { Lame::UserOutput::Display("Failed to create Direct3D Context, due to insufficient memory.", "Context Loading Error"); } return context; OnError: if (direct3dInterface) { if (direct3dDevice) { direct3dDevice->Release(); direct3dDevice = nullptr; } direct3dInterface->Release(); direct3dInterface = nullptr; } return nullptr; }
//プレートの作成 void GameStage::CreatePlate() { //メッシュ作成 CreatePlateMesh(); //ステージへのゲームオブジェクトの追加 auto Ptr = AddGameObject<GameObject>(); auto PtrTrans = Ptr->GetComponent<Transform>(); Quat Qt; Qt.rotationRollPitchYawFromVector(Vec3(XM_PIDIV2, 0, 0)); PtrTrans->SetScale(50.0f, 50.0f, 1.0f); PtrTrans->SetQuaternion(Qt); PtrTrans->SetPosition(0.0f, 0.0f, 0.0f); auto ColPtr = Ptr->AddComponent<CollisionRect>(); //描画コンポーネント auto DrawComp = Ptr->AddComponent<BcPNTnTStaticDraw>(); DrawComp->SetMeshResource(L"MY_PNTnT_SQUARE"); DrawComp->SetTextureResource(L"GRAY_TX"); DrawComp->SetNormalMapTextureResource(L"NORMAL3_TX"); //ラップモード DrawComp->SetSamplerState(SamplerState::LinearWrap); //スペキュラーなし DrawComp->DisableSpecular(); //フォグはきつめに DrawComp->SetFogEnabled(true); DrawComp->SetFogColor(Col4(0.3f, 0.3f,0.3f, 1.0f)); DrawComp->SetFogStart(-10.0f); DrawComp->SetFogEnd(-30.0f); //自分に影が映りこむようにする DrawComp->SetOwnShadowActive(true); }
//----------------------------------------------------------------------------- // CreateDefaultObjects // Creates the default objects //----------------------------------------------------------------------------- void CRenderer::CreateDefaultObjects( void ) { // Texture m_nDefaultTexture = LoadTexture2D( "Assets/Textures/DefaultTexture.png" ); // Default mesh m_nDefaultMesh = CreateMesh(); // debug sphere m_nSphereMesh = LoadMesh( "Assets/meshes/sphere.mesh" ); // debug box m_nDebugBox = CreateDynamicBox(); ////////////////////////////////////////// // Load Shaders LoadShaders(); // a vertex shader for drawing lines VPosColor pLineVertices[] = { { RVector3( 0.0f, 0.0f, 0.0f ), RVector4( 1.0f, 1.0f, 1.0f, 1.0f ) }, { RVector3( 1.0f, 1.0f, 1.0f ), RVector4( 1.0f, 1.0f, 1.0f, 1.0f ) }, }; m_pLineBuffer = m_pDevice->CreateVertexBuffer( sizeof( pLineVertices ), pLineVertices ); // Set the defaults SetVertexShader( eVS3DPosNorTexStd ); SetPixelShader( ePS3DStd ); SetSamplerState( eSamplerLinear ); m_pDevice->SetPrimitiveType( GFX_PRIMITIVE_TRIANGLELIST ); static float Vtx[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, }; static uint16 Idx[] = { 0, 1, 2, 0, 2, 3, }; m_pFSRectVB = m_pDevice->CreateVertexBuffer( sizeof( Vtx ), Vtx ); m_pFSRectIB = m_pDevice->CreateIndexBuffer ( sizeof( Idx ), Idx ); }
void Renderer::forward_rendering_pipeline() { //set states { SetViewPortToDefault(); if (use_postfx) { SetRenderViews(screen_texture->get_rt(), GetDefaultDepthStencilView(), 0); } else { SetRenderViews(GetDefaultRenderTargetView(), GetDefaultDepthStencilView(), 0); } clearScreen(D3DXVECTOR4(0, 0, 0, 0)); SetDepthState(depth_state_enable_test_enable_write); default_render_shader->set_shaders(); SetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); } const vector<Mesh*> &meshes_to_render = scene_to_render->get_meshes(); for (int i = 0; i < meshes_to_render.size(); i++) { Mesh *mesh_to_render = meshes_to_render[i]; mesh_to_render->get_material()->set_textures(); set_mesh_constant_values(mesh_to_render); //set buffers SetVertexBuffer(mesh_to_render->get_vertex_buffer(), sizeof(Mesh::Vertex)); SetIndexBuffer(mesh_to_render->get_index_buffer()); SetSamplerState(); if (mesh_to_render->is_wireframe()) { SetRasterState(raster_state_wireframe_mode); } else { SetRasterState(raster_state_fill_mode); } //render int tri_to_render = mesh_to_render->get_index_count(); RenderIndexed(tri_to_render); } }
Texture2D::Texture2D(byte* pixels, u32 width, u32 height, TextureFormat format) : Texture(width, height, TextureType::TEXTURE_2D, format) { GL(glGenTextures(1, &m_Texture)); GL(glBindTexture(GL_TEXTURE_2D, m_Texture)); GL(glTexImage2D(GL_TEXTURE_2D, 0, static_cast<GLenum>(format), width, height, 0, static_cast<GLenum>(GetBaseFormat(format)), GL_UNSIGNED_BYTE, pixels)); SetSamplerState(); }
void Renderer::gbuffer_render() { invalidate_srv(shaderType::shader_type_pixel); gbuffer_albedo_texture->set_as_render_target(0); gbuffer_normal_texture->set_as_render_target(1); gbuffer_specular_texture->set_as_render_target(2); clearScreen(D3DXVECTOR4(0, 0, 0, 0)); ClearRenderView(D3DXVECTOR4(0, 0, 0, 0), 1); ClearRenderView(D3DXVECTOR4(0, 0, 0, 0),2); SetDepthState(depth_state_enable_test_enable_write); SetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); const vector<Mesh*> &meshes_to_render = scene_to_render->get_meshes(); for (int i = 0; i < meshes_to_render.size(); i++) { Mesh *mesh_to_render = meshes_to_render[i]; if (mesh_to_render->get_material()) { mesh_to_render->get_material()->set_textures(); } set_mesh_constant_values(mesh_to_render); Shader *shader_to_set = mesh_to_render->get_material() ? mesh_to_render->get_material()->get_enforced_gbuffer_shader() : nullptr; if (shader_to_set == nullptr) { shader_to_set = gbuffer_shader; } shader_to_set->set_shaders(); //set buffers SetVertexBuffer(mesh_to_render->get_vertex_buffer(), sizeof(Mesh::Vertex)); SetIndexBuffer(mesh_to_render->get_index_buffer()); set_mesh_primitive_topology(mesh_to_render); if (mesh_to_render->is_wireframe()) { SetRasterState(raster_state_wireframe_mode); } else { SetRasterState(raster_state_fill_mode); } SetSamplerState(); //render int tri_to_render = mesh_to_render->get_index_count(); RenderIndexed(tri_to_render); } SetRenderTargetView(nullptr, 0); SetRenderTargetView(nullptr, 1); SetRenderTargetView(nullptr, 2); for (int i = 0; i < render_components.size(); i++) { render_components[i]->post_gbuffer_render(); } }