OpenGL
文章平均质量分 85
渲染API
森龙安
引擎 || 图形 || 客户端等 个人学习笔记,游戏开发爱好者,个人能力有限,如有不足还望指正
展开
-
OpenGL3.3_C++_Windows(37调试,文本渲染)
视觉错误与CPU调试不同,在GLSL代码中也不能设置断点,出现错误的时候寻找错误的源头可能会非常困难。原创 2024-09-13 00:35:51 · 739 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(36PBR_IBL镜面部分)
有别于均匀或纯随机地,采样会根据粗糙度,偏向微表面的半向量的宏观反射方向,将 GGX NDF应用到采样中。该序列生成的仍然是随机样本,但样本分布更均匀:具有更快的收敛速度,它们会以更快的速度收敛到精确解,这使得它对于性能繁重的应用很有用。我们可以在预过滤卷积时,不直接采样环境贴图,而是基于积分的 PDF 和粗糙度采样环境贴图的 mipmap。较低的 mip 级别具有更低的分辨率,并且预过滤贴图代表了与更大的采样波瓣卷积,因此缺乏。随着样本数量的不断增加,我们最终将收敛到积分的精确。原创 2024-08-26 23:17:24 · 758 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(35PBR_IBL漫反射部分)
PBR_IBL漫反射IBL图像的光照(Image based lighting):非直接光源,它是一种更精确的环境光照输入格式,甚至也可以说是一种全局光照的粗略近似。 环境光照:获取每个wi光源辐射率,求辐照度:将周围环境整体视为一个大光源,通常使用环境立方体贴图 (Cubemap) ,每个纹素视为一个光源 可以将将BRDF分解为漫反射kd和镜面ks两个部分:分解后位移常数项,一下介绍漫反射部分: 辐照度图:根据环境贴图,预计算立方体贴图:对于一个采样方向(纹素)wi入射光,通过卷积,对半球原创 2024-08-14 00:08:23 · 353 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(22Blinn-Phong光照模型)
(入射光线 + 视线 ) / |(入射光线 + 视线 )|正规化(只关心半程向量方向,不关系长度)只需要dot(半程,法线)……原创 2024-06-28 10:04:49 · 537 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(21MSAA抗锯齿)
遇到模型边缘有锯齿:光栅器将顶点数据转化为片段的方式有关。原创 2024-06-27 15:36:35 · 604 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(16缓冲区的操作)
【代码】OpenGL3.3_C++_Windows(16)原创 2024-06-22 17:40:33 · 531 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(13面剔除,帧缓冲)
dataNULL,原创 2024-06-20 07:39:02 · 640 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(26点光源阴影)
Demo演示有Shadow无Shadow渲染点光源阴影点光源算法和定向阴影映射差不多,但不同的是,不能用平行光使用的单一视角定向阴影映射生成阴影贴图,应计算每个方向的深度贴图 需要从一个点光源的所有方向渲染场景,普通2D深度贴图不能工作;如果我们使用立方体贴图会怎样?整个场景渲染到立方体贴图的每个面上,把它们当作点光源四周的深度值来采样。过程: 立方体贴图: 正常流程: 从光周围渲染场景6次(需要6个不同的视图矩阵,)for(){} 每次启用立方体贴图的原创 2024-07-01 20:33:33 · 596 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(34PBR直接光照部分)
【代码】OpenGL3.3_C++_Windows(34)原创 2024-08-08 23:04:44 · 207 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(25阴影失真问题)
阴影失真:阴影的不真实感条纹样式:首先理解采样原理:同光的视角下,渲染一张深度图,每个像素,存储同一射线下的深度值(不断更新深度缓冲的结果),即最近片段的深度。 接着,每个片段,T变换到光的视角下,从对应的深度贴图采样,比较自身的深度值,和深度贴图的深度值,、这便是阴影计算的过程 但是,深度贴图受限于分辨率,在距离光源比较远的情况下,多个片段可能从深度贴图的同一个值中去采样, 由于每个像素的深度值,为映射到同一像素范围内片段的中心点,那么映射到同一像素范围内的,某些Fragment.z &g原创 2024-06-30 14:11:36 · 1207 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(20实例化和批处理)
【代码】OpenGL3.3_C++_Windows(20)原创 2024-06-27 09:10:09 · 801 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(2,2d图形)
VAO顶点数组(顶点数据和属性配置:当绘制物体绑定相应的VAO,绘制完成解绑):glGenVertexArrays 创建VAO,glBindVertexArray(VAO):到glBindVertexArray(0);索引缓冲EBO:glGenBuffers :glBindBuffer,glBufferData矩形只有4个而不是6个顶点,为了减少开销,存储绘制哪些顶点的索引,和vao一样也在draw前取出glBindBuffer。对于绘制不同的图元,关键是,绑定什么shader,VAO,drawAPI。原创 2024-06-08 15:42:46 · 1033 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(29HDR色调映射)
Demoexposure = 0.1fexposure = 5.0fHDR色调映射问题:有多个亮光源使这些数值总和超过了1.0,颜色值会被约束在1.0,从而导致场景混成一片,难以分辨: 色调映射:用更大范围的颜色值渲染从而获取大范围的黑暗与明亮的场景细节,最后将所有HDR(High Dynamic Range, 高动态范围)值转换成在[0.0, 1.0]范围的LDR(Low Dynamic Range,低动态范围)。 帧缓冲使用了(像GL_RGB)为其颜色缓冲的内部格式,OpenGL原创 2024-07-10 21:59:05 · 232 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(28视差贴图)
Demo演示demo视差贴图视差/高度/位移贴图(黑--白):和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。 第一种思路(置换顶点):对于一个quad ,分成约1000个顶点,根据储存在深度贴图中的几何信息对平面特定区域的顶点的高度进行位移或偏移。但计算量太大了 视差贴图:修改纹理坐标使一个fragment的表面看起来比实际的更高或者更低,所有这些仅根据观察方向和高度贴图,不需要额外的顶点数据(例如quad只需6个顶点), 模拟:假设,根据高度贴图模拟了真正的高度,我们视线原创 2024-07-08 23:32:39 · 289 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(6场景摄像机)
【代码】OpenGL3.3_C++_Windows(6)原创 2024-06-11 21:05:05 · 583 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(17glsl内置模块应用)
【代码】OpenGL3.3_C++_Windows(17)原创 2024-06-23 22:09:42 · 862 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(31延迟渲染管线)
demo延迟渲染管线正向渲染:一个物体渲染完成,接着渲染下一个,对于光源需要对每个片段迭代计算,复杂度很高 延迟渲染(Deferred Rendering):几何处理阶段,渲染场景到G缓冲(G-buffer)的纹理中(例如各种向量,镜面值……),并不用做复杂的光照计算,光照处理阶段(Lighting Pass),渲染屏幕大小的方形,使用G缓冲内的纹理数据, 这样并不直接获取顶点着色器中的数据,而是延迟到G缓冲获取,因为深度测试已经将片段更新最顶层的片段(纹理的深度存储)。这样保证了对于在光原创 2024-07-20 23:50:29 · 271 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(1项目配置,创建窗口)
OpenGL本身由Khronos维护的规范(Specification),而OpenGL库作为图形API,开发者自行实现(Implement)固定渲染管线(转为2d图形的过程):立即渲染,开发者无法控制OpenGL如何进行计算。3.3后核心模式:提供了更多的灵活性,更高的效率对扩展(Extension)的支持。本质状态机(State Machine),根据OpenGL上下文(Context)状态去执行相应的渲染。原创 2024-06-07 15:53:06 · 688 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(33PBR理论基础)
PBR渲染管线Physically Based Rendering渲染管线 :使用一种更符合物理学规律的算法模型来模拟光线,由于它与物理性质非常接近,可以直接以物理参数为依据来编写表面材质 判断是否基于物理的渲染,有三个数学模型:微平面,能量守恒,BRDF微平面理论:在微观尺度下,没有任何平面是完全光滑的。可以看作由不同的微小平面组成, 由于这些微平面已经微小到无法逐像素地继续对其进行区分,因此我们假设一个粗糙度(Roughness)参数a, 半程向量:(入射光线 + 视线 ) / |(入原创 2024-08-05 00:51:28 · 872 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(14天空盒,环境映射)
【代码】OpenGL3.3_C++_Windows(14)原创 2024-06-20 07:47:00 · 795 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(10Assimp模型库的使用)
。原创 2024-06-15 10:25:00 · 905 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(23Gamma校正)
【代码】OpenGL3.3_C++_Windows(23)原创 2024-06-28 15:18:44 · 1246 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(18glsl内置模块)
接口块:glsl彼此传输数据,通过in / out,当更多的变量,涉及数组和结构体 接口块(Interface Block)类似struct,in / out +块名{……}实例名Uniform缓冲对象:首先理解uniform Object: 负责向glsl传入变量/ 数组 / 结构体……,类似于const,这个不能在glsl内部被修改 glsl在GPU上运行,uniform在着色器程序内部是全局的const,意味着不必通过顶点着色器作为中介 Uniform Buffer Object原创 2024-06-23 22:14:51 · 730 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(4,2d纹理,线性代数)
st、原创 2024-06-10 11:31:08 · 933 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(12模板测试,颜色混合)
ref。原创 2024-06-17 21:32:22 · 729 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(30泛光)
MRT&高斯模糊&泛光泛光:光芒从光源向四周发散。给观众一种这些光源或明亮的区域非常亮的错觉,有了HDR之后再实现泛光就更简单了 过程:正常渲染场景至HDR颜色缓冲->提取所有超出一定亮度的fragment->将这个超过一定亮度阈限的纹理进行模糊处理->添加到原来的HDR场景纹理之上 //初始化:多渲染目标MRT(Multiple Render Targets):指定多个像素着色器输出,像素着色器的输出前,我们指定一个布局location标识符,这样我们便可控原创 2024-07-16 07:27:41 · 313 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(19几何着色器与应用)
向量是一个抽象的概念,涉及一系列简单 /复杂的 公式定义。原创 2024-06-25 19:19:32 · 954 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(5坐标变换,绘制立方体)
【代码】OpenGL3.3_C++_Windows(5)原创 2024-06-10 18:50:03 · 763 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(3,glsl基础,premake5使用)
下载premake-5.0.0-beta2-windows.zip,必须也拷贝LICENSE.txt许可证才行 premake:编写简单的Lua脚本来描述项目的配置和构建等选项。Premake.exe Tokens:根据不同的平台和配置自动调整自身,和vs中的属性配置差不多,是一个意思。wks工作区,prj项目,cfg项目配置,比如%{cfg.buildcfg}(当前的构建名称(debug||release……)..返回上级目录,"cfg.buildtarget" (dll)or "cfg.linkta原创 2024-06-09 17:21:47 · 888 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(8投光物(平行光,点光,聚光))
【代码】OpenGL3.3_C++_Windows(8)原创 2024-06-13 17:42:38 · 1163 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(24平行光阴影)
如果使用一个所有光线都平行的定向光,使用正交投影矩阵,否则点光源和聚光灯,使用透视投影矩阵(因为投影矩阵实质,是决定可见的范围,以及范围的形状,光空间的范围,即光线的散射组成的范围,被光覆盖的范围)LookAt()计算光(位置+看的方向)的view矩阵(实质,将物体坐标变换到相机坐标的视角下),原创 2024-06-30 14:05:40 · 732 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(27法线贴图)
格拉姆-施密特。原创 2024-07-03 22:57:19 · 905 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(32SSAO环境光遮蔽)
demoSSAOSSAO环境光照(Ambient Lighting):光的散射,我们通过一个固定的常量作为环境光的模拟, 但是这种固定的环境光并不能很好模拟散射,因为环境光不是一成不变的, 环境光遮蔽:让(褶皱、孔洞)等变暗的方法近似模拟出间接光照,但是这一技术会带来很大的性能开销,因为它还需要考虑周围的几何体。 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO):这一技术使用了屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量。 原理:对原创 2024-07-29 22:05:42 · 446 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(11深度测试)
【代码】OpenGL3.3_C++_Windows(11)原创 2024-06-17 21:29:08 · 1306 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(9多光源)
【代码】OpenGL3.3_C++_Windows(9)原创 2024-06-15 10:06:50 · 450 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(7冯氏光照模型,法线矩阵)
缩放是均匀的,法线的方向将保持不变,长度会受影响,但很容易通过单位化修复,原创 2024-06-13 00:04:22 · 1108 阅读 · 0 评论 -
OpenGL3.3_C++_Windows(15理解glad)
定义在glad,c中,extern在glad.h中,按照下面的转化,这样我们就可以在代码中才可以用 gl开头 的函数了。typedef本质定义新的类型,否则仅定义函数指针,新类型 + pfun;函数指针定义:返回类型(*函数名pfun)(参数表) ,函数指针指向函数在内存中的首地址。如何调用:*解引用获取实际的函数,为函数传实参,fun(x);typedef 定义别名,pfun类型为void(*)(void)如何赋值:定义普通函数,为pfun赋值,因此指向了函数的地址,、原创 2024-06-22 17:40:29 · 1231 阅读 · 0 评论