自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(147)
  • 收藏
  • 关注

原创 Unity模糊后处理详解

在unity中各种模糊后处理的实现

2022-10-23 16:32:29 3968 1

原创 Unity3D Dither 抖动Shader实现

概述之前写过一篇去色shader,大致就是使用一种类似区间划分的方法来将原来图片所使用的颜色离散化,来达到一些特殊的视觉效果。使用之前那个shader,将颜色数量减少到两种的时候,效果如下,已经完全看不出原图是什么东西了。我们今天使用一种特殊的dither抖动 shader,来实现只用两种颜色但依然能保证一定的图片细节的效果。先看看效果,下图只使用了纯黑或者纯白两种效果,虽然依旧很模糊,但效果比上面那张图要好的太多了。可能有人不相信这张图只使用了两种颜色的(我一开始也没有相信),我们这里截取局

2021-10-04 15:53:27 3051 1

原创 Unity3D 去色Shader实现

一般为了达到一些特殊的渲染效果会降低纹理所使用的颜色数量,不管是在后处理里实现还是对单个物体实现,思路都是差不多的。在unity里颜色值分量可以看成[0,1]的连续值,但是其实也只能取到256个值,因此可以直接把[0,1]的值无损的映射到256个格子里,然后再根据需要,对这256个格子进行一定的合并,例如[0,9]原来是10种颜色,现在用0代表的颜色代替。[10,19]用10这种颜色代替,依次类推。关键代码,_DiscreteLevel为需要用的颜色数量,我们这里使用向下取整,因此所有落在这个区间内的颜

2021-10-04 14:52:00 1374

原创 Unity3D 双面渲染Shader实现

