void presentSharedFboTexture() { glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glViewport(0, 0, g_auxWindow_w, g_auxWindow_h); // Present FBO to screen const GLuint prog = g_auxPresent.prog(); glUseProgram(prog); g_auxPresent.bindVAO(); { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_app.getRenderBufferTex()); glUniform1i(g_auxPresent.GetUniLoc("fboTex"), 0); // This is the only uniform that changes per-frame const float fboScale = g_renderMode.outputType == RenderingMode::OVR_SDK ? 1.0f : g_app.GetFBOScale(); glUniform1f(g_auxPresent.GetUniLoc("fboScale"), fboScale); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } glBindVertexArray(0); glUseProgram(0); }
void destroyAuxiliaryWindow(GLFWwindow* pAuxWindow) { glfwMakeContextCurrent(pAuxWindow); g_auxPresent.destroy(); glfwDestroyWindow(pAuxWindow); g_AuxWindow = NULL; }
void initAuxPresentFboShader() { g_auxPresent.initProgram("presentfbo"); g_auxPresent.bindVAO(); const float verts[] = { -1, -1, 1, -1, 1, 1, -1, 1 }; // The aspect ratio of one eye's view is half side-by-side(portrait), so we can chop // the top and bottom parts off to present something closer to landscape. const float texs[] = { 0.0f, 0.25f, 0.5f, 0.25f, 0.5f, 0.75f, 0.0f, 0.75f, }; GLuint vertVbo = 0; glGenBuffers(1, &vertVbo); g_auxPresent.AddVbo("vPosition", vertVbo); glBindBuffer(GL_ARRAY_BUFFER, vertVbo); glBufferData(GL_ARRAY_BUFFER, 4*2*sizeof(GLfloat), verts, GL_STATIC_DRAW); glVertexAttribPointer(g_auxPresent.GetAttrLoc("vPosition"), 2, GL_FLOAT, GL_FALSE, 0, NULL); GLuint texVbo = 0; glGenBuffers(1, &texVbo); g_auxPresent.AddVbo("vTex", texVbo); glBindBuffer(GL_ARRAY_BUFFER, texVbo); glBufferData(GL_ARRAY_BUFFER, 4*2*sizeof(GLfloat), texs, GL_STATIC_DRAW); glVertexAttribPointer(g_auxPresent.GetAttrLoc("vTex"), 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(g_auxPresent.GetAttrLoc("vPosition")); glEnableVertexAttribArray(g_auxPresent.GetAttrLoc("vTex")); glUseProgram(g_auxPresent.prog()); { const glm::mat4 id(1.0f); glUniformMatrix4fv(g_auxPresent.GetUniLoc("mvmtx"), 1, false, glm::value_ptr(id)); glUniformMatrix4fv(g_auxPresent.GetUniLoc("prmtx"), 1, false, glm::value_ptr(id)); } glUseProgram(0); glBindVertexArray(0); }
void RiftAppSkeleton::_initPresentDistMesh(ShaderWithVariables& shader, int eyeIdx) { // Init left and right VAOs separately shader.bindVAO(); const ovrDistortionMesh& mesh = m_DistMeshes[eyeIdx]; GLuint vertVbo = 0; glGenBuffers(1, &vertVbo); shader.AddVbo("vPosition", vertVbo); glBindBuffer(GL_ARRAY_BUFFER, vertVbo); glBufferData(GL_ARRAY_BUFFER, mesh.VertexCount * sizeof(ovrDistortionVertex), &mesh.pVertexData[0].ScreenPosNDC.x, GL_STATIC_DRAW); glVertexAttribPointer(shader.GetAttrLoc("vPosition"), 4, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), NULL); glEnableVertexAttribArray(shader.GetAttrLoc("vPosition")); const int a_texR = shader.GetAttrLoc("vTexR"); if (a_texR > -1) { glVertexAttribPointer(a_texR, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), NULL); glEnableVertexAttribArray(a_texR); } const int a_texG = shader.GetAttrLoc("vTexG"); if (a_texG > -1) { glVertexAttribPointer(a_texG, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), NULL); glEnableVertexAttribArray(a_texG); } const int a_texB = shader.GetAttrLoc("vTexB"); if (a_texB > -1) { glVertexAttribPointer(a_texB, 2, GL_FLOAT, GL_FALSE, sizeof(ovrDistortionVertex), NULL); glEnableVertexAttribArray(a_texB); } GLuint elementVbo = 0; glGenBuffers(1, &elementVbo); shader.AddVbo("elements", elementVbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementVbo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, mesh.IndexCount * sizeof(GLushort), &mesh.pIndexData[0], GL_STATIC_DRAW); glBindVertexArray(0); }
void BMFont::DrawString( const std::string& text, int x, int y, const glm::mat4& modelview, const glm::mat4& projection, const ShaderWithVariables& sh ) const { if (text.empty()) return; if (m_texturePages.empty()) return; assert(m_texturePages.size() == 1); std::vector<float> verts; std::vector<unsigned int> indxs; PopulateArrays(text, x, y, verts, indxs); const GLuint prog = sh.prog(); glUseProgram(prog); { glUniformMatrix4fv(sh.GetUniLoc("mvmtx"), 1, false, glm::value_ptr(modelview)); glUniformMatrix4fv(sh.GetUniLoc("prmtx"), 1, false, glm::value_ptr(projection)); ///@todo Support multiple font pages glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_texturePages[0]); glUniform1i(sh.GetUniLoc("texImage"), 0); sh.bindVAO(); { glBindBuffer(GL_ARRAY_BUFFER, sh.GetVboLoc("vPosition")); glBufferData(GL_ARRAY_BUFFER, verts.size()*sizeof(float), &verts[0], GL_STATIC_DRAW); glVertexAttribPointer(sh.GetAttrLoc("vPosition"), 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), NULL); glVertexAttribPointer(sh.GetAttrLoc("vTexCoord"), 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sh.GetVboLoc("elements")); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indxs.size()*sizeof(unsigned int), &indxs[0], GL_STATIC_DRAW); glDrawElements(GL_TRIANGLES, indxs.size(), GL_UNSIGNED_INT, 0); } glBindVertexArray(0); } glUseProgram(0); }