QT中的OpenGL学习------向量

Learn OpenGL with Qt——加载3D模型 模型 现在是时候着手启用Assimp,并开始创建实际的加载和转换代码了。我们重新创建一个项目,回忆一下是否还能想起如何创建opengl窗口? ——创建新项目(ModelLoading) ——以QWidget为基类,取消勾选创建界面 ——修改Widget公有继承自QOpenGLWidget,QOpenGLExtraFunctions(注意引入头文件) ——实现三个虚函数 ——在initializeGL中初始化opengl ——在paintGL中清屏 ——在resizeGL中设置Viewpo.. 阅读详情

一、线性代数知识

1.1 向量的点乘与叉乘

1.2 矩阵

1.3 旋转、缩放、位移

二、代码实现

#include "openglwidget.h"

unsigned int VBO, VAO, EBO;
float ratio = 0.5;
float vertices[] =
{
    //positions //colors //texture coordinates
    0.3f, 0.3f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,//右上
    0.3f, -0.3f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,//右下
    -0.3f, -0.3f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,//左下
    -0.3f, 0.3f, 0.0f, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f//左上
};
//九格
//float vertices[] =
//{
//    //positions //colors //texture coordinates
//    0.9f, 0.9f, 0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f,//右上
//    0.9f, -0.9f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, -1.0f,//右下
//    -0.9f, -0.9f, 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, -1.0f,//左下
//    -0.9f, 0.9f, 0.0f, 0.5f, 0.5f, 0.5f, -1.0f, 2.0f//左上
//};
unsigned int indices[] = //note that we start from 0!
{
    0, 1, 3,//第一个三角形
    1, 2, 3 // 第二个三角形
};

OpenGLWidget::OpenGLWidget(QWidget* parent) : QOpenGLWidget(parent)
{
    setFocusPolicy(Qt::StrongFocus);
    m_timer = new QTimer;
    m_timer->start(100);
    connect(m_timer, &QTimer::timeout, this, [=](){
        update();
    });
}

OpenGLWidget::~OpenGLWidget()
{
    makeCurrent();
    glDeleteBuffers(1,&VBO);
    glDeleteBuffers(1, &EBO);
    glDeleteVertexArrays(1,&VAO);
    doneCurrent();
}

void OpenGLWidget::drawShape(Shape shape)
{
    m_shape = shape;
    update();
}

void OpenGLWidget::setWireframe(bool wireframe)
{
    makeCurrent();
    if (wireframe)
    {
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    }
    else
    {
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }
    update();
    doneCurrent();
}

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

    //使用QT封装的着色器
    bool success;
    m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/shapes.vert");//顶点着色器
    m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/shapes.frag");//片段着色器
    success = m_shaderProgram.link();//连接到着色器
    if(!success)
        qDebug() << "ERR:" << m_shaderProgram.log();

    //创建VBO和VAO对象,并赋予ID
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    //绑定VBO和VAO对象
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    //为当前绑定到target的缓冲区对象创建一个新的数据存储
    //如果data不是NULL,则使用来自此指针的数据初始化数据存储
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    //访问着色器里面属性的位置
    m_shaderProgram.bind();
    GLint posLocation = m_shaderProgram.attributeLocation("aPos");//询问着色器里面变量aPos顶点信息的属性位置
//    GLint colorLocation = m_shaderProgram.attributeLocation("aColor");//询问着色器里面变量ourColor颜色信息的属性位置
    GLint textureLocation = m_shaderProgram.attributeLocation("aTextureCoordinates");

    //告知显卡如何解析缓冲里的顶点属性值
    glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
