OpenGL
OpenGL学习历程
AplusX
专注于混合现实(MR)/计算机图形学(CG)/计算机视觉(CV)相关研究
展开
-
利用OpenGL渲染并用OpenCV输出显示二维图像
OpenGL所有渲染的结果都输出显示在窗口中,设置OpenCV的图像cv::Mat outimg,并使用OpenGL的glReadPixels从帧缓冲区中加载像素至内存://use fast 4-byte alignment (default anyway) if possibleglPixelStorei(GL_PACK_ALIGNMENT, (outimg.step & 3) ? 1 : 4);//set length of one complete row in destination原创 2021-03-05 09:10:26 · 1374 阅读 · 3 评论 -
OpenGL如何处理多个纹理
在主程序中我们先设置3个采样器名称 pbrShader.use(); pbrShader.setInt("irradianceMap", 0); pbrShader.setInt("prefilterMap", 1); pbrShader.setInt("brdfLUT", 2); 其中setint是封装函数: void setInt(const std::string &name, int value) const { g原创 2020-06-20 10:41:14 · 1337 阅读 · 0 评论 -
理解OpenGL中帧缓存FrameBuffer & 渲染缓存RenderingBuffer
操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。帧缓存帮助我们离屏渲染,提高渲染速度unsigned int captureFBO;glGenFramebuffers(1, &captureFBO);glBindFramebuffer(GL_FRAMEBUFFER, captureFBO);unsigned int captureRBO;glGenRenderbuffers(1, &captureRBO);原创 2020-06-17 16:55:36 · 2215 阅读 · 0 评论 -
OpenGL中的VAO和VBO使用技巧
VBO:Vertex Buffer Object,顶点缓冲对象。可以存储大量顶点,因而我们可以利用VBO一次性发送一大批数据到显卡上。VAO:Vertex Array Object,顶点数组对象。一个VAO,配置并告诉了我们该如何使用VBO(包括如何解读VBO中的数据),以及使用哪个VBO。一般顺序:声明VBO、VAOunsigned int cubeVAO = 0;unsigned int cubeVBO = 0;先生成VAO再生成VBOglGenVertexArrays原创 2020-06-16 08:48:01 · 538 阅读 · 0 评论 -
解决Qt+OpenGL更换图像纹理的问题
2020.2.5 疫情持续蔓延,在家无聊便解决标题所述问题。若纹理加载是initializeGL()中,而在QtOpenGL的initializeGL()在程序运行时只运行一次,如果我的图像是通过上一步得到而不保存在本地,那么更换纹理变成了一个棘手的问题。我曾尝试用extern、static等方法在类与类之间传递数据,但是依然无法让OpenGL get到我更换的图像(2333)最后的解...原创 2020-02-05 16:52:36 · 1065 阅读 · 7 评论 -
opengl库区分:glut、freeglut、glfw、glew、gl3w、glad
opengl原生库gl*随opengl一起发布opengl实用库glu*随opengl一起发布opengl实用工具库glutglut*需要下载配置安装(太老了!)opengl实用工具库开源版本freeglutglut*需要下载配置安装(完全兼容glut,算是glut的代替品,但是bug较多!)opengl GLFW库glfw*需要下载配置安装(轻量级的,开源的,...转载 2019-12-25 17:06:14 · 747 阅读 · 0 评论 -
Qt中openGL的四个重要事件(initializeGL() resizeGL() paintGL() pdateGL())调用规则
initializeGL函数由于是初始化,所以只调用一次而resizeGL和paintGL会多次调用resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发paint事件,从而调用paintGL事件处理器。当然,还有窗口在隐藏和...原创 2019-12-25 10:39:48 · 9599 阅读 · 2 评论 -
Learn OpenGL (九):基础光照
环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。 漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光...翻译 2018-11-17 17:11:09 · 562 阅读 · 0 评论 -
Learn OpenGL (十):材质
在上一节中,我们指定了一个物体和光的颜色,以及结合环境光和镜面强度分量,来定义物体的视觉输出。当描述一个物体的时候,我们可以用这三个分量来定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,我们就能够对物体的颜色输出有着精细的控制了...翻译 2018-11-17 20:19:12 · 190 阅读 · 0 评论 -
Learn OpenGL (十一):光照贴图
在着色器中使用漫反射贴图的方法和纹理教程中是完全一样的。但这次我们会将纹理储存为Material结构体中的一个sampler2D。我们将之前定义的vec3漫反射颜色向量替换为漫反射贴图。注意sampler2D是所谓的不透明类型(Opaque Type),也就是说我们不能将它实例化,只能通过uniform来定义它。如果我们使用除uniform以外的方法(比如函数的参数)实例化这个结构体,GLSL...翻译 2018-11-18 11:58:31 · 690 阅读 · 0 评论 -
Learn OpenGL (十二):投光物
平行光当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和/或者观察者的位置,看起来好像所有的光都来自于同一个方向。当我们使用一个假设光源处于无限远处的模型时,它就被称为定向光,因为它的所有光线都有着相同的方向,它与光源的位置是没有关系的。定向光非常好的一个例子就是太阳。太阳距离我们并不是无限远,但它已经远到在光照计算中可以把它视为无限远了。所以来自太阳的所有光线将...转载 2018-11-18 14:17:42 · 350 阅读 · 2 评论 -
GLFW--Getting started
这篇文章是GLFW使用的简介。算是翻译吧:原文在hereStep by step包含头文件在使用OpenGL或GLFW工程源文件里需要包含GLFW3头文件。#include <GLFW/glfw3.h>这个头文件中定义了GLFW API所有的常量,类型和函数原型,同时也包含了OpenGL头文件并定义了在本系统平台上需要用到的所有常量和类型。例如:在windo...转载 2018-12-27 10:55:14 · 699 阅读 · 0 评论 -
OpenGL Transformation
http://www.songho.ca/opengl/gl_transform.htmlhttps://blog.csdn.net/wangdingqiaoit/article/details/51531002转载 2019-01-18 14:38:49 · 130 阅读 · 0 评论 -
OpenGl的glMatrixMode()函数理解
https://blog.csdn.net/jiangdf/article/details/8460012glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视...转载 2019-05-21 20:20:42 · 435 阅读 · 0 评论 -
用OpenGL加载图像并在图像上画网格
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);Grid(X_POINT_COUNT, Y_POINT_COUNT, X_SPACING, Y_SPACING); texturemapping();(在这里glMatrixMode(GL_MODELVIEW);glTranslatef(0, 0, -3);将图像向内移动) renderG...原创 2019-05-21 20:43:55 · 1889 阅读 · 0 评论 -
Learn OpenGL (八):颜色
当我们在OpenGL中创建一个光源时,我们希望给光源一个颜色。在上一段中我们有一个白色的太阳,所以我们也将光源设置为白色。当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是我们所感知到的颜色)。创建一个光照场景在接下来的教程中,我们将会广泛地使用颜色来模拟现实世界中的光照效果,创造出一些有趣的视觉效果。由于我们现在将会使用光源了,我们希望将它们显示为可见的物体,...翻译 2018-11-17 14:55:52 · 320 阅读 · 0 评论 -
OpenGL函数功能glutTimerFunc()
(1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是glutTimerFunc(unsigned int millis, void (*func)(int value), int value); 参数对应关系为:glutTimerFunc(毫秒数, 回调函数指针, 区别值);(2)写自己的回调函数 void OnTimer(int value); ...转载 2018-08-09 20:16:40 · 9625 阅读 · 0 评论 -
CUDA SDK cuda-opengl代码分析
//////////////////////////////////////////////////////////////////////////////// Copyright 1993-2015 NVIDIA Corporation. All rights reserved.//// Please refer to the NVIDIA end user license agre...原创 2018-08-10 15:15:59 · 737 阅读 · 0 评论 -
通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用
对于glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用虽然网上有很多的帖子,而且都试图解释得很详细,但是效果总是越说越黑,模棱两可的。今天我就简单滴说几句,言简意赅,希望大家随便看看之余能把这些个问题搞清楚了。glLoadIdentity()的作用就是把矩阵堆栈中的在栈顶的那个矩阵置为单位矩阵,好让之前的任何变换都不影响后面的变化。打个比喻,glLoa...转载 2018-08-10 15:31:26 · 228 阅读 · 0 评论 -
glutInit(argc, argv); glut初始化API
int main(int argc, char **argv){}int argc 和 char **argv 传递 到 你的自定义函数,再传递给 glutInit()。----------------------------------------自定义函数:void fun(int argc, char **argv,...){glutInit(&argc, argv);....转载 2018-08-08 14:56:29 · 2320 阅读 · 0 评论 -
glViewport()函数和glOrtho()函数的理解
在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho.glOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum则产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁...转载 2018-08-08 20:54:24 · 251 阅读 · 0 评论 -
OpenGl的glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理.如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进...转载 2018-08-08 21:11:30 · 168 阅读 · 0 评论 -
OpenGL学习脚印: 投影矩阵和视口变换矩阵
OpenGL中的视图可以利用照相机来进行比拟。产生目标的场景的变过过程类似于相机拍照。此步骤大概分为三个:1)把相机固定在三角架上,并让它对准场景(视图变换)2)对场景安排,使得各个物体在招片中的位置是我们所希望的(模型变换)3)选择照相机的镜头,并调整放大的倍数(投影变换)4)确定最终照片的大小,放大(视口变换)完成这些步骤就可以进行场景的绘制了。在这个过程...转载 2018-08-08 21:13:45 · 850 阅读 · 0 评论 -
Learn OpenGL (一):打开窗口
原文 Hello Window 作者 JoeyDeVries 翻译 Geequlim, Krasjet 环境VS2015+OpenGL3.3#include <glad/glad.h>#include <GLFW/glfw3.h>请确认是在包含GLFW的头文件之前包含了GLAD的头文件。GLAD的头文件包含了正确的OpenGL头文...翻译 2018-11-13 20:55:51 · 507 阅读 · 0 评论 -
Learn OpenGL (二):三角形
知识补充:顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO蓝色部分代表的是我们可以注入自定义的着色器的部分。图形渲染管线的第一个部分是顶点着色器(Vertex Shader),它把一个单独的顶...翻译 2018-11-14 08:49:15 · 331 阅读 · 0 评论 -
Learn OpenGL (五):向量
叉乘叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。如果输入的两个向量也是正交的,那么叉乘之后将会产生3个互相正交的向量。接下来的教程中这会非常有用。下面的图片展示了3D空间中叉乘的样子:不同于其他运算,如果你没有钻研过线性代数,可能会觉得叉乘很反直觉,所以只记住公式就没问题啦(记不住也没问题)。下面你会看到两个正交向量A和B叉积:...翻译 2018-11-15 19:11:19 · 1486 阅读 · 0 评论 -
Learn OpenGL (六):坐标系统
为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip ...翻译 2018-11-15 21:03:36 · 796 阅读 · 0 评论 -
Learn OpenGL (三):着色器
GLSL着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。如果你不知道什么是uniform也不用担心,我们后面会进行讲解。一个典型的着色器有下面...翻译 2018-11-14 19:37:06 · 946 阅读 · 0 评论 -
Learn OpenGL (四):纹理
为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样(译注:采集片段颜色)。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获...翻译 2018-11-15 13:07:59 · 1003 阅读 · 5 评论 -
Learn OpenGL (七):摄像机
1. 摄像机位置获取摄像机位置很简单。摄像机位置简单来说就是世界空间中一个指向摄像机位置的向量。我们把摄像机位置设置为上一节中的那个相同的位置:glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);不要忘记正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。2. 摄像机方向下一个需要的向量是摄像机...翻译 2018-11-16 14:09:10 · 531 阅读 · 0 评论 -
raymarching算法
raymarching 算法raymarching 算法思想很直观:首先有一个3D的体纹理,然后从相机发射n条射线,射线有一个采样的步长。当射线处在体纹理中时,每个步长采一次样,获取纹理值(实际上表示该点的密度值),计算光照,然后和该条射线当前累积的颜色值进行混合。为什么这样就可以渲染出正确的图案呢?因为光路是可逆的,从光源射出的光线经过散射,最终进入摄像机的效果等同于从摄像机发出的射线进行着色和...转载 2018-04-13 16:09:07 · 6908 阅读 · 4 评论