opengl之纹理贴图
h
#ifndef TEXTURE_RENDER_H #define TEXTURE_RENDER_H #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLBuffer> #include <QOpenGLVertexArrayObject> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QOpenGLTexture> #include <memory> namespace View3D{ class TextureRender { public: TextureRender(); ~TextureRender(); void setTextures(std::vector<std::shared_ptr<QOpenGLTexture>>& textures_t); void inputVertices( QOpenGLWidget* Widget_t, std::unique_ptr<GLfloat[]>& vertices_t, uint32_t num_t); void textureInitializeGL(); void texturePaintGL(); private: QOpenGLWidget* Widget; std::unique_ptr<GLfloat[]> vertices; //GLfloat* vertices; uint32_t num_vertices; std::vector<std::shared_ptr<QOpenGLTexture>> textures; QOpenGLShaderProgram program; QOpenGLBuffer vbo, ebo; QOpenGLVertexArrayObject vao; }; } #endif // TEXTURE_RENDER_H
cpp
#include "texture_render.h" namespace View3D{ /************************************************************/ TextureRender::TextureRender(){} /************************************************************/ TextureRender::~TextureRender(){ vbo.destroy(); ebo.destroy(); vao.destroy(); } /************************************************************/ void TextureRender::setTextures(std::vector<std::shared_ptr<QOpenGLTexture>>& textures_t){ textures = textures_t; } /************************************************************/ void TextureRender::inputVertices( QOpenGLWidget* Widget_t, std::unique_ptr<GLfloat[]>& vertices_t, uint32_t num_t){ Widget = Widget_t; vertices = std::move(vertices_t); num_vertices = num_t; } /************************************************************/ void TextureRender::textureInitializeGL(){ QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, Widget); const char *vsrc =R"( attribute highp vec4 vertex; attribute mediump vec4 texCoord; varying mediump vec4 texc; uniform mediump mat4 matrix; uniform mediump mat4 projection; void main(void) { gl_Position = projection* matrix * vertex; texc = texCoord; })"; vshader->compileSourceCode(vsrc); QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, Widget); const char *fsrc =R"( uniform sampler2D texture; varying mediump vec4 texc; void main(void) { gl_FragColor = texture2D(texture, texc.st); })"; fshader->compileSourceCode(fsrc); program.addShader(vshader); program.addShader(fshader); program.bindAttributeLocation("vertex", 0); program.bindAttributeLocation("texCoord", 1); program.link(); program.bind(); program.setUniformValue("texture", 0); vao.create(); QOpenGLVertexArrayObject::Binder vaoBinder(&vao); vbo.create(); vbo.bind(); vbo.allocate(vertices.get(), sizeof(GLfloat)*num_vertices); program.enableAttributeArray(0); program.enableAttributeArray(1); program.setAttributeBuffer(0, GL_FLOAT, 0, 3, 5 * sizeof(GLfloat)); program.setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(GLfloat), 2, 5 * sizeof(GLfloat)); vbo.release(); } /************************************************************/ void TextureRender::texturePaintGL(){ glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //GL_DEPTH_BUFFER_BIT QMatrix4x4 m; //m.ortho(-0.5f, +0.5f, +0.5f, -0.5f, 4.0f, 15.0f); // m.translate(xPosition/1000.f, yPosition/1000.0f, -10.0f); // m.rotate(xRot / 16.0f, 1.0f, 0.0f, 0.0f); // m.rotate(yRot / 16.0f, 0.0f, 1.0f, 0.0f); // m.rotate(zRot / 16.0f, 0.0f, 0.0f, 1.0f); //m.scale(projectionfovy); QMatrix4x4 projection; //projection.perspective(projectionfovy, 1.0f*width()/height(), 0.1f, 100.0f); //projection.lookAt(); program.setUniformValue("matrix", m); program.setUniformValue("projection", projection); for(int i = 0; i < textures.size(); ++i) { textures[i]->bind(); glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4); //glDrawElements } } }