//    //告知显卡如何解析缓冲里的颜色属性值
//    glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    //告知显卡如何解析缓冲里的纹理属性值
    glVertexAttribPointer(textureLocation, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

    //开启VAO管理的顶点属性值
    glEnableVertexAttribArray(posLocation);
//    //开启VAO管理的颜色属性值
//    glEnableVertexAttribArray(colorLocation);
    //开启VAO管理的纹理属性值
    glEnableVertexAttribArray(textureLocation);

    //EBO创建与绑定
    glGenBuffers(1, &EBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    //纹理
    textureWall = new QOpenGLTexture(QImage(":/imags/imag/1.jpg").mirrored());
    textureLe = new QOpenGLTexture(QImage(":/imags/imag/2.jpg").mirrored());
    textureSmall = new QOpenGLTexture(QImage(":/imags/imag/3.jpg").mirrored());
    texturePJ = new QOpenGLTexture(QImage(":/imags/imag/4.jpg").mirrored());
    //设置纹理单元,纹理单元有16个
    m_shaderProgram.bind();
    m_shaderProgram.setUniformValue("textureWall", 0);
    m_shaderProgram.setUniformValue("textureLe", 1);
    m_shaderProgram.setUniformValue("textureSmall", 2);
    m_shaderProgram.setUniformValue("texturePJ", 3);

    //设置渐远纹理
    texturePJ->generateMipMaps();

    //纹理绑定
    texturePJ->bind(3);
    textureSmall->bind(2);
    textureLe->bind(1);
    textureWall->bind(0);
    /**********在画之前设置纹理参数**********/
//    float borderColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
    //复制,qt默认复制
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    //镜像,T和S对应X和Y轴
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

    //纹理坐标约束到0到1,超出部分边缘拉伸
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);

    //超出坐标指定边缘色
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
//  glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

    //纹理像素(过滤),
    //GL_NEAREST高新能低质量/GL_LINEAR高质量低性能,
    //这里设置缩小像素,放大线性
    //GL_LINEAR_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_LINEAR渐远纹理
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    /*************************************/

    //VAO和VBO绑定为0,相当于释放休息
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

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

void OpenGLWidget::paintGL()
{
    QMatrix4x4 matrix;
    unsigned int time = QTime::currentTime().msec();
    //先旋转再位移,图片在固定位置旋转
    //先位移再旋转,图片围着一个地方转
    //具体参考线性代数矩阵知识
    matrix.translate(0.5, -0.5, 0);//位移
    matrix.rotate(time, 0.0f, 0.0f, 1.0f);//旋转

    //red:0.0f无色,1.0f全红
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    m_shaderProgram.bind();//绑定可以理解为使用它
    m_shaderProgram.setUniformValue("ratio", ratio);
    glBindVertexArray(VAO);

    /*
        * EBO解绑时VAO会记录,如果EBO上面解绑了,即
        * glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
        * 那么glDrawElements画要素需要索引,即
        * glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, &indices)
        * VBO不存在这个问题,VAO不存储VBO的绑定函数调用
    */
    switch (m_shape)
    {
    case Rect:
        //纹理绑定
//        texturePJ->bind(3);
//        textureSmall->bind(2);
        textureLe->bind(1);
        textureWall->bind(0);

        //旋转设置
        m_shaderProgram.setUniformValue("theMatrix", matrix);
        //图形绘画
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);

        //画第二个图
        matrix.setToIdentity();//变回单位向量,不受前面设置的影响
        matrix.translate(-0.5, 0.5, 0);//右上角
        matrix.scale(fabs(sin(time)));//放大缩小,abs取绝对值,f浮点型
        m_shaderProgram.setUniformValue("theMatrix", matrix);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);

        break;
    default:
        break;
    }
}

void OpenGLWidget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_Up:
        ratio += 0.1;
        break;
    case Qt::Key_Down:
        ratio -= 0.1;
        break;
    default:
        break;
    }
    if(ratio>1) ratio = 1;
    if(ratio<0) ratio = 0;

    m_shaderProgram.bind();
    m_shaderProgram.setUniformValue("ratio", ratio);
    update();
}



#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H

#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QKeyEvent>
#include <QMatrix4x4>
#include <QTime>
#include <QTimer>
#include <QtMath>

class OpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    enum Shape {None, Rect, Circle, Triangle};
    explicit OpenGLWidget(QWidget* parent = nullptr);
    ~OpenGLWidget();

    void drawShape(Shape shape);
    void setWireframe(bool wireframe);

protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    virtual void keyPressEvent(QKeyEvent *event);

signals:

private:
    Shape m_shape;
    QOpenGLShaderProgram m_shaderProgram;
    QOpenGLTexture *textureWall;
    QOpenGLTexture *textureLe;
    QOpenGLTexture *textureSmall;
    QOpenGLTexture *texturePJ;
    QTimer *m_timer;
};

#endif // OPENGLWIDGET_H
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TextureCoordinates;
uniform sampler2D textureWall;
uniform sampler2D textureLe;
uniform sampler2D textureSmall;
uniform sampler2D texturePJ;
uniform float ratio;
void main()
{
    //原图混合rgb颜色
//    FragColor = texture(textureWall, TextureCoordinates)*vec4(1.0, 1.0, 0.0, 0.2);
    //多张图融合
    FragColor = mix(texture(textureWall, TextureCoordinates), texture(textureLe, TextureCoordinates), ratio);
    //纹理
//    FragColor = texture(texturePJ, TextureCoordinates);
}
#version 330 core
layout (location = 2) in vec3 aPos;//location属性位置有16个
layout (location = 3) in vec3 aColor;
layout (location = 1) in vec2 aTextureCoordinates;
out vec3 ourColor;
out vec2 TextureCoordinates;
uniform mat4 theMatrix;//矩阵
void main()
{
//    gl_Position = vec4(aPos, 1.0);
    gl_Position = theMatrix * vec4(aPos, 1.0);
    ourColor = aColor;
    TextureCoordinates = aTextureCoordinates;
    //图片翻转
//    TextureCoordinates = vec2(1-aTextureCoordinates.s, aTextureCoordinates.t);
}

三、演示视屏

旋转跳跃无极限

四、详细学习资料

自行前往B站观看up主的视频:

4-5练习_哔哩哔哩_bilibili

Qt OpenGL初探 - 画坐标轴 OpenGL使软件开发人员能够在CAD、内容创建、能源、娱乐、游戏开发、制造、医疗和虚拟现实等市场中创建高性能、视觉吸引力强的图形软件应用程序。`Qt OpenGL`模块可以很方便地将OpenGL应用在Qt程序中,本文使用其画了一个3D坐标轴,并详细讲解了具体的编码过程与官方手册的使用。 阅读详情

相关推荐

Qt下学习OpenGL之OBJ模型

我这里的OBJ格式不是c++代码产生的中间文件,而是那个g什么wave公司的OBJ格式,格式很简单,作用就是拿来存储3D模型的一些基本信息。以前在VS2005下能很轻松读取,这次换QT了,幸好QT公司对客户很用心和负责,在其QtLab下发现了不错的类和代码。加以运用,成功导入OBJ~   切入正题。   首先这个类会需要引用该文件point3d.h,其内容如下:#ifndef POINT3

stilling2006的专栏 6154

Qt QVector 详解:从底层原理到高级用法

qvector

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1万+

Qt中的OpenGL (3)[着色器]

本文是学习OpenGL的笔记,主要参考JoeyDeVries的LearnOpenGL教程,并将教程中的代码基于Qt进行实现。

会写BUG 838

QT学习笔记(六)

第11章 容器类 Qt提供了自己的容器类,在编写Qt程序时,既可以使用Qt容器,也可以使用STL容器。 连续容器 1)向量QVector<T>:它是一种与数组相似的数据结构,它可以把项存储到内存中相邻的位置。向量与普通C++数组的区别在于:向量知道自己的大小并且可以被重新定义大小。 在向量的末尾添加或删除额外的项是非常快速有效的,而在向量的前面或中间插入或删除项则是比较耗时的,因为...

