//clockwise 4 vertex uv TL TR BL BR void CubeFace::create(float x1,float y1, float x2,float y2,float x3,float y3,float x4,float y4) { QOpenGLFunctions f = QOpenGLFunctions(QOpenGLContext::currentContext()); //creat the vertexes float CubeFaceVertices[] = { // Positions // Texture Coords 1,-1, 0, x3, y3, 1, 1, 0, x2, y2, -1, 1, 0, x1, y1, -1, 1, 0, x1, y1, -1,-1, 0, x4, y4, 1,-1, 0, x3, y3, }; m_buffer->bind(); m_buffer->allocate(CubeFaceVertices, sizeof(CubeFaceVertices)); m_vao->bind(); f.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); f.glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); f.glEnableVertexAttribArray(0); f.glEnableVertexAttribArray(1); m_vao->release(); m_buffer->release(); }
void CubeFace::draw() { m_vao->bind(); QOpenGLFunctions f = QOpenGLFunctions(QOpenGLContext::currentContext()); f.glDrawArrays(GL_TRIANGLES, 0, 12); m_vao->release(); }
void SSGTexture::updateBindOptions(bool force) { QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); if (force || m_filteringChanged) { bool minLinear{m_minFilterMode == Linear}; bool magLinear{m_magFilterMode == Linear}; GLint minFilter = minLinear ? GL_LINEAR : GL_NEAREST; GLint magFilter = magLinear ? GL_LINEAR : GL_NEAREST; if (hasMipmaps()) { if (m_minMipmapMode == Nearest) minFilter = minLinear ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST; else if (m_minMipmapMode == Linear) minFilter = minLinear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_LINEAR; if (m_magMipmapMode == Nearest) magFilter = magLinear ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST; else if (m_magMipmapMode == Linear) magFilter = magLinear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_LINEAR; } funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter); funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); m_filteringChanged = false; } if (force || m_wrapChanged) { #ifndef QT_NO_DEBUG if (m_horizontalWrap == Repeat || m_verticalWrap == Repeat) { bool npotSupported = QOpenGLFunctions(QOpenGLContext::currentContext()).hasOpenGLFeature(QOpenGLFunctions::NPOTTextures); QSize size = textureSize(); bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); if (!npotSupported && isNpot) qWarning("Scene Graph: This system does not support the REPEAT wrap mode for non-power-of-two textures."); } #endif funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_horizontalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE); funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_verticalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE); m_wrapChanged = false; } }
void updateSubImage(GLuint texture, const QImage &image, const QRect &rect, bool mipmaps) { mipmaps = mipmaps && canUseMipmaps(image.size()); QVector<uchar> data; for (int i = rect.y(); i <= rect.bottom(); ++i) { QRgb *p = (QRgb *)image.scanLine(i); for (int j = rect.x(); j <= rect.right(); ++j) { data << qRed(p[j]); data << qGreen(p[j]); data << qBlue(p[j]); data << qAlpha(p[j]); } } glBindTexture(GL_TEXTURE_2D, texture); glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.width(), rect.height(), GL_RGBA, GL_UNSIGNED_BYTE, data.constData()); if (mipmaps) QOpenGLFunctions(QOpenGLContext::currentContext()).glGenerateMipmap(GL_TEXTURE_2D); }
/*! \fn bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects() Returns \c true if the OpenGL \c{GL_EXT_framebuffer_object} extension is present on this system; otherwise returns \c false. */ bool QOpenGLFramebufferObject::hasOpenGLFramebufferObjects() { return QOpenGLFunctions(QOpenGLContext::currentContext()).hasOpenGLFeature(QOpenGLFunctions::Framebuffers); }