qt中QOpenGLTexture纹理使用

2023-10-29

纹理类型的创建

#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渲染顺序为先进后出的栈顺序。

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt中QOpenGLTexture纹理使用 的相关文章

  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 在 QtCreator 中查看数组内容

    调试时是否可以在 Qt Creator 中查看数组的内容 似乎检测到我的数组是一个数组而不是一个指针 此外 我可以点击一个箭头 就像展开一样 但之后什么也没有显示 当我试穿的时候std vector Qt Creator 设法按预期显示内容
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win

随机推荐

  • Haystack 太强了!存 2600 亿图片

    作者 奇伢 来源 奇伢云存储 小文件存储 小文件存储 老生常谈的问题 先聊聊小文件存储重点关注的是什么 以前我们提过 对于磁盘来说 小 io 吃 iops 大块 io 吃吞吐 划重点 小文件的重点是 io 次数 为什么每次提到海量小文件的时
  • 定时器串口收发和空闲中断串口收发+STM32CubeMX

    引言 最近在做串口实验 总结了两种串口收发的方法 第一种是用定时器定的 第二种是使用空闲中断 第一种 使用定时器 具体做法是在串口接收数据时启动定时器 每接收一帧数据要复位定时值以保证定时器不会溢出 根据波特率计算出大概什么时候接收数据完成
  • 保姆级别uni-app使用低功耗蓝牙

    实现方式 本文使用 uni app Vue3 的方式进行开发 以手机app的方式运行 uni app 提供了低功耗蓝牙 的 api 和微信小程序提供的 api 是一样的 所以本文的讲解也适用于微信小程序 本文参考文档 https blog
  • 普中51单片机独立按键原理及源代码

    由于按键是机械弹性按键 具有弹性 在毫秒级别的时间下 按键后有短暂的抖动 转载自江科大自协化51单片机入门教程 如果按键一次用力较轻 按键里的小金属片可能会多次抖动 使得LED闪烁多次 即轻微按一次 小概率出现多次LED闪烁 消除毫秒级别下
  • 设计模式 -- 享元模式(Flyweight Pattern)

    使用共享对象可以有效的支持大量的细粒度对象 应用场景 主要目的是实现对象的共享 即共享池 当系统中对象多的时候可以减少内存的开销 通常与工厂模式一起使用 例如 缓存 对象池 Android中 Message obtain通过重用Messag
  • 如何在ubuntu系统下安装jdk

    由于换了系统 要从新配置下环境 下面说明下如何在ubuntu系统下安装jdk 首先安装eclipse 我是在ubuntu软件中心安装的 3 8版本 比较老 但图省事也就先这样了 然后要从网上下载jdk1 7 3 8版本最多支持到jkd1 7
  • Android 获取屏幕宽高的正确姿势

    前言 在开发时 我们经常需要根据屏幕的宽高来进行对view的适配 无论是自定义view还是andorid自带的一些控件 比如说需要占当前屏幕高度的30 就需要获取到屏幕的宽高 但在获取宽高时我遇到了一些坑 总结如下 获取高度 下面两种方法都
  • C语言:文件读取

    C语言 文件读取 在C语言中 我们可以使用标准库中的文件操作函数来读取和写入文件 本文将介绍如何使用C语言读取文件 首先 我们需要打开一个文件 可以使用fopen 函数来打开文件 该函数需要两个参数 第一个参数为文件名 第二个参数为打开方式
  • 栈的初始化、销毁、出入栈、取栈顶元素

    一 初始化 void SeqStackInit SeqStack stack if stack NULL return stack gt size 0 stack gt capacity 1000 yuan shi da xiaostack
  • csdn 首发最轻松安装教程:关于centos7 centos8 centos9如何安装erlang和对应版本的rabbitmq

    1 前言 最近做毕业设计 自己装了个虚拟机 但通过各种rpm下载包的方式安装erlang和rabbitmq 总是无法启动或启动失败 琢磨了一番 是erlang相关的包依赖没有自动安装 起码得几十个 由于过于麻烦 下面请看图 所以我写了一个r
  • idea远程调试

    目录 1 背景 2 代码 3 idea配置 4 服务端远程开启debug服务 5 远程调试 5 1 服务端 5 2 本地启动 6 注意 1 背景 线上出了问题 我们一般是通过日志来定位问题 在没有日志的情况下 往往定位问题是比较困难的 这时
  • Java基础教程2-安装和配置Eclipse IDE环境

    前面文章介绍了如何安装JDK和设置环境变量 这篇介绍如何安装eclipse IDE IDE是集成开发环境的意思 你应该听说过eclipse是一个开发人员常用的IDE工具 可以这么说 几乎所有的开发人员都会用这个IDE工具来开发 当然市场上有
  • SpringMVC+Spring+Mybatis +Annotation实现方法,按钮级别的细粒度权限控制

    本文转载自 http blog csdn net ycyk 168 article details 18456631 随着企业信息化的不断深入 各种各样的信息系统成为提高企业运营及管理效率的必备工具 越来越多的企业核心机密如销售机会 客户资
  • ajax同时返回list和字符串,我在页面的后台代码中写了个方法 getList() 返回的是个 string[] 类型的数组,要在javascript 中调用...

    AJAX tools ajax conn function ajaxSubmit url postStr action var ajax false try ajax new ActiveXObject Msxml2 XMLHTTP cat
  • Django与mysql(2)-jquery(2)

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 18天
  • docker 容器ping不通宿主机/外网问题

    docker 容器ping不通宿主机 外网问题 问题 docker 容器与数据库建立连接失败 宿主机ip在数据库的白名单中 宿主机连接数据库成功 那么问题就剩docker 容器的网络与数据库是否是通的 启动服务进入容器内部 ping数据库是
  • django得到Model的全部字段名(field)

    得到所有的field MyModel meta get fields 打印全部字段名称 print field name for field in OriginFlowModel meta get fields
  • Scala中的case类

    1 使用场景 1 1首先 在一个类前添加 case Scala会自动给这个类 创建伴生对象 并创建好 apply 工厂方法 和 unapply 方法 使得 实例化该类时 不需要用new 函数式编程写法就可 eg case class Peo
  • 解决ERROR (Errno::ENOENT): No such file or directory

    在windows上安装Ruby后 再通过gem install redis dump命令来安装RedisDump 在通过使用redis dump命令进行验证RedisDump是否安装成功时 提示错误如下 解决办法如下 查找Ruby的安装目录
  • qt中QOpenGLTexture纹理使用

    纹理类型的创建 include