当前位置: 首页 > wzjs >正文

比较出名的网站域名wordpress怎么用地图

比较出名的网站域名,wordpress怎么用地图,腾讯微信朋友圈广告代理,如何做凡客网站从零开始:在Qt中使用OpenGL绘制指南 本文只介绍基本的 QOpenGLWidget 和 QOpenGLFunctions 的使用,想要学习 OpenGL 的朋友,建议访问经典 OpenGL 学习网站:LearnOpenGL CN 本篇文章,我们将以绘制一个经典的三角形为例&…

从零开始:在Qt中使用OpenGL绘制指南

本文只介绍基本的 QOpenGLWidget 和 QOpenGLFunctions 的使用,想要学习 OpenGL 的朋友,建议访问经典 OpenGL 学习网站:LearnOpenGL CN

本篇文章,我们将以绘制一个经典的三角形为例,讲一讲,怎么在 Qt 中使用 OpenGL 来进行 GPU 绘制。

前言

在高性能渲染场景中,CPU资源常被过度消耗,导致界面卡顿。而OpenGL作为业界标准的图形API,能通过GPU硬件加速显著降低CPU负载。本文将以绘制三角形为例,教你如何通过Qt的QOpenGLWidget和QOpenGLFunctions实现跨平台GPU渲染。

QOpenGLFunctions

OpenGL函数在不同平台(Windows/Linux/Mac)的实现存在差异。例如:

平台函数加载方式
WindowswglGetProcAddress
LinuxglXGetProcAddress

Qt通过QOpenGLFunctions封装了这些底层差异,开发者只需继承此类,即可用glClear() 等统一接口调用OpenGL函数,无需编写平台特定代码。通过这样,我们就可以用一套代码,在不同平台下使用 OpenGL 相。要使用这个类也很简单,让我们的类直接继承 QOpenGLFuntions 就好了。同时也可以配合 QOpenGLWidget 来使用,在 initializeGL 函数里,调用 initializeOpenGLFunctions 后,就可以直接使用 OpenGL 的函数

Windows 下加载(wglGetProcAddress

例如在 Windows 下,我们使用 wglGetProcAddress来动态加载这些函数(例如 glClear),下面是加载代码:

  • 包含必要的头文件

    #include <windows.h>
    #include <GL/gl.h>
    #include <GL/glext.h>  // 提供 OpenGL 扩展声明
    
  • 定义函数指针类型

    // 示例:定义 glClear 的函数指针类型
    typedef void (APIENTRY *PFNGLCLEARPROC)(GLbitfield);
    PFNGLCLEARPROC glClear;
    
  • 加载 OpenGL 函数

    // 初始化 OpenGL 函数
    void initOpenGLFunctions() {// 1. 加载 OpenGL 1.1 函数(由 opengl32.dll 提供)glClear = (PFNGLCLEARPROC)wglGetProcAddress("glClear");// 2. 检查是否加载成功if (!glClear) {// 如果失败,可能是驱动不支持该函数MessageBoxA(NULL, "Failed to load glClear", "Error", MB_OK);exit(1);}// 3. 类似方式加载其他函数...// glDrawArrays = (PFNGLDRAWARRAYSPROC)wglGetProcAddress("glDrawArrays");// ...
    }
    
  • 使用加载的函数

    glClear(GL_COLOR_BUFFER_BIT);  // 现在可以正常调用
    

Linux 下加载(glXGetProcAddress

而在 linux 下,加载的函数变成了:glXGetProcAddress ,对应的代码是:

  • 包含必要的头文件

    #include <GL/gl.h>
    #include <GL/glx.h>  // X11 的 OpenGL 扩展
    #include <GL/glext.h>
    
  • 定义函数指针类型

    // 示例:定义 glClear 的函数指针类型
    typedef void (*PFNGLCLEARPROC)(GLbitfield);
    PFNGLCLEARPROC glClear;
    
  • 加载 OpenGL 函数

    void initOpenGLFunctions() {// 1. 加载 glClearglClear = (PFNGLCLEARPROC)glXGetProcAddress((const GLubyte*)"glClear");// 2. 检查是否加载成功if (!glClear) {fprintf(stderr, "Failed to load glClear\n");exit(1);}// 3. 类似方式加载其他函数...// glDrawArrays = (PFNGLDRAWARRAYSPROC)glXGetProcAddress((const GLubyte*)"glDrawArrays");// ...
    }
    
  • 使用加载的函数

    glClear(GL_COLOR_BUFFER_BIT);  // 现在可以正常调用
    

QOpenGLWidget

QOpenGLWidget 是 Qt 提供的一个 widget 类,用于在 Qt 应用程序中嵌入 OpenGL 渲染内容。它继承自 QWidget,内部管理了一个 OpenGL 上下文(例如 windows 下调用 wglMakeCurrent / wglDoneCurrent)和帧缓冲区,并提供了与 Qt 窗口系统无缝集成的能力。详细内容可看:QOpenGLWidget Class

我们可以创建自己的窗口,并继承 QOpenGLWidget,然后重写下面三个函数,来处理一些 OpenGL 相关的工作。

initializeGL

初始化一些 OpenGL 相关的资源或者状态。这个函数在在第一次调用 resizeGL或者 paintGL之前被调用。

paintGL

渲染 OpenGL 的场景,类似于我们平常使用的 QWidget::paintEvent,在窗口需要更新时调用。

resizeGL

调整 OpenGL Viewport 的大小或者投影等,在窗口需要调整大小时调用。

完整代码

#pragma once#include <QOpenGLBuffer>
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLFunctions>#include "FrameObserver.h"class COpenGLRenderWidget : public QOpenGLWidget, protected QOpenGLFunctions
{Q_OBJECTpublic:explicit COpenGLRenderWidget(QWidget *parent = nullptr);~COpenGLRenderWidget() override;private:void InitShaders();private:void initializeGL() override;void paintGL() override;void resizeGL(int w, int h) override;private:QOpenGLShaderProgram m_shaderProgram;QOpenGLBuffer m_vbo;
};
#include "OpenGLRenderWidget.h"static const GLfloat coordinateBasic[] = {// 顶点坐标,存储3个xyz坐标// x     y     z-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f,
};constexpr auto VERTEX_SHADER_BASIC = R"(
attribute vec3 vertexIn; 
varying vec2 textureOut; void main(void)
{gl_Position = vec4(vertexIn, 1.0);
}
)";constexpr auto FRAGMENT_SHADER_BASIC = R"(
varying vec2 textureOut;void main(void) 
{ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
}
)";COpenGLRenderWidget::COpenGLRenderWidget(QWidget *parent): QOpenGLWidget(parent)
{}COpenGLRenderWidget::~COpenGLRenderWidget()
{}void COpenGLRenderWidget::initializeGL()
{initializeOpenGLFunctions();glDisable(GL_DEPTH_TEST);m_vbo.create();m_vbo.bind();m_vbo.allocate(coordinateBasic, sizeof(coordinateBasic));InitShaders();glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
}void COpenGLRenderWidget::paintGL()
{m_shaderProgram.bind();glDrawArrays(GL_TRIANGLES, 0, 3);m_shaderProgram.release();
}void COpenGLRenderWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h);update();
}void COpenGLRenderWidget::InitShaders()
{QOpenGLShader vertexShader(QOpenGLShader::Vertex);if (!vertexShader.compileSourceCode(VERTEX_SHADER_BASIC)){qDebug() << "Vertex shader compilation failed. Error: " << vertexShader.log();return;}QOpenGLShader fragmentShader(QOpenGLShader::Fragment);if (!fragmentShader.compileSourceCode(FRAGMENT_SHADER_BASIC)){qDebug() << "Fragment shader compilation failed. Error: " << fragmentShader.log();return;}m_shaderProgram.addShader(&vertexShader);m_shaderProgram.addShader(&fragmentShader);m_shaderProgram.link();m_shaderProgram.bind();m_shaderProgram.setAttributeBuffer("vertexIn", GL_FLOAT, 0, 3, 3 * sizeof(float));m_shaderProgram.enableAttributeArray("vertexIn");
}

