首页 > 其他分享 >QT+OpenGL使用一组顶点绘制两个三角形

QT+OpenGL使用一组顶点绘制两个三角形

时间:2024-08-22 15:37:44浏览次数:4  
标签:QT OpenGL 0.0 0.5 programId 顶点 GL VAO

一、概述

  需求:使用一组顶点坐标绘制两个三角形。

  ps:此需求和绘制一个三角形并没有什么不同,只是把顶点坐标由三个改成了6个。依次类推,如果想要绘制多边形或者更多的三角形,只需要定义不同的顶点就行了。

  效果:

二、代码示例

  1.定义顶点

float vertices[18] = {
    // first triangle
    -0.9f, -0.5f, 0.0f,  // left 
    -0.0f, -0.5f, 0.0f,  // right
    -0.45f, 0.5f, 0.0f,  // top 
    // second triangle
     0.0f, -0.5f, 0.0f,  // left
     0.9f, -0.5f, 0.0f,  // right
     0.45f, 0.5f, 0.0f   // top 
};

  2.定义shader 字符串

const char* vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\0";
const char* fragmentShaderSource = "#version 330 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n\0";

  3.创建、编译、链接shader

void GLTwoTriangleWindow::createAndLinkProgram(GLenum vertexShaderType, QString vertexResPath,
    GLenum fragmentShaderType, QString fragmentResPath) {
    //编译顶点着色器和片元着色器
    GLuint vertexShader = getShaderId(GL_VERTEX_SHADER, vertexResPath);
    GLuint fragmentShader = getShaderId(GL_FRAGMENT_SHADER, fragmentResPath);
    programId = glCreateProgram();
    glAttachShader(programId, vertexShader);
    glAttachShader(programId, fragmentShader);
    glLinkProgram(programId);
    int success;
    char infoLog[512];
    glGetProgramiv(programId, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(programId, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}
GLuint GLTwoTriangleWindow::getShaderId(GLenum shaderType, QString resPath) {
    //创建顶点着色器
    unsigned int shaderId = glCreateShader(shaderType);
    QFile vertexShaderFile(resPath);
    if (!vertexShaderFile.open(QIODevice::ReadOnly)) {
        qDebug() << "Cannot open vertex shader file for reading";
    }
    QString verQStr = vertexShaderFile.readAll();
    std::string verStdStr = verQStr.toStdString();
    const char* vertexStr = verStdStr.c_str();
    qDebug() << "vertexStr-------------" << vertexStr;
    vertexShaderFile.close();
    glShaderSource(shaderId, 1, &vertexStr, NULL);
    glCompileShader(shaderId);
    int success;
    char infoLog[512];
    glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(shaderId, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
    }
    return shaderId;
}

  4.创建VAO、VBO,并让VBO绑定VAO。然后将顶点数据一次性copy到gpu

//创建顶点数组对象VAO用来管理VBO
glGenVertexArrays(1, &VAO);
//创建顶点缓冲对象
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//将顶点数据放入VBO中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

  5.告知显卡如何解析顶点数据

//告知显卡应该如何解析顶点
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

  6.开始绘制两个三角形

glUseProgram(programId);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0,6);//因为是两个三角形,所以这里是6个顶点。如果不想计算具体的值,拿着顶点数组除以3也可以

 

标签:QT,OpenGL,0.0,0.5,programId,顶点,GL,VAO
From: https://www.cnblogs.com/tony-yang-flutter/p/18373995

相关文章

  • QT自定义结构体的传递
    方法1:使用Q_DECLARE_METATYPE(TestResult)进行声明1.1声明#ifndefTESTRESULT_H#defineTESTRESULT_H#include<QDateTime>#include<QString>#include<QMetaType>//用于测试时更新内容,作为结果导出的依据classTestResult{public:int_nid=0;int_coun......
  • 【python】PyQt5中的QFrame控件,控制图形的边框样式、阴影效果、形状等属性
    ✨✨欢迎大家来到景天科技苑✨✨......
  • qt静态编译 全自动编译qt静态库 qt5 windows安装qt (2024.2.23)
    全自动编译qt5静态库(2024.2.23)本教程是从无到有配置qt.io和vcpkg实现全自动编译qt5的静态库,使得您可以静态编译qt项目0.安装VisualStudio2022这个我就不多解释了,直接去官网下载社区版本,勾选使用C++的桌面开发安装好就行1.安装qt.io的开发环境1.1下载在线安装包并且配......
  • 【嵌入式裸机开发】智能家居入门7:最新ONENET,MQTT协议接入,最全最新(微信小程序、MQTT协
    智能家居入门7前言一、ONENET云平台创建产品与设备二、STM32端连接服务器前的准备三、STM32端实现四、微信小程序端连接服务器前的准备五、微信小程序端实现六、最终测试前言本篇文章介绍最新ONENET云平台的MQTT协议接入方法,在STM32上实现数据上云与服务器下发数据......
  • VS2022+QT6.7.2 定时器的使用(两种方法)
    目录一、继承QObject定时器事件二、QTimer类三、具体实现一、继承QObject定时器事件  所有继承自QObject的类,都会有一个timerEvent(QTimerEvent*event)的纯虚函数,startTimer()设定定时间隔并启动,再重载这个函数以处理自己的定时任务,多个定时任务用timeId区分,结束后......
  • 解决lazarus 3.xx后在linux编译为Qt出错方法
    今天用lazarus3.4在银河麒麟将应用编译为Qt5出现以下错误信息:Warning:linker:/usr/bin/ld.bfd:/home/lb/fpcupdeluxe34/lazarus/lcl/units/aarch64-linux/qt5/qtint.o:infunction`QTINT$_$TQTWIDGETSET_$__$$_CREATE$$TQTWIDGETSET':Error:qtint.pp:(.text.n_qtint$_$t......
  • PyQt5实现置顶、位置固定、透明度设置
    在PyQt5中,要实现一个始终置顶、位置固定、透明度设置、去除关闭按钮且无法通过常规方式关闭的对话框窗口,需要对QDialog进行一系列的自定义设置。以下是一个详细的示例代码,展示了如何实现这些功能:importsysfromPyQt5.QtWidgetsimportQApplication,QDialog,QVBoxLayou......
  • Qt Quick 消息列表视图组件
    目录开发环境简介预览图代码main.qmlMessageQueueView.qml开发环境Qt版本:6.5.3构建:cmake+minGW64-bit简介这是一个纯QML程序,功能是一个消息列表的功能,可以进行插入,删除,清空等操作预览图![2024-08-2114-28-39_converted](images/2024-08-2114-28-39_converted.gif)......
  • QT+OpenGL 使用VAO、VBO、EBO结合绘制一个正方形
    一、概述需求:绘制一个正方形,可以控制正方形的颜色、可以切换正方形为线框模式/填充模式绘制流程:1.定义一个顶点着色器和片元着色器shader2.Qt创建一个Widget并继承QOpenGLWidget、QOpenGLFunctions,并重写initializeGL()、resizeGL(w,h)、pai......
  • OpenGL中的VAO、VBO、EBO
    一、概述目的:简单介绍一下VAO、VBO、EBO,使用他们能提高opengl的渲染效率VAO:顶点数组对象(VertexArrayObject)VAO就相当于一个管理者的角色,在GPU中创建一个VAO对象用于管理VBO、EBO。VBO和EBO创建绑定好后会自动挂到VAO下。VBO:顶点缓冲对象(VertexBuffe......