Weiren_Changgong的博客 980

Qt中的OpenGL (7)[摄像机]

本文是学习OpenGL的笔记,主要参考JoeyDeVries的LearnOpenGL教程,并将教程中的代码基于Qt进行实现。

会写BUG 1041

在Qt中使用OpenGL(七)

在Qt中使用OpenGL模拟光照

Ninsun的博客 4733

QT中QVector的基本用法

一、利用data把QVector中的数据取出来 T *QVector::data() Returns a pointer to the data stored in the vector. The pointer can be used to access and modify the items in the vector. Example: QVector<int&g...

尘埃飞舞 5万+

QT5.9.2+OpenGL,使用最新的QOpenGLWidget框架shader编程

QT5.9.2+OpenGL,使用最新的QOpenGLWidget框架shader编程,原始的框架都采用QGLWidget,这是即将被QT淘汰的框架,现在使用的QOpenGLWidget框架,简单明了,代码通俗易懂,能够很好的入门。代码实现了用OpenGL Shader语言绘制彩色三角形。

计算两个平面向量之间的转角及Qt代码实现

用QGraphicsView、QGrapphicsScene、QGraphicsItem绘图架构实现仪表盘的旋转角标

weixin_42898801的博客 1276

基于QT开发的线性代数初学者的矩阵计算器设计.zip

资源包含文件:设计报告word+项目源码+讲解视频 开发软件:Visual Studio 2019,Qt5.14.2,Qt VS Tools (version 2.7.1) 版本完成了以下部分的计算代码: 矩阵基本运算(加、减、乘),初等行变换(交换两行,将一行乘上某个实数,将一行的几倍加到另一行上)、求行列式,求逆矩阵,求解有唯一解的线性方程组。 详细介绍参考:https://biyezuopin.blog.youkuaiyun.com/article/details/125473623

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1598

QT学习——day3

QT学习——day3 字符串的动态拼接: QSrting类的构造函数,arg()函数的重载,qDebug实现在终端输出。 QString str=QString("(%1)有(%2)个徒弟,分别是(%3),(%4)").arg("贺子奇").arg("2").arg("大明").arg("二明"); qDebug()<<"这就是我的徒弟:"<<str; 输出结果为:这就是我的徒弟:“(贺子奇)有(2)个徒弟,分别是(大明),(二明)” 字符串的长度 QString中长度是字符个

liuguangshibei的博客 756

opencode完整使用指南:从安装配置到Agent式编程实战

AI编程工具正从辅助补全向智能体协作演进。编程智能体不仅理解项目全局,还能自主执行原子级重构、测试验证等工程任务,显著提升研发效能。以opencode为代表的开源终端AI编程工具,凭本地优先和灵活模型接入成为技术团队新宠。本文围绕opencode的完整使用链路展开,从Node.js环境准备、npm全局安装,到解决Windows环境变量配置问题,再到接入OpenAI、Anthropic或多模型管理平台,梳理一套标准化接入方案。同时演示VSCode插件调用、LSP语义分析及Playwright驱动的浏览器自动化

weixin_28837817的博客 319

OpenGL + Qt 导入OBJ模型

1,打开QT,创建QMainWindow工程2,打开工程的.pro文件,添加以下代码3,打开工程界面,创建新的类并继承QOpenGLWidget和QOpenGLFunctions_3_3_Core提供了显示集成到Qt应用程序中的OpenGL图形的功能,提供三个虚函数:1)paintGL():渲染OpenGL场景。每当需要更新小部件时调用。2)resizeGL ():设置OpenGL视区、投影等。

chen_da_le的博客 5066

Linux CentOS 8系统离线升级内核版本

CentOS 8操作系统离线场景下升级内核版本

WQwinter的博客 3237

如何用Bertalign快速搞定多语言句对齐?5分钟上手教程(附避坑指南)

