bool testDrawArrays::render() { glm::vec2 const WindowSize(this->getWindowSize()); float Depth(1.0f); glClearBufferfv(GL_DEPTH, 0, &Depth); glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]); { glBindBuffer(GL_UNIFORM_BUFFER, this->BufferName[buffer::BUFFER_FRAME]); glm::mat4* Pointer = reinterpret_cast<glm::mat4*>(glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT)); glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, WindowSize.x / WindowSize.y, 0.1f, 1000.0f); glm::mat4 View = this->view(); glm::mat4 Model = glm::mat4(1.0f); glm::mat4 MVP = Projection * View * Model; *Pointer = Projection * View * Model; glUnmapBuffer(GL_UNIFORM_BUFFER); } glViewportIndexedfv(0, &glm::vec4(0, 0, WindowSize)[0]); this->beginTimer(); switch(this->DrawType) { case INSTANCED: glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, static_cast<GLsizei>(DrawCount), 0); break; case MULTI_DISCARD: case MULTI_DRAW: for(int i = 0; i < 2; ++i) glMultiDrawArraysIndirect(GL_TRIANGLES, 0, static_cast<GLsizei>(DrawCount / 2), 0); break; case DRAW_PACKED: for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex) { if(this->UniformUpdate != testDrawArrays::CONSTANT_UNIFORM && this->UniformUpdate != testDrawArrays::NO_UNIFORM) ::updateUniform(this->ProgramName, DrawIndex, this->UniformUpdate); glDrawArrays(GL_TRIANGLES, static_cast<GLint>(this->VertexDataType == SEPARATED_VERTEX_DATA ? VertexCount * DrawIndex : 0), VertexCount); } break; case DRAW_PARAMS: for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex) { if(this->UniformUpdate != testDrawArrays::CONSTANT_UNIFORM && this->UniformUpdate != testDrawArrays::NO_UNIFORM) ::updateUniform(this->ProgramName, DrawIndex, this->UniformUpdate); glDrawArraysInstancedBaseInstance(GL_TRIANGLES, static_cast<GLint>(this->VertexDataType == SEPARATED_VERTEX_DATA ? VertexCount * DrawIndex : 0), VertexCount, 1, 0); } break; default: assert(0); break; } this->endTimer(); return true; }
//描画処理 void Help::Draw(void) { DataManager &data = DataManager::GetInstance(); GameInput &input = GameInput::GetInstance(); if(m_Exist) { //BG DXLibMath::DrawRotaGraphResize( 0.5f, 0.5f, 1.0f, 0.0f, DataManager::GetInstance().Get(DataManager::Help_BG), TRUE); switch(m_State) { case INDEX: DrawIndex(); break; case REFERENCE: DrawReference(); break; } //閉じるボタン DXLibMath::DrawRotaGraphResize(0.97f, 0.035f, m_Help_Button_Scale, 0.0f, data.Get(DataManager::Help_Button_Close), TRUE); } else DXLibMath::DrawRotaGraphResize(0.97f, 0.035f, m_Help_Button_Scale, 0.0f, data.Get(DataManager::Play_UI_Play_HelpButton), TRUE); }
void testDrawIndexing::render() { float Depth(1.0f); glClearBufferfv(GL_DEPTH, 0, &Depth); glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]); { glBindBuffer(GL_UNIFORM_BUFFER, this->BufferName[buffer::BUFFER_FRAME]); glm::mat4* Pointer = reinterpret_cast<glm::mat4*>(glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT)); glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 2048.0f); glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -this->TranlationCurrent.y - 512)); glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, this->RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f)); glm::mat4 View = glm::rotate(ViewRotateX, this->RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f)); glm::mat4 Model = glm::mat4(1.0f); *Pointer = Projection * View * Model; glUnmapBuffer(GL_UNIFORM_BUFFER); } glViewportIndexedfv(0, &glm::vec4(0, 0, this->getWindowSize())[0]); this->beginTimer(); switch(this->Indexing) { case DRAW: case DIVISOR_MULTI_INDEXING: case ID_INDEXING: { int const DrawChunk = 2; for(int i = 0; i < DrawChunk; ++i) glMultiDrawArraysIndirect(GL_TRIANGLES, 0, static_cast<GLsizei>(DrawCount / DrawChunk), 0); } case DIVISOR_INDEXING: { for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex) glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, static_cast<GLuint>(DrawIndex)); } break; case ATTRIB_INDEXING: { for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex) { glVertexAttribI1i(1, DrawIndex % 2 ? 0 : 1); // 1 is DRAW_ID attribute location glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0); } } break; case UNIFORM_INDEXING: { for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex) { glProgramUniform1i(this->ProgramName, UniformDrawIndex, DrawIndex % 2 ? 0 : 1); glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0); } } break; default: assert(0); break; } this->endTimer(); }