OpenGL
文章平均质量分 53
ZJU_fish1996
这个作者很懒,什么都没留下…
展开
-
[OpenGL] 纹理高级篇 - flowmap的原理
flowmap简单来说就是一种特殊的uv纹理动画,我们把运动向量记录在纹理中,并让纹理uv向特定方向运动。 它的原理非常简单,但如果你直接将运动向量乘以时间,叠加到原始纹理坐标上,那么你不会得到正确的结果:vec2 motionvector = texture(flowmap, uv).xy * 2 - 1; // decode motion vectoruv = uv + time * motionvector;vec3 color = textu...原创 2021-03-20 17:47:08 · 6559 阅读 · 0 评论 -
[OpenGL] 使用计算着色器进行预烘焙
https://www.khronos.org/opengl/wiki/Compute_Shader 首先对官网内容的不完全翻译: 计算着色器不属于渲染管线的一部分,而是一个较为独立的过程。不同于顶点着色器对每顶点执行一次,片段着色器对光栅化的每片元执行一次,计算着色器的空间是抽象的,由用户自己定义的。 工作组 工作组是用户可...原创 2020-05-25 00:10:53 · 4318 阅读 · 0 评论 -
[OpenGL] 捏脸系统
本文的主要内容是介绍了一下自己验证捏脸系统一个方案的小实验。 很早之前便有捏脸系统的一个设想,但由于demo中没有引入动画系统所以一直没有来得及验证。捏脸系统一个美术工作量比较小的方案是基于骨骼动画的,我一开始的想法是,对于骨骼动画而言,既然绑定姿态(bindPose)能够反映不同的体型,那么它同样也能够反映不同的脸型。也就是说,我们需要实现一套运行时修改角色绑定姿态(脸部骨骼平移、旋转等)并能实时反馈修改,支持记录并读入修改数据,支持场景中同一体型中不同角色加载各自的捏脸原创 2020-05-17 17:03:34 · 6854 阅读 · 1 评论 -
[OpenGL] 骨骼动画混合效果
本文主要讨论两个骨骼动画过渡时的混合效果。切换动作效果演示 在游戏中,动画往往被切分成多个片段(clip),通过组合拼接来构建最终的表现效果。为了确保切换动作时的平滑过渡,使得整体动作更加流畅,需要对前后动作通过插值进行混合。 概念引入 在讨论具体的混合计算之前,我想依然有必要明确一下整个动画系统体系的一些细节。 ...原创 2020-04-26 00:55:59 · 4393 阅读 · 0 评论 -
[OpenGL] 骨骼动画原理和实现(Qt)
本篇文章主要讨论骨骼动画的基本原理,以及动画的导入和绘制。概念引入 对于网格体而言有不少实现动画的方式。直接对顶点进行操作也就是顶点动画,适用于一些比较简单的植物摆动、水面波动效果。此外,还有在两个网格之间进行插值的morphing动画;但它们本质上都是对顶点进行操作。 而在某些情况下,我们认为某些区域的顶点具有关联性,并且希望能够对其整体进行...原创 2020-04-10 23:36:27 · 8959 阅读 · 5 评论 -
[OpenGL] SSAO效果
SSAO也就是屏幕空间的环境光遮蔽,是实时渲染中为了模拟环境光遮蔽效果采取的一种近似算法。它主要表现的是物体自遮挡部分产生的阴影,可以增加场景的明暗层次感。 这个效果我在一年前已经看过了相关资料,不过一直没有尝试实现。最近花了点时间模拟了一下,不过效果不算太好。此处只是分享一下我的实现。基本原理 上图来自real-time render...原创 2020-01-18 23:38:52 · 2650 阅读 · 0 评论 -
[OpenGL] 植被的动画和笔刷效果
资源来自Unreal商店植被的渲染 植被的模型是通过建模导入得到的,本身是由多个面片组成的。 整个植被包含了albedo贴图+法线贴图+mask贴图。 我们使用一张mask贴图来完成透明测试,丢弃额外的像素。同时,需要关闭背面剔除,避免移动视角后植被消失。默认渲染 透明测试渲染植被的动画 接下...原创 2020-01-04 00:25:43 · 1229 阅读 · 0 评论 -
[OpenGL] Cascade Shadowmap(层级阴影)
这几天花了点时间优化了一下阴影。 原本的阴影实现有一些比较严重的问题: 第一个是我使用了透视投影,再加上角度问题,导致阴影看起来存在近大远小的变形,不符合太阳光产生的阴影; 第二个是我的阴影贴图是在世界空间的固定位置生成的,且阴影贴图的大小是有限的,导致整个画面中,只有落在阴影贴图中的非常小的一部分物体能够产生阴影;如果扩大阴影...原创 2019-12-24 23:02:03 · 1230 阅读 · 0 评论 -
[OpenGL] 刷地形初版实现
最近做了刷地形的初版效果,由于近期较忙,所以就简单地说一下大致的方案。 本身刷地形的原理并不难,即在鼠标选择位置的一个范围内,通过指定的高度模板,以叠加的方式改变地形高度。画刷模板 在画刷模板这一块没有过多讲究,直接使用了高斯算子。 根据画刷大小生成不同大小的画刷算子。为了保证不同大小的画刷算子形状一致,此处限制了高斯函...原创 2019-11-11 22:50:36 · 820 阅读 · 0 评论 -
[OpenGL] Hatching 素描画效果
参考:http://hhoppe.com/proj/hatching/第一部分 : 论文概述里面包含了论文和演讲稿,接下来是对Real-Time hatching论文的一个概述: 主要的挑战: (1) 有限的实时计算 (2) 笔画之间帧的相干性 (3) 动态观察角度下控制笔画大小和密度 方法:...原创 2019-01-06 22:36:34 · 1234 阅读 · 1 评论 -
[OpenGL] 基于屏幕空间的轮廓线提取
概念引入 《Real-time Rendering》一书中介绍了多种轮廓线提取的方式,根据对比以及综合考虑,最终使用了图像空间的方法来实现实时提取轮廓。该方法需要先将场景中的物体信息先渲染到纹理中,对使用延迟渲染的框架非常友好,并且弊端也是多种轮廓线提取方法中比较少的,具体内容可以参照原书的NPR章节。方法概述 (1) 准备2个颜色缓冲区,1...原创 2019-01-13 18:16:27 · 3406 阅读 · 3 评论 -
[OpenGL] 延迟渲染 - 多个点光源
概念引入 在前向渲染中,如果场景中有N个物体,M个光源,那么我们就需要对于每个光源下,每个物体逐一绘制,这也就意味着我们需要绘制N * M次。这意味着光照计算除了会随着光的数量增加而增加复杂度,还会随着场景复杂度而变得更加耗时。因此,在使用前向渲染的游戏中,往往会小心翼翼地控制场景中的光源数量,来保证游戏帧率。 可以看出,由于我们需要对每个物体进行处理,而有些...原创 2019-01-27 15:12:47 · 1951 阅读 · 0 评论 -
[OpenGL] 动态积雪效果
默认动态生成积雪 对于游戏中模拟雪天而言,除了天上飘落的雪花外,我们通常还希望能够在一个现成的场景地图上,生成场景物体被积雪覆盖的效果。让美术为每个场景物件单独做雪效果的材质可以得到比较细腻的效果,但这会成倍地增加美术制作成本。一个比较的常见的思路是,直接将雪的贴图从上往下“叠加”到场景物体上,通过这样的方式,就能快速地让场景中的物体都被雪覆盖。 ...原创 2019-04-10 22:11:48 · 3092 阅读 · 2 评论 -
[OpenGL] shadow map - 改进 (1)
之所以叫改进(1),是因为之后可能会有2,3之类的。 相比起之前比较粗糙的版本,本篇改进的内容包含: (1) 阴影贴图支持随着窗口缩放变化大小 (2) 提升了阴影精度,使用浮点纹理 (3) 使用percentage-closer filtering,减少边缘锯齿 (4) 修正一些计算不准...原创 2019-01-03 20:46:09 · 810 阅读 · 0 评论 -
[OpenGL] 纹理高级篇 - 纹理uv动画 水面篇
资源说明 首先说明一点,这个demo的最终效果和选用的反射/折射贴图关系比较大,因为这个水的颜色是直接从环境采样得到的。这里我偷懒还是用了这个广为流传的天空盒(也就是从learning opengl 立方体贴图这里偷来的),其实并不是很合适,因为这个立方体贴图底面是水,实际水的底面应该是沙泥之类的,也就相当于我们透过水面看到水底的沙石、水里的鱼。 然后水的法...原创 2018-12-23 11:54:25 · 5035 阅读 · 1 评论 -
[OpenGL] 纹理高级篇 - 视差贴图
本文是贴图系统的续篇,上一篇为法线贴图https://blog.csdn.net/ZJU_fish1996/article/details/83934059 图源来自unreal的自带材质包里的new brick系列,可见https://api.unrealengine.com/CHN/Engine/Rendering/Materials/HowTo/BumpO...原创 2018-12-16 19:29:10 · 1655 阅读 · 0 评论 -
[OpenGL] 基本相机移动旋转控制
前言 首先吐槽一下学校的计算机图形学课程是以OGL入门的,以至于早期的代码积累都是在OGL上的,直到最近才克服自己的惰性,开始计划升级自己的技术栈。在此期间也认真考虑过要不要升级到DirectX11,花了几个月大致扫完了一本相关的书,但目前看到dx接口命名风格依旧有着浓厚的win32气息就动力不足:),所以打算先把步子迈的小一点,先把OGL升级到高版本的OpenGL,以免自己对图...原创 2018-12-02 20:02:01 · 5552 阅读 · 2 评论 -
[OpenGL] 使用折射与反射的玻璃球
本次demo绘制了一个球体,包含了反射以及折射效果,两者通过菲涅尔公式进行混合。这篇文章主要是记录一下个人的实现细节,有一些细节的实现步骤还不是非常确定,还在查证中,所以此篇仅供参考。上面两图中折射取值不同。 框架:Qt 5.11, OpenGL ES 2.0球体绘制 首先,为了更好的表现效果,此demo需要绘制一个球体。如果使用了...原创 2018-11-24 23:55:23 · 3520 阅读 · 0 评论 -
[OpenGL] Billboard公告牌技术
billboard技术是一个相对简单,而在3D游戏中又比较常用的技术。由于自己也在不少地方需要涉及到,花了点时间做了一版billboard的功能。在这篇文章中大致描述一下自己的实现细节。概念引入 简单来说,billboard就是使用平面(面片)进行渲染,且使其始终朝向摄像机的一种技术。 可以看出,billboard和相机的transform属...原创 2018-11-14 17:55:06 · 4220 阅读 · 0 评论 -
[OpenGL] 太阳镜头光晕效果
太阳镜头光晕效果展示。光晕的贴图是随便画的多边形,如果替换成比较好的贴图效果会更真实,本文主要介绍原理。(框架:OpenGL + Qt) 基本原理 在屏幕上用一张面片绘制太阳和光晕,使其始终朝向镜头,且大小不随深度变化而变化。 光晕分布在太阳位置和镜头(屏幕)中心的连线上,且仅在太阳出现在镜头中时,绘制光晕。 ...原创 2019-02-03 23:33:31 · 2321 阅读 · 0 评论 -
[OpenGL] 延迟贴花效果
集成到编辑器的效果 框架:Qt + OpenGL 这个话题网上的资料并不是很多,这里主要参考的是书籍《Game Engine Gems》(游戏引擎精粹)第一部里的Chapter20 ”A Deferred Decal Rendering Technique“,也就是我的这篇翻译https://bl...原创 2019-02-10 14:43:23 · 4240 阅读 · 4 评论 -
[OpenGL] 体积光效果实现
reference:Volumetric Light Effects in Killzone: Shadow Fall [1]Interactive Rendering Method for Displaying Shafts of Light [2]游戏开发相关实时渲染技术之体积光 [3]本文包含的内容: 1.体积光介绍 2.使用Ray-match实现最基本的体积...原创 2019-02-23 14:12:25 · 6770 阅读 · 3 评论 -
[OpenGL] 基于纹理绘制的透明精灵(透明纹理)
在二维游戏中,我们几乎绕不开精灵绘制这一过程,除了直接在opengl读入图像并绘制外,我们更常使用纹理来完成这一过程,把纹理贴到在xy平面上的面片,做出二维游戏的效果。 这样我们可以很方便的使用opengl提供给我们的一些方法来执行精灵的变换,而不是使用大量的贴图来手工完成变换过程;同时,还可以通过调节深度信息来确定物体的遮挡关系,而不用花心思考虑绘制的先后顺序,因为我们知道,在原创 2016-07-11 02:39:55 · 10968 阅读 · 2 评论 -
[OpenGL] 延迟渲染下的简单透明渲染机制
reference:http://www.klayge.org/wiki/index.php/%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93 本文主要描述了自己实现延迟渲染下的透明物体渲染机制的过程。方案探索 前提是已经实现了基本的延迟渲染框架,但还没有支持透明物体的渲染。最近打算开始进行这一项工作。 目前接触到的一个比...原创 2019-10-10 20:32:07 · 2641 阅读 · 1 评论 -
[OpenGL] 曲面细分特性实践
参考资料:https://www.nvidia.cn/object/tessellation_cn.htmlhttps://www.opengl.org/wiki/Tessellation背景 首先曲面细分顾名思义是将一个面片划分为更多面片,使得模型更加精细。此处我们讨论的曲面细分更偏向于运行时的细分生成,而不是在建模软件中的离线细分。 这一过程是可...原创 2019-08-24 21:25:52 · 1571 阅读 · 3 评论 -
[OpenGL] 使用Assimp导入模型(Qt)
最近终于决定要在自己的demo中加入模型了!本次选择的是开源库Assimp,之前一直嫌麻烦没有去落实这件事,但实际上,assimp的配置意外的没有我想象中的那么麻烦。 参考这篇文章基本上可以配置成功https://learnopengl.com/Model-Loading/Assimp,它所提到的坑我都遇到了。 这里是Assimp下载地址:http:/...原创 2019-05-12 19:48:22 · 4957 阅读 · 10 评论 -
[OpenGL] 体积云实现探索
这个云是可以调厚的,目前主要是采样的总步长不足所以比较薄,但当然会很卡,目前用的电脑没有显卡我就没有尝试截图了 5.5更新:换了台有显卡的电脑截了个动图 首先,从云的形状开始。由于云的形状是不规则的,在图形学中,为了模拟这种不规则,我们通常使用噪声来实现。 我们使用两种不同的噪声来模拟云的形状——w...原创 2019-05-01 14:27:05 · 5584 阅读 · 2 评论 -
[OpenGL] Bloom自发光效果
之前在看Unreal的材质时,发现里面有一个自发光效果(unreal自发光),就暂且猜测它使用bloom后期处理做的吧。不过它这个自发光还能照亮周围场景,估计这套照亮的系统和自发光的泛光效果是独立的,只是将其作为了一个物体光源。基本思路 首先,本处要做的是对单个物体控制自发光效果,而不是一个全屏泛光效果,所以我们需要做一些特...原创 2019-05-02 23:24:21 · 3301 阅读 · 0 评论 -
[OpenGL] 屏幕空间反射效果
概念引入 屏幕空间反射又称SSR,是SS系列算法之一。该算法基于延迟渲染,也就是说,在动手实现SSR前,需要具备延迟渲染相关的知识,主要包括:G-Buffer相关信息的写入,根据G-Buffer还原出位置、视线向量、法线等一系列信息等。 算法本身的原理非常简单,也就是对于屏幕空间上的物体的每个像素,根据该像素对应的法线和视线信息,求解出反射向...原创 2019-04-04 21:59:26 · 9858 阅读 · 6 评论 -
[OpenGL] HDR效果测试
引入 在刚开始接触着色器语言时,我就考虑过这样的问题: (1) 场景中如果有多个光源,它们对物体颜色的贡献应该以怎样的方式叠加在一起? (2) 如果所有光源贡献的总和超过了1,颜色强弱细节将会丢失,呈现单一的白色。应用程序有没有办法避免这种现象? 实际上,(1)的答案本身应该非常简单,那就是直接将所有光源的贡献(算上当前位...原创 2019-03-10 16:48:11 · 1449 阅读 · 0 评论 -
[OpenGL] 根据深度图重建世界坐标的两种方式
这个计算是比较常用的,写延迟渲染demo的文章已经做过一次推导,这里再单独拿出来介绍一下。方法一:使用透视变换后的非线性深度 经过透视变换,我们将得到非线性深度。这个深度实际上是一个伪深度,因为透视变换后的深度是一个定值,处于近裁剪面处,为了存储这么一个定值浪费一个8位的空间是没有必要的。所以该深度是为作它用特别存储的一个非线性深度。 由于...原创 2019-02-14 01:03:02 · 4171 阅读 · 2 评论 -
[OpenGL] 纹理高级篇 - 法线贴图
概念引入 对于三维渲染中的物体而言,出色的光影渲染往往能够给画面带来质的飞跃提升。由光照方程可见,物体表面的法线对于最终的光照计算结果起着重要的作用,而物体的表面的顶点/面数则对光照没有太大的影响——这为我们的一个想法提供了可能性,也就是说,我们可不可以通过高模来获取法线,然后用低模渲染物体,并把高模的法线应用到物体上。此时,经过光照计算,呈现在我们眼前的就是...原创 2018-11-11 19:26:06 · 2788 阅读 · 2 评论 -
[OpenGL] Shadow Map 阴影
图:随着键盘控制点光源位置移动,阴影发生实时的变换 之前在 https://blog.csdn.net/ZJU_fish1996/article/details/51932954 一文中已经介绍了shadow map的基本原理,至今为止,它依旧是在游戏开发中运用较(最?)广的一种阴影技术。本文是自己花了周末...原创 2018-10-21 17:20:47 · 798 阅读 · 0 评论 -
[OpenGL] 桌子的平移、旋转和缩放
1)绘制立方体 考虑分别绘制六个面,先把每个正方形的坐标点存储在数组中,然后再利用循环完成绘制。(这样的绘制模式使一条边被绘制了两次,有一些优化的方法,为了逻辑更清晰没有进行优化) 在三维笛卡尔坐标系中,一个立方体可由三个顶点坐标唯一确定,一共是9个值。考虑到这里的立方体每条边都是与坐标轴平行的,简化后只需传入6个值。 由此,原创 2016-03-24 22:20:14 · 4317 阅读 · 0 评论 -
[OpenGL] 斯坦福兔子与显示列表
1.调整桌子的大小。 在OpenGL绘制长方体,可以通过函数: glutSolidCube(Size) 绘制得到的是一个正方体,再利用缩放矩阵使其变成长方体,使得桌子的大小刚好可以放下16只兔子。 2.兔子的增多减少 使用一个全局变量rabbitNum来记录兔子的数量。 在键盘回调函原创 2016-04-21 19:32:23 · 5276 阅读 · 0 评论 -
[OpenGL] 茶壶与光照
OpenGL可以设置至少8种光源,它们的标号为GL_LIGHT0,GL_LIGHT1,GL_LIGHT2……。在这里我们使用了两种光源,一种是环境光,另一种是聚光灯。 在设置光照时,我们需要考虑这样三种光:环境反射光、镜面反射光、漫反射光。在Phong光照模型中,就是通过这三种分量的取值来模拟真实光照的。其中,环境反射光是光源多次反射后的光,可以理解为背景光,镜面反射和漫反射反映原创 2016-05-10 18:55:21 · 10758 阅读 · 1 评论 -
[OpenGL]茶壶与纹理
纹理1 纹理2 混合纹理解析明天给出。// glutEx1.cpp : 定义控制原创 2016-05-15 22:14:40 · 13186 阅读 · 2 评论 -
[OpenGL] 兔子与顶点数组、拾取
普通模式顶点数组模式显示列表模式解析之后贴出。// glutEx1.cpp : 定义控制台应用程序的入口点。//#include #include #include #include "glut.h"float fTranslate;float fRotate = 156.5f;float fScale = 1.0f; // set i原创 2016-05-16 15:36:58 · 2739 阅读 · 0 评论 -
[OpenGL]基于AABB包围盒的漫游时视点与场景的碰撞检测
在不少游戏中,我们都可能会出现这样的场景,我们在一个建筑内行走,这个建筑有房间也有走廊,这时候在漫游中就有这样一个要求:人不能穿墙。当人物不被绘制而是以人物视野来代替时,这个问题就抽象为漫游时视点与场景碰撞检测的问题,可以看出它和标准的碰撞检测是有区别的,一般的碰撞检测问题考虑的是两个包围盒是否存在交,而在这里我们把可以把问题变得更容易,判断视线与包围盒是否存在交,如果存在,进行怎样的修补保证不穿原创 2016-07-10 03:20:42 · 9105 阅读 · 0 评论 -
[OpenGL] Simple Bump mapping(简单凹凸纹理映射)
reference:原文地址code:下载源代码注:这份代码年代比较久远了,直接跑会提示各种未定义标识符,经过查阅发现这些都是glew中的。如果想要通过编译,首先需要配置并include glew.h。我用网上下的glew.h库编译这个代码,发现总是链接错误,所以后来我从原作者的shadow mapping中拷贝了一份glee.h通过了编译(这是一个简化版的glew库),最终通过了编译。此...翻译 2016-08-21 22:48:17 · 5985 阅读 · 1 评论