概述在建模软件中可以为每个顶点设置法线,三个顶点可以组成一个三角面,三角面的法线是根据其顶点的法线插值而来,这个法线朝向就代表了这个平面的正面。而在现代大部分引擎和游戏中,会默认只显示平面的正面,即对每个三角面进行一次面法线和摄像机出射向量的点积,判断正负,如果当前平面是背面朝向摄像机,则不渲染该面片。Unity 的standard shader就是这样,我们只要创建一个平面就能看出这种效果。创建一个平面,默认此平面正面朝上。我们调整角度从下往上看,平面完全不渲染了。除了一个选中的什么都看不见(

2021-10-04 12:11:42 6955

原创 Unity3D TriPlanar三平面映射 Shader实现

TriPlanar是一种不需要uv的纹理贴图技术,国内好像没有标准的译名,这里暂时称为三平面映射。那为啥模型会没有uv呢。。这个很简单,有的可能就是单纯模型师忘了做,比如你去网上下模型之类的。不过TriPlanar最重要的用途还是跟程序化生成地形有关,程序化生成地形是比较难对顶点设置uv坐标的。有的人可能会觉得地形就是一个四边形嘛,从对角线设置[0,0]到[1,1]直接覆盖一张纹理不就好了吗,有一些古老的游戏确实是这么做的,甚至一些现代引擎的地形编辑工具都会默认这么做(比如unity),但是这种作法会在

2021-10-04 11:38:20 1942

原创 Unity3D 视差贴图(Parallax Mapping)Shader实现

概述视差贴图简单来说,就是和法线贴图功能类似的一种东西,但是他解决了某些情况下法线贴图可能会出现的一些视觉错误。先回忆一下法线贴图的作用,一般游戏开发中用的模型是先在建模软件中建一个高面数的精细模型,但是由于性能问题,这个模型不能直接导出在游戏中使用,所以需要导出一个优化过的低面数的模型。但是低面数模型的光照效果肯定没有高面数模型那么精细。一般光照效果都是依赖法线来计算,所以有人就想出了低面数的模型加上高面数模型的法线贴图,然后光照计算用的法线就用高面数模型的法线。这样就能达到高面数模型的光照效果了。

2021-09-15 00:11:12 2932 1

原创 Unity3D 2D水面倒影的实现

项目中需要加入一个水面倒影的效果,而我现在这个项目是2D的,2D的话倒影比3D要好做的多,只要用grabpass抓取屏幕,uv取反,加上一个偏移值,最后用一个三角函数对uv坐标进行偏移就好了效果如下(gif有点糊)参数面板完整代码Shader "LX/postDistortion"{ Properties { _Color ("Color", Color) = (1,1,1,1) _DistortionScale ("DistortionSc

2021-09-14 22:28:05 1564

原创 Unity3D 简单水面shader的实现

实现思路今天来实现一个简单的水面效果。水面的话主要是以下几个效果叠加1.水面的动态波浪效果,我们这里使用最简单的正弦波加上法线贴图来模拟。如果想要更精确的波动效果可以考虑使用Gerstner波2.不同水深颜色不同的效果,使用该顶点深度和顶点坐标的差值来计算深度,然后映射到颜色3.浪涌效果,还是根据顶点深度和顶点坐标的差值来计算深度,然后叠加上一层浪涌4.折射效果,用grabpass,采样之后进行偏移,最后叠加上去。代码实现首先是顶点位移函数,使用正弦函数代入顶点的x坐标和z坐标来算,因为这里写

2021-09-14 21:46:01 7958 3

原创 Unity3D 选中高亮效果shader的实现

实现思路平时我们可能觉得shader就是单纯用来进行渲染的,不会和逻辑代码产生什么交互,但是如果要做这种高亮的效果就需要使用代码来控制shader的显示了。所以物体选中高亮效果的实现其实就很简单,先写一个shader表现高亮效果,然后用另外一个代码文件来控制这个shader的参数就好了。代码实现高亮shader我们这边就简单写一个rim效果。我们这里把rim效果加在Emission上只是为了修改方便,如果原来已经有了一个shader,然后需要给这个shader添加高亮的效果,只要把这个最后算出来的

2021-09-13 23:12:30 4432 2

原创 Unity3D 肥皂泡shader的实现

实现思路今天来写一个肥皂泡的shader,虽然最后出来的结果不太像。。但是还是简单讲一下思路好了。一般写shader的话先从现实生活找找参考,肥皂泡的话首先形状不是标准的球形,而且在移动的过程中外形会改变,因此我们需要写一个顶点偏移函数。接着就是肥皂泡表面上的薄膜干涉效果,使得肥皂泡表面表现出来就是花花绿绿的。这种光学效果要真的靠计算光线去模拟的话不太现实,因此就用一张渐变贴图加上一张噪声图来模拟。然后就是很常见的rim效果,这个只用计算出来之后叠加上去就可以了。最后就是反射和折射,反射的话用表面

2021-09-13 22:50:00 1299

原创 Unity3D Tessellation曲面细分

实现思路回忆一下现实生活中的雪,在一个时间段内大致是从一个方向吹的,面朝吹来方向的表面会被沾上雪,背向雪吹来方向的表面则不会被沾上雪。这样听起来就和光照的处理方式非常像,因此我们就大致用lambert光照的处理方式来处理雪覆盖的效果。指定一个方向作为雪的方向,计算顶点法线和雪方向的点积,作为混合因子,然后用该混合因子混合正常颜色和雪颜色,以及正常法线和雪的法线。代码实现在顶点着色器中最重要的就是保存了切线空间到世界空间的变换矩阵 o.ToW0 = float4(wor

2021-09-13 21:27:42 1730

原创 你知道Unity3D中一个cube有几个顶点吗?

本文的标题是一个疑问句,也是我之前学习过程中觉得挺值得思考的一个东西。如果你对unity3d了解不够深入的话,我想这个问题的答案肯定不像你想的那么简单。第一层有的人可能会觉得问题不是太简单了嘛。回忆一下数学里的立方体定义,一个立方体自然有且只有8个顶点。要是这么想,那你肯定只在第一层。想知道unity3d里的cube里有几个顶点吗?直接打开编辑器查看就可以了,当然不是在运行时查看stats窗口,因为即使是空场景也包含了很多隐形的顶点,大部分隐形顶点都属于场景外面用来贴天空盒子的一个包围盒。正确的查看

2021-05-31 20:57:45 2107 7

原创 Unity3D Mesh类的使用以及网格地形生成

三角面片的生成一般来说我们开发中对mesh类的接触并不多,mesh类可以让你在unity3d里动态生成一个网格,一般用在地形或者建筑生成,或者是一些建模或者优化插件中。这里简要介绍一下mesh类的用法。要生成一个可以正常显示的mesh需要以下几步。1.设置该网格所有的顶点位置(局部坐标)2.设置每个顶点属于哪个三角形3.如果需要接受到光照,需要设置每个顶点的法线4.如果需要贴材质,需要正确设置uv我们先以一个三角形为例首先new一个mesh类,然后创建一个三维向量数组,最后赋值。1.设置

2021-05-31 20:13:29 3859 2

原创 Unity3D FBM噪声算法代码实现

FBMNoise噪声算法FBM是Fractal Brownian Motion的简写,中文翻译为分形布朗运动。FBMNoise是将其他噪声算法用不同的参数输入叠加起来得到的噪声。其可以平滑噪声里的高频区域(即突变区域),使整个噪声变化更平滑。下图展示了FBM的基本形式,简单来说就是将多个不同频率的噪声按照不同的振幅进行混合。代码实现代码非常简单,这里以perlinNoise柏林噪声为例。只要在perlinNoise的原始文件中加入这样一个函数即可 public static f

2021-05-31 19:29:28 1376 1

原创 Unity3D Worley噪声算法代码实现

Worley Noise噪声算法Worley噪声的算法过程如下。首先需要创建一个2D’网格’,'网格’由’格子’构成,这里的’格子’并不是对应单个像素的,而是一个’格子’里包含有许多个像素。(如图所示的一个格子,一个格子由9个像素组成,而’网格’由无数个这种’格子’组成,一个格子由多少像素组成对最后的效果有很大影响)1.每个格子会关联一个随机生成的点,这里称为特征点。这个点必须在格子内部。2.对于每个像素,计算离它最近的特征点的距离,作为该像素的灰度值。那么如何找到离该像素最近的特征点是哪个呢

2021-05-31 19:11:46 845

原创 Unity3D Value噪声算法代码实现

噪声算法上一期我们讲了最经典的perlinNoise算法的实现其实漏讲了一点就是噪声算法的一些规则。虽然并没有很严格的规定,但噪声算法大致都要符合以下几点,才能说是一个’有用的’,看上去’正确’的噪声算法。1.无论使用什么随机算法,都要保证在同样的输入时获取同样的输出。(即用同样的种子可以得到同样的结果,这也是为什么很多依赖地形生成的游戏中有’种子’一说)2.无论输入值是几维,返回值为一维类型3.噪声需要具有连续性,如有参数连续性和几何连续性,这样噪声才不会看上去乱七八糟毫无逻辑可言。4.四方连

2021-05-31 12:42:05 666 1

原创 Unity3D Perlin噪声算法代码实现

Perlin噪声算法perlin噪声算法是比较有名的一种噪声算法,现在很多噪声算法几乎都是对原始perlin噪声进行改进的结果,而perlin噪声在游戏开发中也有许多用处,比如地形的生成,纹理材质的生成等等…perlin噪声的算法过程如下,我们以2D perlin噪声为例。首先需要创建一个2D’网格’,‘网格’由’格子’构成,这里的’格子’并不是对应单个像素的,而是一个’格子’里包含有许多个像素。(如图所示的一个格子,一个格子由9个像素组成,而’网格’由无数个这种’格子’组成,一个格子由多少像素组成

2021-04-21 21:57:33 1806 4

原创 Unity3D油画滤镜shader的实现

原图添加后处理效果后实现思路是对每一个像素点,采样它周围的四块矩形区域的均值,并选取各像素颜色分量色差最小的均值作为该像素点的颜色。从而既可以达到一种模糊效果,又可以对画面进行柔化。(中间的是像素着色器当前要执行的像素,每个像素需要采样1234四个区域)具体的计算过程是先计算该像素点周围四块矩形每个矩形区域内的所有像素颜色的均值的平方,接着计算所有像素颜色的平方的均值。然后求差值,那么什么时候这两个值差距最小呢?大家可以列式计算一下,推导也比较复杂,结果就是这一块区域内每个像素的颜色互相更接近

2021-04-17 18:15:14 1311 1

原创 Unity3D像素化滤镜shader的实现

实现思路像素化就是使许多相邻像素都变成一个像素,自然看上去就会有像素化的效果了。根据这个思路,马上可以想到一种做法就是将屏幕分成若干个区域,每个区域由若干个相邻的像素组成,每个区域都是一个正方形,然后计算正方形的卷积作为这个区域的颜色。这种做法会稍微麻烦一些,今天我们写的这个shader单纯采样了这个区域里的一个像素代表这整个区域的颜色。可能听上去有些不靠谱,但是实际看起来还是效果不错的,毕竟都是像素化效果了,有些误差说不定还会更好看一些。代码实现编写一个函数传入uv返回颜色,我们这个先把uv转

2021-04-17 15:38:29 2106 2

原创 Unity3D 旧电视滤镜shader的实现

实现思路既然是要实现旧电视的后处理效果,那么只要回忆一下那些古旧的电视的显示效果然后进行模拟就可以了。1.首先那种大头电视一般屏幕有一些曲率,并不是完全的一个平面,而且一般是向外凸起,这种凸起会造成中间的显示区域会比原来更近一些,边缘的显示区域会比原来更远一些。这种效果我们直接用简单的二次函数来实现。2.那种老旧电视会有不断运动的噪声,我们直接使用噪声函数加上时间变量来实现。3.屏幕上会有一些条纹效果,这种周期性的条纹效果一般用三角函数来实现。当然不可能模拟的完全准确。。也没有完全准确一说。毕竟每

2021-04-17 11:15:18 1400 3

原创 Unity3D漫画纸张后处理shader的实现

实现思路大致思路就是在屏幕空间对亮度值进行采样映射,将亮度值离散化为若干个区域,之后对应成不同的颜色,之后还需要再进行一遍处理,让画面有一种呈现在特殊漫画纸上的效果,比如网点纸。有一个要点就是亮度值如何计算,我们都知道漫反射光照模型可以得出亮度值,有一些非真实感渲染就是使用这个值来进行离散化处理的。如Unity shader卡通化着色器的实现但是我们这里需要注意的是屏幕空间对亮度值获取和用漫反射光照模型获取亮度值,两者出来的效果是完全不同的。根据漫反射光照模型获取某个顶点的亮度值,是不考虑贴在这个

2021-04-16 17:05:04 1415

原创 Unity shader bloom效果的实现

实现思路首先提取一张图像的亮度,进行模糊之后(高斯模糊或者其他模糊方法),覆盖到原图上。因此需要好几个pass来实现,一个pass提取亮度,两个pass进行高斯模糊,最后一个pass混合两张图。代码实现提取亮度就把像素亮度和阈值比较,高于阈值则提取,低于阈值设为0。 fixed4 fragExtractBright(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uvMain);

2021-04-14 21:29:48 499 1

原创 Unity shade高斯模糊的实现

实现思路模糊效果分为很多类型,如均值模糊,高斯模糊等等,模糊效果的实现都是对每一个像素,取它附近的一些像素,进行一些平均化的操作。因此每个像素和附近像素的差异就变小了,整个图也就变模糊了。高斯模糊的做法是用二维正态分布,来计算每个每个像素应该占用的权值。而二维正态分布可以分成两个一维正态分布来计算。代码实现按思路实现即可,我们这里取横竖各五个像素来计算高斯模糊,当然也可以取更多的像素,只要根据正态分布函数计算出对应权值即可。因为正态分布是一个偶函数所以我们这里也只用声明半边的权值。注意这里权值的总

2021-04-14 20:56:36 488

原创 Unity3D边缘检测滤镜shader实现

实现思路在屏幕空间下怎么判断一个像素点是边缘点呢?可以回想一下边缘点的特征,即边缘点附近一般亮度变化大。比如一个物体内部和背景的亮度,在边缘处一般会有肉眼可见的突变,我们只要检测出这种变化就能检测出边缘了。检测方法就是取这个像素周围的一些像素,计算他们的亮度值之后进行比对,如果周围像素亮度值差异大,则判断为边缘,这也就是俗称的‘卷积’。当然在屏幕空间进行边缘检测总会有不准确的地方,这个是无法避免的。代码实现最重要的就是计算一个像素当前梯度值的函数了,这个梯度值就代表该像素附近像素的亮度变化,越大就代

2021-04-14 11:15:15 472

原创 Unity3D简单体积光的实现

实现思路为了实现一个简单的体积光效果,我们直接把模型背面的顶点按照光照方向挤出一定距离,再按照距离对颜色进行插值,就可以实现简单的体积光效果代码实现首先体积光是一个半透明效果,所以关闭深度写入,打开混合。在顶点着色器中判断顶点是不是背面,这里直接用光线方向和法线点积,如果小于0就是背面。这里点积小于0我们设置为1,是为了接下来进行挤出,1代表需要进行挤出的意思。float3 toLight = ObjSpaceLightDir(v.vertex);float extrude = dot(toL

2021-04-12 19:49:20 1809 1

原创 Unity3D简单体积雾的shader实现

体积雾普通雾的实现是在每个着色器(例如unity 的stanard着色器)中都添加一段雾的代码,然后根据顶点离摄像机的距离来覆盖一层颜色达到一种雾的效果。而体积雾是一个有体积的雾,其本身是一个对象,在场景的中空区域也可以有雾的效果。两者主要区别如下:1.普通雾需要更改所有的着色器,而体积雾只用为体积雾对象写一个着色器。2.普通雾可以看成是一层纹理贴在场景的物体上,而体积雾本身具有体积,在普通雾覆盖不到的地方(比如没有任何物体的空场景),也可以添加雾的效果。实现思路用来生成体积雾的模型一般都是简单

2021-04-12 14:49:58 3944 6

原创 Unity3D消融效果shader实现

实现思路消融效果首先需要一张噪声图,噪声图可以用一些软件来生成例如ps,也可以自己写噪声算法来生成。获得噪声图之后,在shader中对噪声纹理的亮度值进行采样,丢弃小于阈值的片元。还需要添加一些补充效果,例如表现烧焦的边缘之类的,这也可以通过一个亮度的比较再加上插值来完成。噪声图简单起见,我们直接使用PS来生成,打开PS的工具栏。滤镜->渲染->分层云彩。之后再添加图层进行一些调色,得到我们使用的噪声图。如果想要自己来生成噪声图,也可以查阅perlin噪声算法相关的资料。clip

2021-04-10 18:38:33 614

原创 Unity3D卡通效果的shader实现

卡通着色器的实现一般是描边加上一张渐变贴图对顶点亮度值进行离散化,按照此思路我们在unity shader里来进行实现。描边在shader里对模型进行描边有好几种思路。第一种是使用屏幕后处理,用一个卷积来查找物体边缘部分并进行描边着色,不过效果并不好,在只能得到图像数据的情况下又需要进行描边才这样处理。如果可以直接得到模型数据,当然是直接用模型数据进行处理。用模型数据进行描边也有好多种思路,例如获取摄像机法线纹理对相邻顶点的法线进行点积,角度超过阈值就判断为边缘部分。我们这里还是用最简单的一种方式

2021-04-10 18:00:30 1170

原创 C#委托和事件的区别

区别委托事件是否可以使用=来赋值是否是否可以在类外部进行调用是否是否是一个类型是否

2021-02-21 23:21:13 249

原创 unity shader渐变纹理卡通化着色效果

有时纹理贴图的作用不仅仅是给模型贴上一层“外衣”,一些其他的效果也可以使用贴图来完成,比如使用渐变纹理来使物体有一定的卡通化效果。回想一下看过的一些动画就可以知道,动画里人物的绘制的明暗区域的过渡非常直接,如下图,可以看到几乎不是纯黑就是纯白。那么我们也可以在unity shader中实现大致的效果,主要思路就是制作一张渐变纹理。然后使用phong光照模型中的漫反射公式,即法线点乘光照方向,来得到一点的亮度信息。此时如果直接使用此亮度信息,就会得到一个过渡十分均匀的效果,那么为了得到动画中几乎没有明

2021-02-18 12:53:25 633 1

原创 unity shader法线贴图实现凹凸映射效果

法线贴图法线贴图是一张保存了物体法线信息的纹理,可以用来细化模型的光照效果。例如一块石头表面坑坑洼洼的,如果全部用建模实现,需要非常多的顶点数和面数才能完成。但是做一个简单的模型,比如表面平整的一块石头,然后使用法线贴图来重设顶点的法线,在远处观看也能得到相当接近的渲染效果。同时只需要简单模型的顶点数和面数,提高了帧率,所以法线贴图其实可以看成是在模型面数和帧率之间妥协的产物。那么知道了法线贴图就是保存了物体法线信息的纹理,法线贴图从哪里来呢?首先3D软件中一般都可以在模型上生成法线贴图,此时用到的

2021-02-17 23:23:34 1653

原创 unity shader实现纹理贴图

unity实现纹理贴图很简单,首先在appdata结构体里声明uv语义,就可以获得当前顶点的uv坐标,对外部导入的模型来说。这个uv坐标是在3d模型软件例如maya中制作模型的人预先设定好的。我们只需要把他获取过来就行了。 struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };既然需要纹理贴图,要么肯定要

2021-02-17 19:35:21 1626

原创 unity shader 实现blinn-phong光照模型

接着上一篇说上一篇 phong光照模型blinn-phong模型只改动了phong模型中的高光部分不使用光的反射方向而是引入一个新的变量,光照方向加上视角方向之后归一化。而计算高光也不是使用视角方向点乘光线反射方向,而是使用法线方向点乘这个新引入的变量完整代码如下Shader "Test/Blinn-Phong"{ Properties { _Color("Color",Color)=(1,1,1,1) _EmissiveColor("Emiss

2021-02-17 18:49:57 613

原创 unity shader 实现phong光照模型

phong光照模型phong光照模型是一个经验模型,并没有理论依据,只是说“看起来能像那么回事”。优点当然是计算量很小,因为所用的公式都很简单,而且基本只要知道一些简单的属性就可以计算,比如坐标啊,光源方向啊,法线啊、完全不用模拟单条光线的路径之类的。缺点就是比较粗糙,而且也没有办法模拟多次反射的效果。目前在游戏领域不是光线追踪比较火嘛,因为以前的硬件没有那么高的算力来做光线追踪,在光线追踪之前就是这个经验模型及其变体运用的最广了。phong光照模型把光线分为四个部分处理,分别是环境光,自发光,漫

2021-02-17 18:36:54 1438

原创 unity3d内存分析工具memory profiler

unity在2018.4之后的版本中新增了内存分析工具。虽然在之前的版本中也能在Profiler 中的memory模块中看到大致的内存使用情况,但是不能具体看到细节,诸如哪个纹理占用了多少内存。安装新的内存分析工具过程如下打开package manager,选择高级选项勾选show preview package,这个选项可以使用非稳定版的包,意思就是这个工具现在还没有正式发布,还在测试阶段。不过实际上使用起来没什么问题然后就可以搜索到memory profiler这个包,进行安装安装完成后

2021-02-17 16:15:24 2856 1

原创 unity3d编写缓动跟随摄像机

首先声明target为需要跟随的物体public Transform target;声明跟随距离,以及跟随距离的增长速度,使用鼠标滚轮可以拉伸镜头public float viewDistance = 8f;public float viewDistanceMoveSpeed = 1f;声明缓动系数public float springRatio = 0.05f;然后在LateUpdate函数里编写代码,因为摄像机追踪需要发生在物体移动后。首先鼠标滚轮可以拉伸镜头viewDistan

2021-02-17 15:06:43 1027

原创 unity3d编写2D缓动跟随摄像机

首先声明target为需要追踪的物体public Transform target;之后因为是缓动,肯定要声明一个移动速度和缓动系数public float moveSpeed=5;public float spring = 0.01f;因为是2D摄像机,所以一个轴是不需要动的,也不需要旋转操作。我们这里以俯视相机为例,此时相机从上往下看,旋转属性为然后在LateUpdate函数里编写代码,因为摄像机追踪需要发生在追踪物体移动后。我们这里是y轴不需要动,先算出和追踪物体的偏移 offs

2021-02-17 11:13:29 419 2

原创 opengl绘制三次贝塞尔曲线

上一篇上篇讲了三次hermite曲线,三次cardinal曲线的绘制,都需要用约束矩阵来求解曲线的系数,而贝塞尔曲线直接给出显式公式来绘制,只要给出几个控制点即可,贝塞尔曲线其实就是一种加权混合的多项式,随着参数值的增加,依次逼近几个控制点,和无穷级数有异曲同工之妙。贝塞尔曲线通过混合几个控制点的位置,来逼近控制点。贝塞尔曲线的公式为在参数曲线表示下表示形式为其中看起来很复杂,实际上不复杂。根据给出的公式可以推导出三阶贝塞尔曲线的公式为y(u),和z(u)也是同理根据该公式就可以

2021-01-29 23:50:48 1009

原创 opengl绘制三次hermite曲线,三次cardinal曲线

引言上篇上一篇绘制了最基础插值曲线,讲到除了插值经过给定点之外,还有别的约束条件。有时为了所得曲线在端点处具有给定的N阶导数,亦即所称的参数连续性条件和几何连续性条件,给约束矩阵添加了导数约束。hermite曲线就是一种经过控制点,且必须在控制点具有给定导数的插值曲线。以三次hermite曲线为例,上次说到三次曲线有四个系数,所以必须构造一个四阶方阵,因此,必须要有四个约束条件。三次hermite曲线的约束条件分别是两个点的位置,以及两点处的导数,这样一共凑出四个约束条件,可以唯一确定一条三次曲线

2021-01-29 23:27:29 1634

原创 opengl绘制二次,三次,四次插值曲线

引言因为涉及许多矩阵操作,自己写一个完善的矩阵类较为复杂,所以这里使用了c/c++环境下用的比较多的线性代数库eigen。配置过程如下公式的推导插值曲线就是给出若干个控制点及一些约束条件,构造出一条曲线来经过或者逼近这几个控制点,最简单的曲线形式就是多项式曲线,依据多项式内的各项的最高次数,依次分为二次曲线,三次曲线,四次曲线…最简单的插值曲线形式就是给出N+1个点,然后构造出一条N次曲线来依次经过这几个点,这几个点又称为控制点。这样马上就能产生一个问题,几个点如何确定一条曲线呢?至少需要多少个点

2021-01-29 22:25:44 2084 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除