
opengl
文章平均质量分 50
金色熊族
这个作者很懒,什么都没留下…
展开
-
GLSL声明数组
尽管GLSL的语法与C语言很相似,但是二者还是有一些区别的。原创 2023-09-24 17:19:21 · 787 阅读 · 1 评论 -
如何让一个uniform variable在多级shader中都起作用(类似C语言的全局变量)?
GLSL编程中通常设计多个shader,如vertex shader, fragment shader等等。在最近的某个项目中,我需要定义一个变量,该变量类似C语言中的全局变量,要同时在两个shader中都起作用。指出,只要在两个shader中同时声明这个变量即可(当然,这个变量在两个shader中必须采用同一个名字)原创 2023-09-24 17:14:48 · 133 阅读 · 0 评论 -
检查OpenGL的版本
本文介绍如何在Qt框架下获取OpenGL的版本原创 2022-09-18 12:05:39 · 3243 阅读 · 0 评论 -
利用assimp显示gltf
目录1 编译assimp5.0.12 工程2.1 pro文件:2.2config.h2.3config.h.in中注释掉如下代码:3 运行效果1 编译assimp5.0.1编译过程与我的博客win10操作系统上编译assimp库_liji_digital的博客-CSDN博客描述类似。但是由于assimp5.0.1的版本较高,vs2013编译源码会报错。错误原因是BaseImporter::importerUnits采用了初始化列表赋值,不受2013支持。假如你坚持使用..原创 2022-04-25 22:50:15 · 1660 阅读 · 0 评论 -
win10操作系统上编译assimp库
opengl尽管功能强大,但是不具备读取模型文件的能力(obj,dae, gltf,fbx等)。它只认数组,不认文本。而复杂的几何形状又往往保存在模型文件里,所以需要一个第三方的软件将opengl不识别的模型文件转化成数组,才能充分发挥opengl的强大功能。assimp库就是这样一个软件。assimp是开源软件,并且跨平台。但是编译它需要cmake。这里介绍如何用cmake在win10操作系统上把assimp源代码转化为一个visual studio的解决方案,然后编译产生一个dll和lib。我的原创 2022-04-23 23:05:45 · 2291 阅读 · 2 评论 -
利用GLSL绘制曲线
以前的项目里,我曾经用qwt绘制曲线.qwt是一种基于qt的第三方插件。用qwt绘制的好处是,在待绘制的样本数较多时(〉=1000),仍然可以在很短的时间内完成绘制。本篇博客介绍一种办法,不再利用qwt,而是直接利用GLSL来实现高速绘制曲线。这个功能封装在类GLCurve中。头文件:#pragma once#include <QOpenGLWidget>#includ...原创 2018-10-15 22:05:17 · 1772 阅读 · 1 评论 -
解决QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x
重新安装了win7操作系统之后,本来正常的opengl功能失灵了.在qt中运行qopenglwidget,程序报错:QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001已开始以为是qt5.5.0的版本有bug导致。安装了qt5.8之后,问题还在。怀疑不是qt的版本问题,而是显卡驱动没...原创 2018-10-13 07:52:34 · 6002 阅读 · 3 评论 -
OpenGL学习脚印: 坐标变换过程(vertex transformation)
来源:https://blog.csdn.net/wangdingqiaoit/article/details/51594408转载 2018-03-30 18:34:39 · 285 阅读 · 0 评论 -
对比 Android-GLSurfaceView 与 Qt-QOpenGLWidget的异同
以github上https://github.com/rahulrj/Apple-Music-Animation 作为android-GLSurfaceView的例子,以我自己写的博客《不使用gluSphere显示地球仪》作为Qt-QOpenGLWidget的例子,将两者比较。区别:qt的例子是双重继承:既要继承openglwidget,也要继承QOpenGLFunctions.而且绘制与显示放在...原创 2018-03-27 20:09:54 · 504 阅读 · 0 评论 -
QWindow + GLSL 绘制地球仪(脱离QOpenGLWidget)
QT 自带的 “OpenGL Window Example”介绍了利用QWindow为窗体,调用GLSL完成绘制的实例。在这篇示例的基础上,我增加一个知识点:将QWindow嵌套进QWidget中显示。介绍下代码的逻辑结构:1)Qt提供了一个专门的函数createWindiowContainer来容纳Qwindow.这个函数返回值是一个指针,指向一个新建的QWidget。随后,程序调用函数setC...原创 2018-03-11 18:19:46 · 2950 阅读 · 2 评论 -
GLSL绘制旋转的地球
直接上代码:h文件:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QOpenGLWidget>#include <QOpenGLFunctions>#include <QOpenGLTexture>#include <QOpenGLShader>#include <QOpenG...原创 2018-03-05 20:12:36 · 1154 阅读 · 0 评论 -
GLSL显示地球仪
在博客不使用gluSphere显示地球仪中,我介绍了一种opengl显示地球的办法。那种办法的短处是,大量的计算由CPU完成。假如我们在做一个功能很强、CPU负担较重的界面,较为明智的办法是尽量让GPU分担CPU的工作。本篇博客演示的就是通过GLSL,让GPU分担CPU的一部分工作。先分析《不使用gluSphere显示地球仪》一文中哪些地方可以交给GPU处理:CPU要计算每个Vertex在世界坐标...原创 2018-02-28 20:30:57 · 816 阅读 · 0 评论 -
GLSL矩阵变换详解(三、view matrix和projection matrix)
我们在前一篇博客GLSL矩阵变换详解(二、旋转变换、平移变换以及QMatrix4x4)的基础上再增加对摄像机位置、姿态的设置功能,以及成像区域的定义功能。QMatrix4x4::lookAt(camera, center, upDirection)定义了摄像机的位置与姿态,属于view matrix操作的范畴。三个输入变量都是QVector3D类型。camera是摄像机在世界坐标系的坐标。cent...原创 2018-02-25 20:05:34 · 9181 阅读 · 0 评论 -
GLSL矩阵变换详解(二、旋转变换、平移变换以及QMatrix4x4)
本篇博客展示4个例子,都是关于旋转变换、平移变换和QMatrix的操作。在QT的帮助中,提到QMatrix是行主序。而opengl的矩阵是列主序的。乍一看,将QMatrix传入shader之前,qmatrix需要做转置处理。但是在实际的尝试中,我发现矩阵不应转置。我们从前面的博客 Qt结合GLSL贴出纹理(二、采用QOpenGLShaderProgram和QOpenGLTexture)出发,在那篇...原创 2018-02-25 18:49:45 · 10330 阅读 · 0 评论 -
GLSL矩阵变换详解(一、总述)
按照《OpenGL SuperBible》第四版的描述,OpenGL涉及的变换共4种(ModelView 其实是View和Model的总和,不算单独的变换):View, Model, Projection, ViewPort。这里面,Viewport的变换通过glViewport函数完成即可,不涉及GLSL。下面概述View Matrix, Model Matrix, Projection Mat...原创 2018-02-25 14:23:28 · 3248 阅读 · 0 评论 -
Qt结合GLSL贴出纹理(二、采用QOpenGLShaderProgram和QOpenGLTexture)
鉴于前一篇博客的问题,我又尝试用QOpenGLShaderProgram和QOpenGLTexture来贴纹理。pro文件:#-------------------------------------------------## Project created by QtCreator 2018-02-21T16:49:46##-------------------------------...原创 2018-02-21 19:37:46 · 7123 阅读 · 7 评论 -
Qt结合GLSL贴出纹理(一、采用原生OpenGL API)
Qt提供QOpenGLShaderProgram这种类来完成GLSL操作,同时也支持原生的OpenglAPI。在接下来的两篇博客里,我将分别介绍如何用QOpenGLShaderProgram来贴出纹理,以及如何用原生的OpenglAPI贴出纹理。这篇博客介绍的是如何利用原生的OpenglAPI贴纹理:不论是顶点数据的传值,还是纹理的传值,都在GLSL里留下显式的接口变量。pro文件:#------...原创 2018-02-21 19:25:37 · 1368 阅读 · 0 评论 -
不使用gluSphere显示地球仪
思路:用一个个的四边形来近似球面,每一个四边形仅占一小块立体角。将平铺的世界地图与地球仪做如下对应--图片的左上角对应球体的theta = 0, phi = 0位置。向下则theta增加,直到180度;向右则phi增加,直到360度。theta和phi都按照10度步进。步进一次得到一个立体角,立体角的四个顶点分别位于(theta, phi), (theta + 10, phi) (theta, p原创 2018-01-29 23:17:05 · 947 阅读 · 0 评论 -
又一种Qt + OpenGL 的离屏渲染方法
前面的博客《Qt + OpenGL + 离屏渲染》介绍了一种离屏渲染的办法:先在framebuffer里面绘制,然后把绘制的结果转化为QImage。但是这样做涉及到从显存(framebuffer)到内存QImage的传递,降低效率。本博客介绍一种新办法,从显存到显存,不必经由内存。本文受了http://www.cppblog.com/init/archive/2012/02/16/1657原创 2017-12-20 23:33:34 · 6782 阅读 · 1 评论 -
qt + opengl 绘制地球
方法:先载入纹理图(pLoadTex函数);再画建立一个二次曲面物体(gluNewQuadric函数),并利用函数gluQuadricTexture声明这个二次曲面可以贴纹理;在paintGL函数里,只要调用glBindTexture和gluSphere函数,即可绘制地球。代码:pro文件:#-----------------------------------------原创 2017-11-22 07:06:12 · 4459 阅读 · 0 评论 -
建立Win32工程,向三维物体贴纹理
本文来源http://blog.csdn.net/tiankefeng19850520/article/details/18655907亲测无问题。首先打开vs2012,选择建立win32控制台工程。然后输入以下代码:#include #include #include #include #include #include int part1; int p转载 2017-11-21 23:05:31 · 407 阅读 · 0 评论 -
利用VBO绘制
在前面的博客《 QOpenGLWidget + QPainter混合编程》中,我利用glColorPointer 和 glVertexPointer来绘制图形。这就要求每次调用paintGL()函数时,都要从内存里取出数据再绘制。本篇博客介绍一种新的方法,利用VBO,只需从内存里读取一次即可,以后绘制都从显存里读取。pro:#------------------------原创 2017-11-16 22:34:23 · 913 阅读 · 0 评论 -
QOpenGLWidget + QPainter混合编程
本示例将一个二维数组可视化,且每一个数据点的颜色由它的Z值决定。根据http://blog.csdn.net/dp_huang/article/details/53816805 在调用opengl函数时,要使用glEnable(GL_DEPTH_TEST);而使用QPainter之前,要使用glDisable(GL_DEPTH_TEST);本示例用到了gluLookAt,所以在pro文件里要注...原创 2017-11-07 22:50:44 · 6196 阅读 · 1 评论 -
gluLookAt() 和 glOrtho() 的个人理解
转自http://blog.csdn.net/songjiaweizangai/article/details/40479293gluLookAt函数原型为:void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,G转载 2017-11-06 20:42:02 · 1497 阅读 · 0 评论 -
Qt + OpenGL + 离屏渲染
本文来自https://stackoverflow.com/questions/31323749/easiest-way-for-offscreen-rendering-with-qopenglwidget,经亲测(有小量修改),确实能运行。现在把自己示例代码贴出来。简单介绍下代码结构:核心的类是 OpenGlOffscreenSurface假如你想要做离屏渲染, 只要在这个类的虚函原创 2017-10-26 21:45:04 · 10934 阅读 · 0 评论 -
在Qt中使用两个texture
在上一篇博客利用QOpenGLWidget glDrawArrays()实现纹理贴图>>中,我介绍了如何利用QOpenGLWidget + glDrawArrays()绘制纹理。本篇博文在上一篇的基础上,介绍如何使用两个纹理。头文件:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include class GLWidget原创 2017-06-25 16:24:25 · 1215 阅读 · 0 评论 -
利用QOpenGLWidget glDrawArrays()实现纹理贴图
Qt提供了两种可以使用opengl渲染的qwidget派生类,一是QGLWidget,二是QOpenGLWidget。但是前者逐渐不被采用。此外,opengl也逐渐放弃旧的 glBegin() - glEnd()模式,而是采用glDrawArrays()。本篇博文演示利用QOpenGLWidget和glDrawArrays结合,实现纹理贴图。头文件:#ifndef MAINWINDOW_H原创 2017-06-24 22:57:02 · 7721 阅读 · 1 评论 -
对OpenGL列主序的说明
>指出,opengl的矩阵都是列主序。列主序的矩阵排布如下图:但我们知道,C语言是行主序的。且OpenGL也是用C语言写成的。那么怎么理解OpenGL的列主序?先看我自己写的一个测试代码,其中定义了openGL的M3DMatrix44f类型变量。可见,其中被定义的元素(4个字节构成一个元素)分别位于内存的第2、12、13、14处。似乎符合C++的行主序规则。再看下从原创 2017-04-16 16:09:24 · 1422 阅读 · 0 评论 -
Qt5.5无法正常运行QGLWidget的解决办法
以前一直用Qt5.4,在5.4上写了一个简单的opengl程序,一直正常运行。昨天发现,同样的程序,在Qt5.5上面编译不能通过了。总是说glBegin 和glEnd的库找不到(unresolved external symbol __imp__glBegin)。摸索了几个小时,在网上看到这个帖子:http://stackoverflow.com/questions/31633401/原创 2016-10-02 15:06:58 · 6119 阅读 · 0 评论 -
VS2012下利用Opengl在Cview中绘制
《VS 2012环境下使用MFC进行OpenGL编程》给出了很好的范例,并且免费提供代码。这里只做一点补充说明:文中提到的glaux.h和glaux,lib需要额外下载。事实上,这个库不是必须的,只要把"stdafx.h"中的 #include 换成 #include 和#include ,并且把附加依赖项中的glaux.lib去掉即可:原创 2016-09-09 22:16:18 · 804 阅读 · 0 评论 -
OpenGL实现二维图的平移
在前面的博客《OpenGL实现二维图的缩放》中,我提到了gluLookAt的作用是定义观察者的位置和视线方向。在本文中,我们正好利用这个功能来实现二维图的平移。#ifndef WIDGET_H#define WIDGET_H#include #include #include class Widget : public QGLWidget{ Q_OBJECTpub原创 2016-09-08 21:48:55 · 2629 阅读 · 0 评论 -
OpenGL实现二维图的缩放
严格说来,OpenGL只在3维空间绘制,glVertex2f之类的函数,是默认z = 0的。那么如何实现二维图的缩放呢?先来介绍3个知识点。1)OpenGL的坐标系:X轴从左向右是正方向,Y轴从下到上是正方向,Z轴从屏幕指向操作者是正方向。绘制物体时,物体的坐标就是在这个坐标系里定义的。2)gluPerspective(GLdouble fovy,GLdouble aspect,GLdou原创 2016-09-06 22:56:12 · 13638 阅读 · 6 评论 -
简单说说glutGet(GLUT_WINDOW_X/Y)与glViewport
glViewport(l,b,w,h);的作用是在窗口内划出一个宽为w,高为h的矩形区域。随后的绘制都发生在这个长方形里面。而l和b分别指的是这个长方形的左下角到窗口左边和下边的距离,单位是像素。glutGet则不同。glutGet(GLUT_WINDOW_X/Y)获取的是窗口的左上角相对于屏幕的左边/上边的距离,单位是像素。看下面的程序:它绘制了两个立方体,一红一蓝。立方体的前后左右的投原创 2016-02-09 13:24:36 · 1280 阅读 · 0 评论