
OpenGL学习
文章平均质量分 72
学习OpenGL
仰望—星空
我不懒,还没有简历
展开
-
OpenGL调试-字体
如果当你启动程序时出现"无法启动应用程序",则你需要将freetype.dll放到你项目的Debug目录下。原创 2023-05-16 14:18:43 · 253 阅读 · 0 评论 -
OpenGL实战-调试
官方的标准使用OpenGL的GLSL参考编译器(Reference Compiler)来检查。你可以从这里下载所谓的GLSL语言校验器(GLSL Lang Validator)的可执行版本。注意如果没有检测到错误的话则没有输出。它不会显示AMD,NVidia,以及Intel的GLSL编译器之间的细微差别,也不能保证你的着色器完全没有Bug,但它至少能够帮你对着直接的GLSL规范进行检查。切换到D盘 d:转到某地址目录下 cd /d 地址。原创 2023-05-16 11:22:26 · 857 阅读 · 0 评论 -
OpenGL高级光照-Gamma校正
设一个颜色的值为q(x∈[0,1]),设显示器展示出来的亮度值为w,设人眼看到的亮度值为e。当显示器设备的gamma为2.2时,则w=q ^ 2.2人眼相当于二次幂,即人眼看到的颜色亮度为e=q ^ 2。因此CRT这个缺陷正好能满足人的需要,即CRT上展示的颜色亮度,就为人眼中应该看到的颜色。但有一个问题是:当我们对颜色值做变换的时候,在我们人眼中的颜色会发生意想不到的改变:比如,光的颜色向量L=(0.5,0.0,0.0)代表的是暗红色。原创 2023-05-14 21:42:43 · 220 阅读 · 0 评论 -
OpenGL高级光照-BlinnPhong
【代码】OpenGL高级光照-BlinnPhong。原创 2023-05-14 20:09:20 · 114 阅读 · 0 评论 -
OpenGL高级-抗锯齿
当我们现在调用glfwCreateWindow,用于渲染的窗口就被创建了,这次每个屏幕坐标使用一个包含4个子样本的颜色缓冲。这意味着所有缓冲的大小都增长4倍。 现在我们请求GLFW提供了多样本缓冲,我们还要调用glEnable来开启多采样,参数是 GL_MULTISAMPLE。大多数OpenGL驱动,多采样默认是开启的,所以这个调用有点多余,但通常记得开启它是个好主意。这样所有OpenGL实现的多采样都开启了。离屏MSAA 因为GLFW负责创建多采样缓冲,开启MSAA非常简单。如果我们打算使用我们自原创 2023-05-14 18:40:07 · 425 阅读 · 0 评论 -
OpenGL高级-实例化
假如你有一个有许多模型的场景,而这些模型的顶点数据都一样,只是进行了不同的世界空间的变换。想象一下,有一个场景中充满了草叶:每根草都是几个三角形组成的。你可能需要绘制很多的草叶,最终一次渲染循环中就肯能有成千上万个草需要绘制了。因为每个草叶只是由几个三角形组成,绘制一个几乎是即刻完成,但是数量巨大以后,执行起来就很慢了。像这样绘制出你模型的其他实例,多次绘制之后,很快将达到一个瓶颈,这是因为你glDrawArrays或glDrawElements这样的函数(Draw call)过多。原创 2023-05-14 17:10:35 · 1143 阅读 · 0 评论 -
OpenGL高级-几何着色器
在顶点和片段着色器之间有一个可选的着色器,叫做几何着色器(Geometry Shader)。几何着色器以一个或多个表示为一个单独基本图形(primitive)的顶点作为输入,比如可以是一个点或者三角形。几何着色器在将这些顶点发送到下一个着色阶段之前,可以将这些顶点转变为它认为合适的内容。几何着色器有意思的地方在于它可以把(一个或多个)顶点转变为完全不同的基本图形(primitive),从而生成比原来多得多的顶点。330使用这3个输出修饰符我们可以从输入的基本图形创建任何我们想要的形状。原创 2023-05-13 17:14:38 · 1308 阅读 · 0 评论 -
OpenGL高级-GLSL
我们会讨论一些内建变量(Built-in Variable)、组织着色器输入和输出的新方式以及一个叫做uniform缓冲对象(Uniform Buffer Object)的非常有用的工具。原创 2023-05-13 14:05:56 · 975 阅读 · 0 评论 -
OpenGL高级-数据
1.调用glBufferSubData将数据更新到指定区域的缓冲内存空间中。2.调用glMapBuffer获取绑定到对应缓冲类型上的缓冲对象指针,再使用memcpy将数据传入其中,要记得解除映射glUnmapBuffer。原创 2023-05-12 18:55:28 · 150 阅读 · 0 评论 -
OpenGL高级-立方体贴图
渲染物体的顶点着色器: 渲染物体的片段着色器: 渲染天空盒的顶点着色器: 渲染天空盒的片段着色器:主程序优化 如果先渲染天空盒再渲染物体,由于场景中天空盒很多的片段可能被物体遮挡,但先渲染天空盒会对天空盒的所有片段执行片段着色器,这样会造成性能的浪费。如果我们先渲染物体,然后只渲染天空盒没有被遮挡的部分,那么会得到优化,如何渲染天空盒没有被遮挡的部分呢? 透视除法在顶点着色器之后执行,即把gl_Position的xyz除以w元素。我们需要使得天空盒在执行透视除法后z元素为1,因此我们在天空原创 2023-05-12 15:49:52 · 991 阅读 · 0 评论 -
OpenGL高级-帧缓冲
颜色缓冲记录帧的颜色值,深度缓冲记录深度信息,模板缓冲允许我们基于一些条件丢弃指定片段。这几种缓冲结合起来叫做帧缓冲(FrameBuffer),它被储存于内存中。 OpenGL给了我们自己定义帧缓冲的自由,我们可以选择性的定义自己的颜色缓冲、深度和模板缓冲。 定义自己的帧缓冲好处就是:我们现在可以自由的获取已经渲染场景中的任何像素,然后把它当作一个纹理图像了。我们可以在片段着色器中创建一些有意思的效果。所有这些有意思的效果统称为后处理特效。 我们目前所做的渲染操作都是是在默认的帧缓冲之上进行的。当你原创 2023-05-11 19:52:28 · 1415 阅读 · 0 评论 -
OpenGL高级-面剔除
默认情况下,逆时针的顶点连接顺序被定义为三角形的正面。面剔除是OpenGL提高效率的一个强大工具,它使应用节省运算。你必须跟踪下来哪个物体可以使用面剔除,哪些不能。面剔除针对像立方体这样的封闭形状有效,当对封闭形状使用剔除时,如果剔除内部的面,则在外面看是同样的效果,在里面看则会看不到任何物体。原创 2023-05-10 13:41:03 · 274 阅读 · 0 评论 -
OpenGL高级之 混合下
使用混合时要注意物体的渲染顺序,先绘制不透明的物体,再又远及近的绘制透明物体。对于草这种全透明物体,我们可以简单的丢弃透明像素而不是混合,原创 2023-05-10 12:06:08 · 193 阅读 · 0 评论 -
OpenGL高级之 混合上
1.从const char转换到GLchar会报错,因此将GLchar类型转换为const GLchar。2.当SOIL_load_image加载图片错误时,glTexImage2D以加载图片的数组为参数时会报出错误代码:1281。加载图片很容易出错,无论是文件地址写错一个字母,还是诸如在浏览器里下载的莫名格式图片,都很容易加载错误。这时就会报错1281,可以看看图片是否加载成功。原创 2023-05-09 18:39:30 · 828 阅读 · 0 评论 -
OpenGL高级-模板测试
仅展示核心代码,其他代码见。原创 2023-05-08 19:26:29 · 476 阅读 · 0 评论 -
OpenGL加载模型之 模型
【代码】OpenGL加载模型之 模型。原创 2023-05-07 00:30:28 · 413 阅读 · 0 评论 -
OpenGL加载模型 之网格
所以我们要做的第一件事,就是加载一个模型文件为scene对象,然后获取每个节点对应的Mesh对象(我们需要递归搜索每个节点的子节点来获取所有的节点),并处理每个Mesh对象对应的顶点数据、索引以及它的材质属性。最终我们得到一个只包含我们需要的数据的Mesh集合。原创 2023-05-06 21:55:18 · 1078 阅读 · 0 评论 -
OpenGL光源之 多光源
不多讲解,直接上代码,代码上都有注释,草履虫都能看懂。本文的程序来自于,这一节内容我调试了好久,一下午才把Bug修复。总结,当你拿到别人的OpenGL代码时,首先你要看主程序中的外部依赖库和一些头文件你是否具有,然后你需要对着色器的文件地址进行修改,然后就是对资源如图片的文件地址进行修改。教程原文中的代码是具有Bug的,第一个Bug就是纹理过滤方式的设置,纹理过滤方式不能将放大纹理设置为多级渐进纹理GL_NEAREST_MIPMAP_NEAREST,不然你使用glGetError会报错的。原创 2023-05-05 19:20:15 · 412 阅读 · 0 评论 -
OpenGL光照教程之 透光物
我们目前使用的所有光照都来自于一个单独的光源,这是空间中的一个点。它的效果不错,但是在真实世界,我们有多种类型的光,它们每个表现都不同。一个光源把光投射到物体上,叫做投光。这个教程里我们讨论几种不同的投光类型。学习模拟不同的光源是你未来丰富你的场景的另一个工具。我们首先讨论定向光(directional light),接着是作为之前学到知识的扩展的点光(point light),最后我们讨论聚光(Spotlight)。下面的教程我们会把这几种不同的光类型整合到一个场景中。原创 2023-05-05 14:56:03 · 884 阅读 · 0 评论 -
OpenGL光照教程之 光照贴图
前面的教程,我们讨论了让不同的物体拥有各自不同的材质并对光照做出不同的反应的方法。在一个光照场景中,让每个物体拥有和其他物体不同的外观很棒,但是这仍然不能对一个物体的图像输出提供足够多的灵活性。前面的教程中我们将一个物体自身作为一个整体为其定义了一个材质,但是现实世界的物体通常不会只有这么一种材质,而是由多种材质组成。想象一辆车:它的外表质地光亮,车窗会部分反射环境,它的轮胎没有specular高光,轮彀却非常闪亮(在洗过之后)。汽车同样有diffuse和ambient颜色,它们在整个车上都不相同;原创 2023-05-05 12:33:12 · 1238 阅读 · 0 评论 -
OpenGL学习教程之 材质
在真实世界里,每个物体会对光产生不同的反应。钢看起来比陶瓷花瓶更闪闪发光,一个木头箱子不会像钢箱子一样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体不会散射(Scatter)很多光却会反射(Reflect)很多光,结果看起来就有一个较小的高光点(Highlight),有些物体散射了很多,它们就会产生一个半径更大的高光。如果我们想要在OpenGL中模拟多种类型的物体,我们必须为每个物体分别定义材质(Material)属性。原创 2023-05-05 02:01:01 · 1088 阅读 · 0 评论 -
OpenGL光照:光照基础
现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的光照仅仅使用了简化的模型并基于对现实的估计来进行模拟,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个元素组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。 环境光照:即使在黑暗的情况下,世界上也仍然有一些原创 2023-04-27 15:36:49 · 1612 阅读 · 0 评论 -
OpenGL光照:颜色
现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们要做的工作是使用(有限的)数字来模拟真实世界中(无限)的颜色,因此并不是所有的现实世界中的颜色都可以用数字来表示。然而我们依然可以用数字来代表许多种颜色,并且你甚至可能根本感觉不到他们与真实颜色之间的差异。颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB。这三个不同的分量组合在一起几乎可以表示存在的任何一种颜色。 我们在现实生活中看到某一物体的颜色并不是这个物体的真实颜色,而是它所反射(R原创 2023-04-26 19:49:27 · 683 阅读 · 0 评论 -
OpenGL入门教程
到这里OpenGL入门教程就完结了。原创 2023-04-26 17:23:30 · 628 阅读 · 0 评论 -
OpenGL入门教程之 摄像机
前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景。OpenGL本身没有摄像机的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,这样感觉就像我们在移动,而不是场景在移动。本节我们将会讨论如何在OpenGL中模拟一个摄像机,将会讨论FPS风格的可自由在3D场景中移动的摄像机。我们也会讨论键盘和鼠标输入,最终完成一个自定义的摄像机类。原创 2023-04-26 01:52:44 · 1289 阅读 · 0 评论 -
OpenGL入门教程之 坐标系统
本文仅对有代码的地方做讨论。原创 2023-04-25 15:00:28 · 1248 阅读 · 0 评论 -
OpenGL入门教程之 变换
这是一个闪耀的时刻,因为我们即将能生产出令人惊叹的3D效果!原创 2023-04-25 00:35:45 · 1870 阅读 · 0 评论 -
OpenGL教程之 纹理练习
解析:朝向另一个方向很简单,即让上文中的图片进行左右对称变换即可,即将片段着色器中笑脸的纹理坐标从textCord转换为vec2( 1 - textCord.x, text.y )。尝试用不同的纹理环绕方式,设定一个从0.0f到2.0f范围内的(而不是原来的0.0f到1.0f)纹理坐标。尝试在矩形上只显示纹理图像的中间一部分,修改纹理坐标,达到能看见单个的像素的效果。使用一个uniform变量作为mix函数的第三个参数来改变两个纹理可见度,使用上和下键来改变箱子或笑脸的可见度。原创 2023-04-24 13:51:06 · 624 阅读 · 0 评论 -
OpenGL入门教程之 纹理
我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。 艺术家和程序员更喜欢使用纹理(Texture)。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。因为我们可以在一张图片上插入非常多的原创 2023-04-23 19:13:16 · 2293 阅读 · 0 评论 -
计算机图形学CG 学习资源和路线
注意链接中的OpenGL教程网站是旧版文档,它使用的是glew,而新版本的教程使用的是glad,简单来说glad是glew的升级版,总之学习新版肯定是更全面更好理解更利于发展的,所以如果你不是和我一样是从旧版学习文档开始的,那么我推荐你从。如果你正处于学习OpenGL阶段,但却对学习教程中的概念理解感觉不够深刻,推荐看。如果你是小白,对计算机图形学还一窍不通,建议学习。,如果遇到不会和不好理解的地方,可以看看。如果你想学习OpenGL,推荐参考。开始入门,然后可以开始学习。原创 2023-04-18 23:47:44 · 597 阅读 · 0 评论 -
OpenGL入门教程之 着色器类
编写、编译、管理着色器是件麻烦事。我们会写一个类来让我们的生活轻松一点,它可以从硬盘读取着色器,然后编译并链接它们,并对它们进行错误检测,这就变得很好用了。这也会让你了解该如何封装目前所学的知识到一个抽象对象中。 我们会把着色器类全部放在在头文件里,主要是为了学习用途,当然也方便移植。我们先来添加必要的include,并定义类结构。 着色器类完整的源代码如下:原创 2023-04-22 11:51:34 · 282 阅读 · 0 评论 -
OpenGL入门教程之 变化颜色的三角形
。。。。。。。。。通常情况下它至少会返回16个,大部分情况下是够用了。原创 2023-04-21 14:44:02 · 736 阅读 · 0 评论 -
OpenGL入门教程之 三角形练习
本文章被包含在专栏中。本练习基于中绘制三角形的代码程序。原创 2023-04-21 11:56:23 · 646 阅读 · 0 评论 -
OpenGL入门教程之 深入三角形
通过阅读以下的函数,你的大脑里能留下关于OpenGL基本函数的一个大致印象。不需深入理解,可忽略此节初始化glfw,为一些空指针赋值。设置glfw库的一些属性,name为属性字段,value为设置的值。GLFW_CONTEXT_VERSION_MAJOR指OpenGL主版本号。GLFW_CONTEXT_VERSION_MINOR指OpenGL次版本号。GLFW_OPENGL_PROFILE指渲染模式, GLFW_OPENGL_CORE_PROFILE为核心模式。原创 2023-04-20 21:10:57 · 1499 阅读 · 0 评论 -
OpenGL入门教程之 深入理解
程序代码处于内存之中,在我们通常的理念中一般仅涉及CPU和内存,而使用OpenGL的渲染程序却有所不同,其。本文内容仅为个人在OpenGL学习中的感想,如有不当之处请不吝赐教。原创 2023-04-19 01:25:37 · 1593 阅读 · 0 评论