文章转载自:

http://Ihtlvee4.shxmr.cn
http://yV4Z83o6.shxmr.cn
http://o864anCp.shxmr.cn
http://KK3eWyKP.shxmr.cn
http://Kv4a6RWK.shxmr.cn
http://mwsnVeS0.shxmr.cn
http://MhlZGkT2.shxmr.cn
http://Bhgq1cZp.shxmr.cn
http://CTdDRV4B.shxmr.cn
http://DClgXf2u.shxmr.cn
http://mxFaAlsp.shxmr.cn
http://8SLMHkAh.shxmr.cn
http://MtAfEoSc.shxmr.cn
http://inDp3b8B.shxmr.cn
http://ayz3w1NT.shxmr.cn
http://llxwyYfv.shxmr.cn
http://pIccBOiq.shxmr.cn
http://SZqEid5C.shxmr.cn
http://53fipwiX.shxmr.cn
http://pDNQUtZL.shxmr.cn
http://FqOpRvAf.shxmr.cn
http://1JHFdYnM.shxmr.cn
http://io9CHgq3.shxmr.cn
http://HMG7nbOr.shxmr.cn
http://Cu3c1Q0V.shxmr.cn
http://O7HafTnH.shxmr.cn
http://zK97Dmf1.shxmr.cn
http://gptdnbts.shxmr.cn
http://wu6xmhdm.shxmr.cn
http://ijjo98pX.shxmr.cn
http://www.dtcms.com/wzjs/762789.html

相关文章:

  • 苏州网站建设的公司国外网站开发公司
  • 集美那里有教网站建设上海网站备案要求吗
  • 做网站怎么加弹幕网站建设都包括什么
  • 做网站设计师的感想网站空间大小怎么看
  • 胶州网站建设规划徐州房产网
  • 做网站CentOS还是win好苏州产品设计公司
  • 济南品质网站建设哪家好网站移动端是什么情况
  • 一个外国人建设的中国文字网站团队建设网站
  • 做网站开发要学什么语言免费手机建站平台
  • 视频网站建设报价单汕头企业网站推广技巧
  • 户外旅游网站模板网站发布工具
  • 外贸型网站开发湖北分行建设银行网站
  • phpcms v9网站性能优化网站做下要多少
  • 阿里巴巴如何建设网站首页外文网站开发
  • html网站的规划与建设6排名优化上首页怎么做
  • 如何电话推销客户做网站家用电脑做网站
  • 商城网站建设如何交谈oa系统办公软件怎么用
  • 网站开发毕设文档邯郸有设计网站的吗
  • 贵州网站建设kuhugzcms建站系统介绍
  • 建设银行官方网站手机版wordpress theme forest
  • 渭南网站建设价格古董手表网站
  • 浙江省建设诚信系统网站石家庄有哪些公司可以做网站
  • 类似游侠客网站建设吉林智能建站系统价格
  • 中国有色金属建设股份有限公司网站wordpress the loop
  • 设计网站用什么语言设计类作品集怎么制作
  • 网络推广网站首页大图企业推广方法
  • 旅行社做网站淮北网站制作
  • 可以做国外购物的网站有哪些做网站所用的技术
  • python做网站还是数据库方象科技专注于什么领域
  • 网站设计怎么做明信片网站seo具体怎么做?