void opengl_texture_state::Delete(GLuint tex_id) { if (tex_id == 0) { Int3(); return; } GLuint atu_save = active_texture_unit; for (unsigned int i = 0; i < num_texture_units; i++) { if (units[i].texture_id == tex_id) { SetActiveUnit(i); glBindTexture(units[i].texture_target, 0); units[i].texture_id = 0; default_values(i, units[i].texture_target); if (i == atu_save) { atu_save = 0; } } } SetActiveUnit(atu_save); }
void opengl_texture_state::DisableAll() { for (unsigned int i = 0; i < num_texture_units; i++) { if (units[i].active) { SetActiveUnit(i); Disable(); } } SetActiveUnit(); Current_texture_source = TEXTURE_SOURCE_NONE; }
/*************************************************************//** * * @brief 非公開の描画処理を行う * @param なし * @return なし * ****************************************************************/ void C_SmallBeamOption::DoDraw() { pGlslObject_->BeginWithUnifomBuffer(pUniformBuffer_->GetHandle(), uniformBlockIndex_); pGlslObject_->BindActiveSubroutine(cameraSubroutineIndex_, Shader::GLSL::Type::s_VERTEX); upRigidBody_->GetTransform().getOpenGLMatrix(modelMatrix_.a_); modelMatrix_ = modelMatrix_ * Matrix4x4::s_CreateScaling(Vector3(radius_)); pGlslObject_->SetUniformMatrix4x4("u_modelMatrix", modelMatrix_); // ライトとマテリアルを設定 SetLight(pMainLight_); SetMaterial(pNowMaterial_); auto pOpenGlManager = OpenGL::C_OpenGlManager::s_GetInstance(); auto pTextureManager = Texture::C_TextureManager::s_GetInstance(); // アクティブなテクスチャユニットを設定し、テクスチャをバインド pTextureManager->SetActiveUnit(0); pModelTextureData_ = Texture::C_TextureManager::s_GetInstance()->GetTextureData(Path::Texture::s_pSMALL_BEAM_OPTION).get(); pTextureManager->Bind(Texture::Type::s_2D, pModelTextureData_->handle_); pOpenGlManager->DrawPrimitiveWithIndices(OpenGL::Primitive::s_TRIANGLE, pModelData_->GetVertexArrayObjectHandle(), pModelData_->GetIndexBufferObjectHandle(), OpenGL::DataType::s_UNSIGNED_SHORT, static_cast<int32_t>(pModelData_->GetIndexCount())); pTextureManager->Unbind(Texture::Type::s_2D); pGlslObject_->End(); }
void opengl_texture_state::DisableUnused() { for (unsigned int i = 0; i < num_texture_units; i++) { if (!units[i].used) { SetActiveUnit(i); Disable(); } } }
/*************************************************************//** * * @brief 描画処理を行う * @param なし * @return なし * ****************************************************************/ void C_SpriteCreater::Draw() { // 頂点の書き換え pPointDatas_->RewriteVertices(vertices_.data(), drawSpriteCount_); // シェーダーの使用開始 pGlslObject_->Begin(); // サブルーチンを設定 pGlslObject_->BindActiveSubroutine(subroutineIndices_[cameraType_], Shader::GLSL::Type::s_GEOMETRY); // ユニフォーム変数を設定 SetUniformVariable(); // テクスチャマネージャーとOpenGLマネージャーを取得 auto pTextureManager = Texture::C_TextureManager::s_GetInstance(); auto pOpenGlManager = OpenGL::C_OpenGlManager::s_GetInstance(); // ブレンドを有効化し、ブレンドに使用する関数を設定 pOpenGlManager->EnableBlend(true); pOpenGlManager->SetBlendFunction(sourceFactor_, destinationFactor_); // カリングを無効化 pOpenGlManager->EnableCulling(false); // 深度のマスクを有効化 pOpenGlManager->EnableDepthMask(true); // アクティブなテクスチャユニットを設定し、テクスチャをバインド pTextureManager->SetActiveUnit(Fixed::Texture::s_UNIT_NUMBER); pTextureManager->Bind(Texture::Type::s_2D, pTextureData_->handle_); // スプライトを描画 pOpenGlManager->DrawPrimitive(OpenGL::Primitive::s_POINT, pPointDatas_->GetVertexArrayObjectHandle(), drawSpriteCount_); // 深度のマスクを無効化 pOpenGlManager->EnableDepthMask(false); // カリングを有効化 pOpenGlManager->EnableCulling(true); // ブレンドを無効化 pOpenGlManager->EnableBlend(false); // テクスチャをアンバインド pTextureManager->Unbind(Texture::Type::s_2D); // シェーダーの使用終了 pGlslObject_->End(); drawSpriteCount_ = 0; }
void opengl_texture_state::Enable(GLuint unit, GLenum tex_target, GLuint tex_id) { Assertion(unit < num_texture_units, "Invalid texture unit value!"); if (units[unit].texture_target == tex_target && units[unit].texture_id == tex_id) { // The texture unit already uses this texture. There is no need to change it return; } // Go the standard route SetActiveUnit(unit); SetTarget(tex_target); Enable(tex_id); }
void opengl_texture_state::init(GLuint n_units) { Assert( n_units > 0 ); units = (opengl_texture_unit*) vm_malloc(n_units * sizeof(opengl_texture_unit)); num_texture_units = n_units; for (unsigned int unit = 0; unit < num_texture_units; unit++) { units[unit].enabled = GL_FALSE; default_values(unit); glActiveTexture(GL_TEXTURE0 + unit); } SetActiveUnit(); }