qt中QOpenGLTexture纹理使用

纹理类型的创建

#include <QOpenGLTexture>
QOpenGLTexture *m_texture, *v_texture;

添加纹理图像

	m_texture = new QOpenGLTexture(QImage("://container.jpg").mirrored());
	
    v_texture = new QOpenGLTexture(QImage("://awesomeface.png").mirrored());
    

配置纹理参数

	m_texture->setMinificationFilter(QOpenGLTexture::Nearest);//缩小
	m_texture->setMagnificationFilter(QOpenGLTexture::Linear);//放大
	m_texture->setWrapMode(QOpenGLTexture::Repeat);//环绕模式
	v_texture->setMinificationFilter(QOpenGLTexture::Nearest);
    v_texture->setMagnificationFilter(QOpenGLTexture::Linear);
    v_texture->setWrapMode(QOpenGLTexture::Repeat);

激活顶点属性

设置图形顶点对应的纹理顶点

program->setAttributeBuffer(2, GL_FLOAT, 6*sizeof (GL_FLOAT), 2, 8*sizeof(GL_FLOAT));
program->enableAttributeArray(2);

绑定到uniform全局变量

program->setUniformValue("texturewall", 0);
m_texture->bind(0);
program->setUniformValue("textureface", 1);
v_texture->bind(1);

管线

vertex

#version 450 core

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec3 vertexColor;
layout(location = 2) in vec2 vTexcoord;

out vec3 Color;
out vec2 Texcoord;

void main(void)
{
    gl_Position =  vec4(vertexPosition,1.0);
    Color = vertexColor;
    Texcoord = vTexcoord;
}

fragment

#version 450 core

in vec3 Color;
in vec2 Texcoord;
out vec4 FragColor;

uniform sampler2D texturewall;
uniform sampler2D textureface;

void main(void)
{
    FragColor = mix(texture(texturewall, Texcoord),texture(textureface,Texcoord),0.3)
            * vec4(Color,1);
}

主要代码
openglwidget

#include "openglwidget.h"
#include <iostream>
#include <QDebug>

OpenGLWidget::OpenGLWidget(QWidget* parent)
    :QOpenGLWidget(parent)
{

}

void OpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();
//-------------------------------------------------------------------------------------

    // vertex shader
    QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
    //创建一个shader,类型为QOpenGLShader::Vertex,与当前OpenGLWidget(this)关联
    vshader->compileSourceFile("://coloredTriangle.vert");

    // fragment shader
    QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
    fshader->compileSourceFile("://coloredTriangle.frag");

    // shader program
    program = new QOpenGLShaderProgram;
    program->addShader(vshader);
    program->addShader(fshader);
    //program->addShaderFromSourceFile(QOpenGLShader::Vertex, "://coloredTriangle.vert");
    //也可以用上述函数添加
    program->link();

    GLfloat vertices1[] = {
        //location(顶点坐标)     color         texture coords(纹理坐标)
        -1.0f,  0.0f, 0.0f,    1.0f, 0.0f, 0.0f,  0.0f, 1.0f,  //左中--左上
        -1.0f, -1.0f, 0.0f,    0.0f, 0.0f, 1.0f,  0.0f, 0.0f,  //左下--左下
        0.0f, -1.0f, 0.0f,    0.0f, 1.0f, 0.0f,  1.0f, 0.0f,  //中下--右下
        0.0f,  0.0f, 0.0f,    0.3f, 0.3f, 0.3f,  1.0f, 1.0f,  //居中--右上
        -1.0f,  0.0f, 0.0f,    1.0f, 0.0f, 0.0f,  0.0f, 1.0f,  //左中--左上
        0.0f, -1.0f, 0.0f,    0.0f, 1.0f, 0.0f,  1.0f, 0.0f,  //中下--右下
    };

    //set up buffers and configure vertex attributes
    //设置缓存区配置顶点属性
    QOpenGLBuffer VBO(QOpenGLBuffer::VertexBuffer);
    VBO.create();
    if(!VBO.isCreated()){
        qDebug()<<"vbo is not created.";
    }
    VBO.bind();
    VAO.create();
    if(!VAO.isCreated()){
        qDebug()<<"vao is not created.";
    }
    VAO.bind();
    m_texture = new QOpenGLTexture(QImage("://container.jpg").mirrored());
    m_texture->setMinificationFilter(QOpenGLTexture::Nearest);
    m_texture->setMagnificationFilter(QOpenGLTexture::Linear);
    m_texture->setWrapMode(QOpenGLTexture::Repeat);
    v_texture = new QOpenGLTexture(QImage("://awesomeface.png").mirrored());
    v_texture->setMinificationFilter(QOpenGLTexture::Nearest);
    v_texture->setMagnificationFilter(QOpenGLTexture::Linear);
    v_texture->setWrapMode(QOpenGLTexture::Repeat);

    VBO.allocate(vertices1,sizeof (vertices1));
    program->setAttributeBuffer(0, GL_FLOAT, 0, 3, 8*sizeof(GL_FLOAT));
    program->enableAttributeArray(0);
    program->setAttributeBuffer(1, GL_FLOAT, 3*sizeof (GL_FLOAT), 3, 8*sizeof(GL_FLOAT));
    program->enableAttributeArray(1);
    program->setAttributeBuffer(2, GL_FLOAT, 6*sizeof (GL_FLOAT), 2, 8*sizeof(GL_FLOAT));
    program->enableAttributeArray(2);

    program->release();
    VAO.release();

    glClearColor(0.5f, 0.5f, 1.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);


}

void OpenGLWidget::resizeGL(int w, int h)
{

}

void OpenGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    //glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    program->bind();
    VAO.bind();
    program->setUniformValue("texturewall", 0);
    m_texture->bind(0);
    program->setUniformValue("textureface", 1);
    v_texture->bind(1);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    program->release();

    //  glDrawArrays渲染顺序为先进后出的栈顺序。

}


版权声明:本文为weixin_44518102原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。