void exposeEvent(QExposeEvent *) { if (!isExposed()) return; if (!gl) { gl = new QOpenGLContext(); gl->setFormat(requestedFormat()); gl->create(); } gl->makeCurrent(this); QOpenGLShaderProgram prog; prog.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute highp vec4 a_Pos;" "attribute lowp vec4 a_Color;" "varying lowp vec4 v_Color;" "void main() {" " gl_Position = a_Pos;" " v_Color = a_Color;" "}"); prog.addShaderFromSourceCode(QOpenGLShader::Fragment, "varying lowp vec4 v_Color;" "void main() {" " gl_FragColor = v_Color;" "}"); prog.bind(); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, width(), height()); prog.enableAttributeArray("a_Pos"); prog.enableAttributeArray("a_Color"); float coords[] = { -0.7f, 0.7f, 0.8f, 0.8f, -0.8f, -0.8f, 0.7f, -0.7f }; float colors[] = { 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0 }; prog.setAttributeArray("a_Pos", GL_FLOAT, coords, 2, 0); prog.setAttributeArray("a_Color", GL_FLOAT, colors, 4, 0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); prog.disableAttributeArray("a_Pos"); prog.disableAttributeArray("a_Color"); gl->swapBuffers(this); }
/****************************************************************************** * Renders a 2d polyline in the viewport. ******************************************************************************/ void ViewportSceneRenderer::render2DPolyline(const Point2* points, int count, const ColorA& color, bool closed) { OVITO_STATIC_ASSERT(sizeof(points[0]) == 2*sizeof(GLfloat)); // Load OpenGL shader. QOpenGLShaderProgram* shader = loadShaderProgram("line", ":/core/glsl/lines/line.vs", ":/core/glsl/lines/line.fs"); if(!shader->bind()) throw Exception(tr("Failed to bind OpenGL shader.")); bool wasDepthTestEnabled = glIsEnabled(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST); GLint vc[4]; glGetIntegerv(GL_VIEWPORT, vc); QMatrix4x4 tm; tm.ortho(vc[0], vc[0] + vc[2], vc[1] + vc[3], vc[1], -1, 1); OVITO_CHECK_OPENGL(shader->setUniformValue("modelview_projection_matrix", tm)); QOpenGLBuffer vertexBuffer; if(glformat().majorVersion() >= 3) { if(!vertexBuffer.create()) throw Exception(tr("Failed to create OpenGL vertex buffer.")); if(!vertexBuffer.bind()) throw Exception(tr("Failed to bind OpenGL vertex buffer.")); vertexBuffer.allocate(points, 2 * sizeof(GLfloat) * count); OVITO_CHECK_OPENGL(shader->enableAttributeArray("position")); OVITO_CHECK_OPENGL(shader->setAttributeBuffer("position", GL_FLOAT, 0, 2)); vertexBuffer.release(); } else { OVITO_CHECK_OPENGL(glEnableClientState(GL_VERTEX_ARRAY)); OVITO_CHECK_OPENGL(glVertexPointer(2, GL_FLOAT, 0, points)); } if(glformat().majorVersion() >= 3) { OVITO_CHECK_OPENGL(shader->disableAttributeArray("color")); OVITO_CHECK_OPENGL(shader->setAttributeValue("color", color.r(), color.g(), color.b(), color.a())); } else { OVITO_CHECK_OPENGL(glColor4(color)); } OVITO_CHECK_OPENGL(glDrawArrays(closed ? GL_LINE_LOOP : GL_LINE_STRIP, 0, count)); if(glformat().majorVersion() >= 3) { shader->disableAttributeArray("position"); } else { OVITO_CHECK_OPENGL(glDisableClientState(GL_VERTEX_ARRAY)); } shader->release(); if(wasDepthTestEnabled) glEnable(GL_DEPTH_TEST); }
void Painter::renderScene(const Camera &camera) { m_envMap->paint(camera); /* Paint gems */ QOpenGLShaderProgram *gemProgram = (*m_shaderPrograms)[ShaderPrograms::GemProgram]; gemProgram->bind(); gemProgram->enableAttributeArray(0); gemProgram->enableAttributeArray(1); gemProgram->setUniformValue("envmap", 0); gemProgram->setUniformValue("gemStructureMap", 1); gemProgram->setUniformValue("rainbowMap", 2); gemProgram->setUniformValue("eye", camera.eye()); gemProgram->setUniformValue("viewProjection", camera.viewProjection()); m_gl->glActiveTexture(GL_TEXTURE0); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, m_envMap->cubeMapTexture()); m_gl->glActiveTexture(GL_TEXTURE1); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, m_gemStructureMap->cubeMapTexture()); m_gl->glActiveTexture(GL_TEXTURE2); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, m_rainbowMap->cubeMapTexture()); QHash<ShaderPrograms, QOpenGLShaderProgram*> shaderPrograms; shaderPrograms.insert(ShaderPrograms::GemProgram, m_shaderPrograms->value(ShaderPrograms::GemProgram)); shaderPrograms.insert(ShaderPrograms::LighRayProgram, m_shaderPrograms->value(ShaderPrograms::LighRayProgram)); m_sceneRenderer->paint(*m_gl, camera.viewProjection(), shaderPrograms); m_gl->glActiveTexture(GL_TEXTURE0); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, 0); m_gl->glActiveTexture(GL_TEXTURE1); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, 0); m_gl->glActiveTexture(GL_TEXTURE2); m_gl->glBindTexture(GL_TEXTURE_CUBE_MAP, 0); m_gl->glBindTexture(GL_TEXTURE_2D, 0); gemProgram->disableAttributeArray(0); gemProgram->disableAttributeArray(1); gemProgram->release(); }
void csSurface::draw(QOpenGLShaderProgram& program) { if( _initRequired ) { initialize(); } if( _meshInfo.isEmpty() ) { return; } glDisable(GL_CULL_FACE); program.setUniformValue("cs_Model", _model); program.setUniformValue("cs_zMin", _meshInfo.zMin()); program.setUniformValue("cs_zInterval", _meshInfo.zInterval()); program.setUniformValue("cs_ColorMap", TMU_COLORMAP); _surface->bind(); const int vertexLoc = program.attributeLocation("cs_Vertex"); program.enableAttributeArray(vertexLoc); program.setAttributeBuffer(vertexLoc, GL_FLOAT, 0, 3); _colorTexture->bind(TMU_COLORMAP, QOpenGLTexture::ResetTextureUnit); _strip->bind(); const int numStrips = _meshInfo.rowCount() -1; const int numVertPerStrip = 2*_meshInfo.columnCount(); for(int y = 0; y < numStrips; y++) { const GLuint offset = sizeof(GLuint)*y*numVertPerStrip; const GLvoid *indices = (GLvoid*)offset; glDrawElements(GL_TRIANGLE_STRIP, numVertPerStrip, GL_UNSIGNED_INT, indices); } _strip->release(); _colorTexture->release(); program.disableAttributeArray(vertexLoc); _surface->release(); }
void csSurface::drawMesh(QOpenGLShaderProgram& program) { if( _initRequired ) { initialize(); } if( _meshInfo.isEmpty() ) { return; } program.setUniformValue("cs_DepthOffset", csCoordinateBox::DepthOffset); program.setUniformValue("cs_Model", _model); _surface->bind(); const int vertexLoc = program.attributeLocation("cs_Vertex"); program.enableAttributeArray(vertexLoc); program.setAttributeBuffer(vertexLoc, GL_FLOAT, 0, 3); const int colorLoc = program.attributeLocation("cs_Color"); program.setAttributeValue(colorLoc, QColor(Qt::black)); // Along x-Axis for(int y = 0; y < _meshInfo.rowCount(); y++) { glDrawArrays(GL_LINE_STRIP, y*_meshInfo.columnCount(), _meshInfo.columnCount()); } // Along y-Axis _meshY->bind(); for(int x = 0; x < _meshInfo.columnCount(); x++) { const GLuint offset = sizeof(GLuint)*x*_meshInfo.rowCount(); const GLvoid *indices = (GLvoid*)offset; glDrawElements(GL_LINE_STRIP, _meshInfo.rowCount(), GL_UNSIGNED_INT, indices); } _meshY->release(); program.disableAttributeArray(vertexLoc); _surface->release(); }
void VideoSurface::paintGL() { mutex.lock(); VideoFrame currFrame = frame; frame.invalidate(); mutex.unlock(); if (currFrame.isValid() && res != currFrame.resolution) { res = currFrame.resolution; // delete old texture if (textureId != 0) glDeleteTextures(1, &textureId); // a texture used to render the pbo (has the match the pixelformat of the source) glGenTextures(1,&textureId); glBindTexture(GL_TEXTURE_2D, textureId); glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, res.width(), res.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } if (currFrame.isValid()) { pboIndex = (pboIndex + 1) % 2; int nextPboIndex = (pboIndex + 1) % 2; if (pboAllocSize != currFrame.frameData.size()) { qDebug() << "VideoSurface: Resize pbo " << currFrame.frameData.size() << "(" << currFrame.resolution << ")" << "bytes (before" << pboAllocSize << ")"; pbo[0]->bind(); pbo[0]->allocate(currFrame.frameData.size()); pbo[0]->release(); pbo[1]->bind(); pbo[1]->allocate(currFrame.frameData.size()); pbo[1]->release(); pboAllocSize = currFrame.frameData.size(); } pbo[pboIndex]->bind(); glBindTexture(GL_TEXTURE_2D, textureId); glTexSubImage2D(GL_TEXTURE_2D,0,0,0, res.width(), res.height(), GL_RGB, GL_UNSIGNED_BYTE, 0); pbo[pboIndex]->unmap(); pbo[pboIndex]->release(); // transfer data pbo[nextPboIndex]->bind(); void* ptr = pbo[nextPboIndex]->map(QOpenGLBuffer::WriteOnly); if (ptr) memcpy(ptr, currFrame.frameData.data(), currFrame.frameData.size()); pbo[nextPboIndex]->unmap(); pbo[nextPboIndex]->release(); } // background glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); // keep aspect ratio float aspectRatio = float(res.width()) / float(res.height()); if (width() < float(height()) * aspectRatio) { float h = float(width()) / aspectRatio; glViewport(0, (height() - h)*0.5f, width(), h); } else { float w = float(height()) * float(aspectRatio); glViewport((width() - w)*0.5f, 0, w, height()); } QOpenGLShaderProgram* programm = nullptr; switch (frame.format) { case VideoFrame::YUV: programm = yuvProgramm; break; case VideoFrame::BGR: programm = bgrProgramm; break; default: break; } if (programm) { // render pbo static float values[] = { -1, -1, 1, -1, -1, 1, 1, 1 }; programm->bind(); programm->setAttributeArray(0, GL_FLOAT, values, 2); programm->enableAttributeArray(0); } glBindTexture(GL_TEXTURE_2D, textureId); //draw fullscreen quad glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindTexture(GL_TEXTURE_2D, 0); if (programm) { programm->disableAttributeArray(0); programm->release(); } }