opengl学习
文章平均质量分 60
略略鱼子酱
这个作者很懒,什么都没留下…
展开
-
光线追踪学习:GPU端光线追踪学习
文章目录原文学习前言一、前置条件1.内容2.难点二、前置代码(sheder和三角形等设置)1.画面渲染2.Shader的使用3.材质信息4.在 shader 中进行三角形求交5.相机配置三、使用线性化的BVH树进行优化1. 构建BVH2. BVH 数据传送到 shader3. 和 AABB 盒子求交4. 非递归遍历 BVH 树四、开始光线追踪1. 原理总结原文学习GPU加速光线追踪前言之前跟着上文作者的博客学习了蒙卡罗特路径追踪,在CPU端模拟实现光追效果图片。但是渲染消耗过大,如果想要实现的更原创 2022-02-15 00:05:04 · 2118 阅读 · 0 评论 -
光线追踪学习:蒙特卡洛路径追踪的学习记录
光栅化与光线追踪感谢原作者让我复制作为技术学习的记录原文章的链接:蒙特卡洛路径追踪1;蒙特卡洛路径追踪2光线追踪与光栅化的区别在之前的文章中总结了技术方面的大概内容,还有很多的细节没有写明,比如光栅化只会显示出视野范围内的内容而裁减掉其他的东西,导致水面的倒影也会出现裁切等等。蒙特卡洛方法蒙特卡洛积分的目的: 当一个积分很难通过解析的方式得到答案的时候可以通过蒙特卡洛的方式近似得到积分结果:欲求区间上一函数的积分,我们往 x 区间上面丢豆子,并且计算豆子命中的位置的 y 的值,最后把他们原创 2022-01-16 16:59:04 · 730 阅读 · 0 评论 -
图形学知识:Ray Tracing in a Weekend笔记
光线追踪读书笔记Chapter 2:The vec3 class几乎所有的图形程序都有一些类用于存储几何向量和颜色。在许多系统中,这些向量是4D (3D +齐次坐标的几何,RGB + alpha透明通道的颜色)。对于我们的目的,三个坐标就足够了。我们将使用相同的类vec3用于颜色,位置,方向,偏移,等等。有些人不喜欢这个,因为它不能阻止你做一些愚蠢的事情,比如给一个位置添加颜色。他们有一个很好的观点,但当没有明显错误时,我们总是会采取“更少代码”的路线。下面是vec3类中的内容,后面还有一系列相关原创 2022-01-12 16:44:29 · 286 阅读 · 0 评论 -
图形学知识:光栅化和光线追踪的区别
原创 2022-01-11 16:24:21 · 3359 阅读 · 0 评论 -
opengl-PBR基于物理的渲染(Physically Based Rendering):光照实际渲染器
顶点着色器#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec2 aTexCoords;layout (location = 2) in vec3 aNormal;out vec2 TexCoords;out vec3 WorldPos;out vec3 Normal;uniform mat4 projection;uniform mat4 view;uniform mat..原创 2022-01-05 20:46:23 · 2118 阅读 · 0 评论 -
opengl-PBR基于物理的渲染(Physically Based Rendering):理论基础
PBR文档链接PBR-learnOpengl官方文档理论基础PBR概念PBR基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。相比Blinn-Pong光照算法更真实一些。基于物理的渲染仍然只是对基于物理原理的现实世界的一种近似。微平面模型所有的PBR技术都基于微平面理论。这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根原创 2021-12-26 13:38:55 · 2694 阅读 · 0 评论 -
opengl重新配置
VC++目录配置引用目录和静态链接库,C/C++配置头文件包含目录,链接器添加静态链接间接路径配置…\和sln文件同级的文件夹配置出现链接问题,添加glad.c文件到项目中动态链接库DLL放到和主文件同一级目录下注意自行添加stb_image.cpp文件和glad.c文件...原创 2021-12-07 22:05:14 · 306 阅读 · 0 评论 -
opengl实现骨骼动画-(1)原理
教学知识文档骨骼动画背景骨骼动画实际上是一个由两部分组成的过程。第一个由艺术家执行,第二个由程序员(或者更确切地说,你编写的引擎)执行。第一部分发生在建模软件内部,称为索具。这里发生的事情是,艺术家定义了网格下方的骨骼骨架。网格表示对象(无论是人类,怪物还是其他任何东西)的皮肤,并且骨骼用于以模仿现实世界中实际运动的方式移动网格。这是通过将每个顶点分配给一个或多个骨骼来完成的。将顶点分配给骨骼时,将定义一个权重,以确定骨骼移动时对顶点的影响量。通常的做法是使所有权重的总和为1(每个顶点)。例如,如原创 2021-11-28 18:25:20 · 2043 阅读 · 0 评论 -
opengl高级光照之延迟渲染以及光体积
延迟着色法延迟着色法官方文档我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常容易理解,也很容易实现,但是同时它对程序性能的影响也很大,因为对于每一个需要渲染的物体,程序都要对每一个光源每一个需要渲染的片段进行迭代,这是非常多的!因为大部分片段着色器的输出都会被之后的输出覆盖,正向渲染还会在场景中因为高深的复原创 2021-11-16 20:24:30 · 1360 阅读 · 0 评论 -
opengl高级光照之HDR
HDRopengl-HDR官方文档内容一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的。这个看起来无辜的语句使我们一直将亮度与颜色的值设置在这个范围内,尝试着与场景契合。这样是能够运行的,也能给出还不错的效果。但是如果我们遇上了一个特定的区域,其中有多个亮光源使这些数值总和超过了1.0,又会发生什么呢?答案是这些片段中超过1.0的亮度或者颜色值会被约束在1.0,从而导致场景混成一片,难以分辨。显示器被限制为只能显示值为0.0到1.0间的颜色原创 2021-11-09 20:09:47 · 742 阅读 · 2 评论 -
opengl高级光照之视差贴图(陡峭视差贴图以及视差遮蔽映射)
视差贴图视差贴图官方文档视差贴图视差贴图(Parallax Mapping)技术和法线贴图差不多,但它有着不同的原则。和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。它也是利用了视错觉,然而对深度有着更好的表达,与法线贴图一起用能够产生难以置信的效果。视差贴图和光照无关,我在这里是作为法线贴图的技术延续来讨论它的。需要注意的是在开始学习视差贴图之前强烈建议先对法线贴图,特别是切线空间有较好的理解。视差贴图属于位移贴图(Displacement Mapping)技术的一种,它对根据原创 2021-11-08 19:08:33 · 737 阅读 · 0 评论 -
opengl高级光照之法线贴图
法线贴图opengl官方文档核心修改的就是片段着色器中的normal值uniform sampler2D normalMap; void main(){ // 从法线贴图范围[0,1]获取法线 normal = texture(normalMap, fs_in.TexCoords).rgb; // 将法线向量转换为范围[-1,1] normal = normalize(normal * 2.0 - 1.0); [...]原创 2021-11-06 11:23:27 · 306 阅读 · 0 评论 -
opengl高级光照之点阴影
官方文档点阴影高级光照这个技术叫做点光阴影,过去的名字是万向阴影贴图(omnidirectional shadow maps)技术。算法和定向阴影映射差不多:我们从光的透视图生成一个深度贴图,基于当前fragment位置来对深度贴图采样,然后用储存的深度值和每个fragment进行对比,看看它是否在阴影中。定向阴影映射和万向阴影映射的主要不同在于深度贴图的使用上。对于深度贴图,我们需要从一个点光源的所有渲染场景,普通2D深度贴图不能工作;如果我们使用立方体贴图会怎样?因为立方体贴图可以储存6个原创 2021-09-25 17:10:56 · 428 阅读 · 0 评论 -
opengl高级光照-阴影映射
官方文档opengl阴影映射阴影映射(贴图)阴影映射(Shadow Mapping)背后的思路非常简单:我们以光的位置为视角进行渲染,我们能看到的东西都将被点亮,看不见的一定是在阴影之中了。假设有一个地板,在光源和它之间有一个大盒子。由于光源处向光线方向看去,可以看到这个盒子,但看不到地板的一部分,这部分就应该在阴影中了。在深度测试教程中,在深度缓冲里的一个值是摄像机视角下,对应于一个片段的一个0到1之间的深度值。如果我们从光源的透视图来渲染场景,并把深度值的结果储存到纹理中会怎样?通过这种方式原创 2021-09-24 18:11:08 · 813 阅读 · 0 评论 -
opengl高级光照之gamma校正
官方文章gamma校正gamma校正概念一个渐变的效果通过以下网站调整Gamma值可以观察到效果色彩管理网gamma校正Gamma校正(Gamma Correction)的思路是在最终的颜色输出上应用监视器Gamma的倒数。回头看前面的Gamma曲线图,你会有一个短划线,它是监视器Gamma曲线的翻转曲线。我们在颜色显示到监视器的时候把每个颜色输出都加上这个翻转的Gamma曲线,这样应用了监视器Gamma以后最终的颜色将会变为线性的。我们所得到的中间色调就会更亮,所以虽然监视器使它们变原创 2021-09-16 11:34:30 · 726 阅读 · 0 评论 -
opengl高级光照-Blinn-Phong
官方文档blinn-phong高级光照-Blinn-Phong冯氏光照不仅对真实光照有很好的近似,而且性能也很高。但是它的镜面反射会在一些情况下出现问题,特别是物体反光度很低时,会导致大片(粗糙的)高光区域。下面这张图展示了当反光度为1.0时地板会出现的效果:可以看到,在镜面高光区域的边缘出现了一道很明显的断层。出现这个问题的原因是观察向量和反射向量间的夹角不能大于90度。如果点积的结果为负数,镜面光分量会变为0.0。你可能会觉得,当光线与视线夹角大于90度时你应该不会接收到任何光才对,所以这原创 2021-09-14 11:35:43 · 437 阅读 · 1 评论 -
opengl之抗锯齿(有用到帧缓冲)
官方文档openglCN之抗锯齿抗锯齿结合图形学内容抗锯齿(Anti-aliasing,也被称为反走样)超采样抗锯齿(Super Sample Anti-aliasing, SSAA)的技术,它会使用比正常分辨率更高的分辨率(即超采样)来渲染场景,当图像输出在帧缓冲中更新时,分辨率会被下采样(Downsample)至正常的分辨率。多重采样抗锯齿(Multisample Anti-aliasing, MSAA)多重采样OpenGL光栅器:栅器会将一个图元的所有顶点作为输入,并将它转换为原创 2021-09-13 19:29:08 · 2169 阅读 · 0 评论 -
opengl之实例化--小行星
官方文档opengl实例化之小行星内容想象这样一个场景,在宇宙中有一个大的行星,它位于小行星带的中央。这样的小行星带可能包含成千上万的岩块,在很不错的显卡上也很难完成这样的渲染。实例化渲染正是适用于这样的场景,因为所有的小行星都可以使用一个模型来表示。每个小行星可以再使用不同的变换矩阵来进行少许的变化。为了展示实例化渲染的作用,我们首先会不使用实例化渲染,来渲染小行星绕着行星飞行的场景。这个场景将会包含一个大的行星模型,它可以在这里下载,以及很多环绕着行星的小行星。小行星的岩石模型可以在这里下载原创 2021-09-12 17:26:12 · 574 阅读 · 0 评论 -
opengl之实例化(Instance)
实例化实例化实例化数组opengl实例化官方文档1.实例化假设你有一个绘制了很多模型的场景,而大部分的模型包含的是同一组顶点数据,只不过进行的是不同的世界空间变换。想象一个充满草的场景:每根草都是一个包含几个三角形的小模型。你可能会需要绘制很多根草,最终在每帧中你可能会需要渲染上千或者上万根草。因为每一根草仅仅是由几个三角形构成,渲染几乎是瞬间完成的,但上千个渲染函数调用却会极大地影响性能。(这里主要是GPU通讯会产生更大的影响)如果我们需要渲染大量物体时,代码看起来会像这样:fo原创 2021-09-10 15:26:27 · 1690 阅读 · 0 评论 -
opengl之几何着色器(法向量可视化)
法向量可视化法向量可视化概念显示任意物体的法向量。当编写光照着色器时,你可能会最终会得到一些奇怪的视觉输出,但又很难确定导致问题的原因。光照错误很常见的原因就是法向量错误,这可能是由于不正确加载顶点数据、错误地将它们定义为顶点属性或在着色器中不正确地管理所导致的。我们想要的是使用某种方式来检测提供的法向量是正确的。检测法向量是否正确的一个很好的方式就是对它们进行可视化,几何着色器正是实现这一目的非常有用的工具。思路是这样的:我们首先不使用几何着色器正常绘制场景。然后再次绘制场景,但这次只显示通过原创 2021-09-09 19:40:39 · 719 阅读 · 0 评论 -
opengl之几何着色器(爆破物体)
爆破物体opengl官方文档之几何着色器尽管绘制房子非常有趣,但我们不会经常这么做。这也是为什么我们接下来要继续深入,来爆破(Explode)物体!虽然这也是一个不怎么常用的东西,但是它能向你展示几何着色器的强大之处。当我们说爆破一个物体时,我们并不是指要将宝贵的顶点集给炸掉,我们是要将每个三角形沿着法向量的方向移动一小段时间。效果就是,整个物体看起来像是沿着每个三角形的法线向量爆炸一样。爆炸三角形的效果在纳米装模型上看起来像是这样的:因为每一个点的法线值和面的法线值是不一样的,所以我们要自原创 2021-09-09 19:22:40 · 415 阅读 · 1 评论 -
opengl之几何着色器(2D房子)
官方文章opengl之及和着色器概念在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。用于传递的接口块:in gl_Vertex{ vec4 gl_Position; float gl_PointSize; floa原创 2021-09-09 11:28:13 · 728 阅读 · 0 评论 -
opengl之高级GLSL(2)-接口块,Uniform缓冲对象,Uniform块布局等
接口块当程序变得更大时,你希望发送的可能就不只是几个变量了,它还可能包括数组和结构体。为了帮助我们管理这些变量,GLSL为我们提供了一个叫做接口块(Interface Block)的东西,来方便我们组合这些变量。接口块的声明和struct的声明有点相像,不同的是,现在根据它是一个输入还是输出块(Block),使用in或out关键字来定义的。...原创 2021-09-07 18:48:24 · 756 阅读 · 1 评论 -
opengl之高级GLSL(1)-顶点着色器变量与片段着色器变量
官方教程位置openglCNGLSL的内建变量:我们已经学会使用顶点属性、uniform和采样器来完成这一任务了。然而,除此之外,GLSL还定义了另外几个以gl_为前缀的变量,它们能提供给我们更多的方式来读取/写入数据。我们已经在前面教程中接触过其中的两个了:顶点着色器的输出向量gl_Position,和片段着色器的gl_FragCoord。顶点着色器变量List item我们已经见过gl_Position了,它是顶点着色器的裁剪空间输出位置向量。如果你想在屏幕上显示任何东西,在顶点着色器中原创 2021-09-07 16:31:40 · 2699 阅读 · 2 评论 -
opengl之高级数据
注: 优先看英文原版openglCN之高级数据概念这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理对象来储存大量的数据(纹理的部分还没有完成)。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地将其绑定到GL_ELEMENT_ARRAY_BUFFER。OpenGL内部会为每个目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。到目前为止,我们一直是调用glBufferData函数来填充缓冲对象所管理的内存,这个函数会分配原创 2021-09-07 14:52:44 · 191 阅读 · 0 评论 -
opengl环境映射,反射贴图
注意完整的mesh与shader文件:mesh增加了法线与高度贴图: // render the mesh void Draw(Shader shader) { // bind appropriate textures unsigned int diffuseNr = 1; unsigned int specularNr = 1; unsigned int normalNr = 1; unsigne原创 2021-09-06 20:10:26 · 931 阅读 · 0 评论 -
opengl立体贴图与天空盒
openglCN之立方体贴图概念空间以外都不会显示(-1,1)天空盒在进行坐标位置渲染的时候并没有位移矩阵保留旋转而没有位移保证中心点片段着色器:#version 400 coreout vec4 FragColor;in vec3 TexCoords;uniform samplerCube skybox;void main(){ FragColor=texture(skybox,TexCoords);//因为还是纹理,取值和坐标}顶点着色器原创 2021-09-03 16:52:05 · 472 阅读 · 0 评论 -
opengl帧缓冲扩展:后期处理和核效果
这一期是与帧缓冲是一起的后期处理:反相:我们现在能够访问渲染输出的每个颜色,所以在(译注:屏幕的)片段着色器中返回这些颜色的反相(Inversion)并不是很难。我们将会从屏幕纹理中取颜色值,然后用1.0减去它,对它进行反相。void main(){ FragColor = vec4(vec3(1.0 - texture(screenTexture, TexCoords)), 1.0);}灰度:另外一个很有趣的效果是,移除场景中除了黑白灰以外所有的颜色,让整个图像灰度化(Gra原创 2021-09-03 15:16:12 · 361 阅读 · 0 评论 -
opengl-帧缓冲
帧缓冲概念到目前为止,我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。有了我们自己的帧缓冲,我们就能够有更多方式来渲原创 2021-09-02 11:14:53 · 215 阅读 · 0 评论 -
opengl 性能优化帧数显示&剔除面FaceCulling
查看帧数在while循环的末尾添加如下代码 glfwPollEvents(); //立即处理已经到位的事件,如果没有这个就会一直渲染而不触发事件 glfwSwapBuffers(window); modelPicking(); static int ticks = -1; ticks++; static double _lastTime = glfwGetTime();原创 2021-08-31 20:32:19 · 769 阅读 · 0 评论 -
opengl之混合
混合的理论openglCN官网之混合不考虑深度和模板的情况下代码内容修改glsl:由于启用了混合,我们就不需要丢弃片段了,所以我们把片段着色器还原(这里我们用的是透明值) FragColor=vec4(result,texColor.a);主函数修改首先生成模型model都是一样的,所以都提出来;然后旋转效果去掉 for (_modelsIter = _models.begin(); _modelsIter != _models.end(); _modelsIte原创 2021-08-30 16:47:34 · 252 阅读 · 0 评论 -
opengl透明效果&将模型点击放置在另一个模型之上
opengl高级opengl中的混合这一章最好还是看官网文章OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多种颜色为一种颜色。所以透明度能让我们看穿原创 2021-08-26 18:37:27 · 1022 阅读 · 0 评论 -
opengl-shader封装函数通过函数传值给着色器
标题相当于通过函数进行着色器传值封装的时候添加了如下代码给shader.cpp//shader封装绑定函数void Shader::setMat4(const std::string& name, const glm::mat4& mat) const{ //通过一致变量(uniform修饰的变量)引用将一致变量值传入渲染管线。相当于更新glsl中的值 glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str(原创 2021-08-25 20:32:53 · 492 阅读 · 0 评论 -
C++常见问题-字符串参数
注意构造函数里边的参数应该是:Model(const char path),因为你输入的是一个不变的量*原创 2021-08-25 20:23:22 · 186 阅读 · 0 评论 -
opengl模板测试
这里很多源码包括shader都要改变,所以直接用已有代码进行替换主函数也相应的需要修改类也发生改变了修改shader类封装着色器绑定函数//shader封装绑定函数void Shader::setMat4(const std::string& name, const glm::mat4& mat) const{ glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &.原创 2021-08-23 17:33:09 · 177 阅读 · 0 评论 -
opengl鼠标点击选取模型
map使用,定义然后插入 //使用model类生成model对象 Model ourModel("D:/openGLResource/bin/nanosuit/nanosuit.obj"); //定义map和插入两个模型 map<string, pair<glm::vec3, Model>> _models; //下面是两种插入方式,第二种更为简单 _models.insert(pair<string, pair<glm.原创 2021-08-23 14:52:33 · 1741 阅读 · 2 评论 -
opengl世界坐标系
通过鼠标获取模型上某个点的世界坐标之前做的的,现在反过来。退到第二部分(通过乘以逆矩阵)过程先得出屏幕原创 2021-08-21 17:39:00 · 725 阅读 · 0 评论 -
高级opengl:深度测试基本概念
PS:这一部分结合图形学原理看概念在坐标系统小节中,我们渲染了一个3D箱子,并且运用了深度缓冲(Depth Buffer)来防止被阻挡的面渲染到其它面的前面。在这一节中,我们将会更加深入地讨论这些储存在深度缓冲(或z缓冲(z-buffer))中的深度值(Depth Value),以及它们是如何确定一个片段是处于其它片段后方的。深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自原创 2021-08-19 21:13:15 · 190 阅读 · 0 评论 -
opengl Assimp文件需要Cmake之后自己编译Assimp.snl生成dll和lib文件
如题原创 2021-08-18 17:32:11 · 216 阅读 · 0 评论 -
opengl模型加载
环境配置以及视角修改和着色器亮度修改首先注意我的文件生成目录为bin目录所以要用到的dll文件必须放到bin目录文件夹下面,而不是debug下面调整视角位置更高一点public: Camera() { fov = 45; Position = glm::vec3(0.0f, 7.0f, 20.0f); UP = glm::vec3(0.0f, 1.0f, 0.0f); Front = glm::vec3(0.0f, 0.0f, -1.0f); //移动的距离在旋转和wasd原创 2021-08-18 17:10:12 · 449 阅读 · 0 评论