本文详细介绍了如何利用Bertalign工具快速实现多语言句对齐,从安装配置到实战应用的全流程指南。通过LaBSE句向量技术,Bertalign显著提升了对齐准确率,支持25种语言的任意组合,特别适合处理复杂句式。文章还提供了常见问题的解决方案和性能优化技巧,帮助用户高效完成多语言文本对齐任务。

weixin_42538752的博客 352

【QT教程】QT6 OpenGL编程 QT OpenGL编程

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D向量图形。它被广泛用于计算机图形和游戏开发中。OpenGL是一个独立于硬件的API,这意味着它提供了一套与具体硬件无关的绘制命令,使得开发者编写的程序可以在支持OpenGL的不同平台上运行。OpenGL的历史OpenGL最早是由SGI(Silicon Graphics Inc.)公司在1992年开发的。

QT性能优化QT原理源码QT界面美化 4063

数学之美 | 图论和网络爬虫

文章目录概述图论网络爬虫分析BFSDFSBFS + DFS参考资料 概述 这篇文章主要给大家介绍一下计算机算法中非常重要的一部分——图论,以及它在生活中的应用——网络爬虫。   图论 离散数学是当代数学的一个重要的分支,也是计算机科学的数学基础。它又包括四个分支,而图论便是其中一支,另外三个分别是:数理逻辑、集合论、近代数学。 图论中的图由一些节点和边构成,比如下面这张图 。 在图论中一个很基础...

小小酥梨的博客 3231

QT+ OpenGL 变换

本篇完整工程见gitee:https://gitee.com/turbolove/qtopengl.git 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主。

turbolove的博客 1381

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9654

微博scheme

微博scheme

qq_42278595的博客 320

QT OpenGL高级编程

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D向量图形。它被广泛用于计算机图形和游戏开发中。OpenGL是一个规范,由一个技术委员会管理,这个委员会包括硬件制造商、软件供应商和开发人员。OpenGL的历史OpenGL的历史可以追溯到1980年代,当时SGI(Silicon Graphics Inc.)开发了一个名为GL的API,用于他们的高端图形工作站。

QT性能优化QT原理源码QT界面美化 1359

MATLAB R2023a下载链接及软件安装教程

MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。a是上半年,b是下半年版本,但是有些小弱们总是觉得只要是b一定功能多,这不一定的,同年版本b比a可能稍微全点,不同年的,比如21b,22a,肯定22a要比21b版本高功能多了。10、选择目标文件夹,默认的是C盘,想修改的话可以单击【浏览】,然后单击【下一步】

qq_53545309的博客 5163

Qt OpenGL(01) 概述

OpengGL 参考教程 和 Qt OpengGL 框架

读书笔记 1662

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Learn OpenGL with Qt——完美的Qt摄像机

摄像机 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点)。OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。 本节我们将会讨论如何在Qt中配置一个摄像机,并且将会讨论FPS风格的摄像机,让你能够在3D场景中自由移动。我们也会讨论键盘和鼠标输入,最终完成一个带有摄像机的窗口。 摄像机/观察空间 当我们讨论摄像机/观察空间(Camera/View Space)的

ItaLink 8789

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

QT学习(17):QT中OpenGL的简单使用

0,1,3对应顶点数组中第一行、第二行、第四行,为一个三角形,1,2,3同理,两个三角形即一个矩形。顶点数组vertices:四个顶点数据,每一行对应一个顶点,有八个float数值,分别为坐标(3),颜色(3),纹理(2)。:加工顶点数据,把顶点坐标进行平移、旋转、缩放等各种变换操作,修改各种顶点数据,比如纹理坐标,法向量等。VBO,Vertex Buffer Objects顶点缓冲区,一个元素对应一个顶点数据。0、顶点数据:CPU将顶点数据传入GPU,包括顶点的坐标、颜色、法向量、纹理坐标等。

qq_45088122的博客 3134

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR
下一篇: QT中的OpenGL学习-----3D图形
PJ...
博客等级 码龄5年 412粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值