- 博客(35)
- 收藏
- 关注
原创 学习笔记30——DirectX框架
咱们之前在写第一节程序框架的时候说了一点,就是我们会在以后把游戏相关的函数变量啥的给封装成一个类,这也就是咱们今天要做的事情。但是实际上封装的不是一个类,而是两个类,父子俩。为啥呢?因为咱们是为了有些代码的复用,就是在用DirectX进行写游戏程序的时候,有很多的操作无论在哪一个游戏程序中都是一样写的,所以咱们对于这些哪个游戏程序都一样的东西,封装到一个类中:D3DApp,以后每写一个程序都把这个直接复制拿过去用就行了。
2022-11-06 12:00:08 1494
原创 学习笔记29——程序框架篇
1、Win32程序首先教你用VS创建项目出来:1、你打开VS之后的页面右边点击 创建新项目2、选中Windows桌面向导,然后下一步3、填写好项目名称和位置,然后创建:4、这时候会有一个弹窗,你需要按照下图进行设置,点击确定5、 此时已经进入项目文件,咱们需要创建一个文件来写咱们的代码。这时候窗口内会有一个浮窗,解决方案资源管理器如果你没有这个东西,那么你可以:在最上方找到视图--点击里面的解决方案资源管理器然后就是:右键点击源文件---...
2022-11-06 11:28:13 912
原创 学习笔记28(凹凸贴图,法线贴图,位移贴图)
注意是顶点,像素是没办法偏移的,fragment出现的时候都是投影后的结果了,便宜肯定要在3D空间进行的,只能偏移后再投影,而投影之前没有fragment这一说,我们能够操控的就只有顶点,让顶点在3D空间下进行一个偏移。所以说想要实现真正的凹凸,就要使用displacement的贴图,而这个贴图的实现是对顶点进行一个位置的偏移,如果说顶点比较稀疏,那么这个顶点偏移也无法带来比较好的凹凸效果。几何着色器就是输入图元,然后自己基于输入的图元顶点,构建出新的顶点或者沿用原图元的顶点,最后组合出一个新的图元输出。
2022-11-05 13:34:02 1435 1
原创 学习笔记27
这块说了摄像机的uw轴和选择的up始终是在一个平面的,这个很好想明白,因为我们通过cross的第一个轴,他是垂直于up和w确定的平面的,那么第三个轴也必然在这个面内,因为他必然垂直另外俩轴的平面。关于反射方向的设计,这里有点不是很理解,因为这里的rec中记录的normal本身是一个经过判断选择后的,这个normal一定是和ray against的,所以说这个dot,好像一定是大于0的。有了这一点,其实就说明了,关于这个up轴的作用,我们通过调整他,就可以控制摄像机的轴所在的面。
2022-11-05 13:32:14 291
原创 学习笔记26
也就是第一次输出之后,第二次输出,并没有进入下一行,而是重新走到了当前行的第一个位置,那么再输出的时候就会把第一次输出的给盖上了。然后就是view port,这里viewport是场景中虚构的一个东西,用来做光追,最后会把他上边的像素计算得到的颜色映射到我们的屏幕上。当然有了一个点,我们有一个关于t表示点的,然后代入式子中,其实能够解出来t,就代表有交点,否则就没有交点。主要是问题出在下面,下面的make智能指针的时候,会创建该类型的对象,而这里参数传递的是虚基类类型,必然不能创建对象。
2022-11-05 13:31:10 137
原创 学习笔记25
(之前我们有一个疑问,就是什么时候decode,什么时候encode,从这里来看,他是和图片存储有关系的,如果说一个图片要求存储某一些格式,我们就要encode了,之前的那些包括裁剪和透明啊,我们也是去告诉它的,不同的只是,之前是约定好叫什么名字,然后他会去取出相应的值。对于fragment,这里需要输出两个,一个albedo 一个emission。注意上边的文档截图,单纯的shadowmask,静态物体是没有实时阴影的,只有烘焙阴影,注意和之前的那个bake indirect区分。
2022-11-05 13:29:54 250
原创 学习笔记24
第二个,主要思路是:先渲染前面,然后再把前面给cull了,剩下的back face,把这个back face 的网格给进行一个扩充,这样在这里啊交界地方就会出现描边了。然后这里使用到一个卷积,但是可能由于精度不够,对于内部一些描边可能不够,所以可以用它专门做外部的描边,就需要自定义深度,然后还有一些问题,说什么用取整解决。这里的衰减就是一个单纯的距离衰减,然后使用距离来采样贴图。那么我们也就只需要对着这个剪影的所有的顶点,搞到他们的ray,然后对于这个区域内部的所有像素的ray直接通过插值得到。
2022-11-05 13:28:02 167
原创 学习笔记23
现在雾气的种类基本上就是这三种,然后我们现在自己的shader放在有雾的环境下,还不能出现任何的朦胧效果,所以下面的任务就是让我们的shader来支持这一点。因为我们插值的来的向量,一定是从摄像机的位置为起点,远平面的fragment处为终点的一个向量,那么现在乘上depth,他是一个从0到1的范围。也就是世界空间中的距离,而且更牛逼的是,如果这里把得到的向量,去加上摄像机的世界坐标,得到的其实就是fragment在世界空间中的位置。这里只是忽略了近平面,而近平面就是用来做范围的裁剪的,
2022-11-05 13:25:58 552
原创 学习笔记22
采样dithering 的时候,屏幕坐标前的系数越小,说明屏幕就缩小,采样的分辨率就会小了,采样到的黑点就会变大。另外这里说:聚光灯和点光源去计算一部分的fragment,其实这个可以根据已经rendered 的几何,根据他们的深度信息啥的,可以做一个判断吧,但是这里面感觉有好多的问题,具体细节应该是如何执行的?其实渲染完几何,就相当于得到了一个建模软件中的模型的截图,首先是建模软件的,因为还没有着色,所以颜色就啥都行,然后就是截图,因为几何处理完,基本上投影啥的都做了,所以已经是一个2D的了。
2022-11-05 13:23:06 182
原创 学习笔记21
那么当我们对一个材质进行修改的时候,就比如把其中一个材质的opaque修改成cutout,那么C#里面就会有定义相应关键词的逻辑,那么这个材质对应效果就会发生相应的改动(如果我们shader里面写了相关的判断代码)。虽说现在我们还没有加入任何的半透明的代码,但是,当我们把模式切换成半透明渲染的时候,我们可以看到渲染的顺序以及draw call的名字都变了。之前的透明效果其实是不能够满足很多的半透明的需求的,而且他是base on fragment的,是binary 的,所以会有锯齿。
2022-11-05 13:20:43 243
原创 学习笔记20
这里就是考虑了一点:当我们的程序运行的时候,他每一帧都会去创建一次那个关键词,但是这完全没有必要,首先这个关键词他确实是会变的,当我们的材质面板中的贴图赋上去或者删除下来的时候,关键词都需要重新去定义,所以确切的来说,我们应该在map被编辑的时候才去修改这个值。这里不要太相信自己的眼睛,注意人家的数据存储到了哪一个通道里面,这里是因为存储到了alpha通道,在网页上有一个透明效果,所以下图中alpha为0的也就是黑色的部分,在上边是完全透明的,所以和网页背景颜色是一样的。比如凹陷下去的要比凸起的部分暗。
2022-10-31 00:41:05 123
原创 学习笔记19
如上,一个metallic球被一个柱子给挡住了,虽说是挡住了,但是我们的环境光来自各个方向,所以他只能挡住一部分,而我们这里考虑的是高光,也就是完整的镜面反射光,也就是说每一个点我们看到他的高光,他的入射光必须是指定方向的,如果说这个指定方向的光被挡住了,那么这个点的高光那确实会暗,否则就完全不受到影响。这部分超出范围的,他们计算的fragment是在外面,而且计算的最小时间是负数,所以他们采样的cubemap是整个盒子的下半部分,这里就是反射到的地面的东西而,而不是天空,所以这里效果就明显错误了。
2022-10-31 00:38:26 298
原创 学习笔记18
这里可以认为是光源从上往下,然后灰色的那些上表面就可以看作是距离光源最近的那些点,但其实不是点,是Texel,Texel是一个面积,这就有问题了,上边算是一个投影到2D的样子,我们看上边的面,他是有的直接stick in 或者through 或者out of surface的,也就是灰色的上表面那条线,有一部分在绿色外面,有一部分在绿色里面。也就是说如果是受到阴影的影响,阴影区域那的环境高光也应该变暗,但是它并不受到影响,而且由于和阴影之间有一个明暗的对比,反而显得更亮。
2022-10-31 00:35:04 430
原创 学习笔记17
一种就是我们的map他是高度图求的没错吧,他对一个倾斜的像素求的高度图,由于求的时候要求是Z轴朝上,但实际不一定是z轴朝上,所以我们构建一个局部空间,求出了这个法线。至于实际的切线空间是z轴上,xy和uv分别对齐,和这里说法有些不匹配啊,其实这就很简单解释了,如果我们学习高度图的时候,把上面的这个大地面,改成和xy面平行的,然后去得到一个凹凸不平的结果,这时候的算的方式就稍微改动一些,而按照这种算法,就是默认该面是和xy平面平行的,所以可以变换的时候让xy面和uv对应,z轴是朝上的那个。
2022-10-31 00:32:57 272
原创 学习笔记16
最简单的是一个球,就是r = C,这个函数,C是常数。我们根据θ和φ得到的r值,我们不把他当作距离,我们把距离统一取成一个数,比如都取1,这时候相当于是一个r = 1的球面,而我们在球面上每一个点内部存储r值,使用颜色存储,就得到了上边的这个只有黑白灰颜色的球。一个复杂的函数就好比是你要用积木搭起来的东西,比如一个房子,而基函数就是手中最基础的一些积木组件,积木组件的种类越多其实你搭建出来的结果就和你想要的结果越逼近,你想要一个房子,如果只有正方体,搭建出来肯定不如正方体+三棱锥等等配合搭建出来的。
2022-10-31 00:30:07 182
原创 学习笔记15
这里还有一个小的注意点,就是我们的深度写入要关闭,因为我们在第一个pass的时候,已经对这些物体渲染了一遍了,也就是他们的深度都已经写入到zbuffer中了,第二遍再渲染的时候,会重复进行一个深度判断,这里是会和zbuffer中的深度相等,然后就写入他的颜色,写入的同时还会写入深度缓冲区,但是这时候写入的值一定是和之前的一样的,所以完全没必要重写了,直接把深度写入关闭就行了。这时候xyz分量都是正数,都是输出直接白色的,sqrt之后的结果也是白色的,而且我还估计了他们的范围,然后他俩相除,直接就是0。
2022-10-31 00:29:10 444
原创 学习笔记14
还有一个问题就是近距离观察的时候,近距离观察的时候,纹素被放大,纹素放大了,我们像素的颜色值采用的是插值的方式,这么一插值会让最终的结果不再锯齿了,但是会带来模糊,而我们近处观看的时候本该是看到一些清晰的细节的,但是看到的确实模糊,这一点就有问题了。他这里介绍了一个函数,其实这个函数内部做的就是我们上边分析的那些,这里他会额外返回一个值,叫做1减反射率,其实这里成为反射率有些不太合理,首先反射率是物体的概念,不分镜面和漫反射,就是反射出去的能量和入射的能量的比值,或者是功率的比值,这是同理的。
2022-10-31 00:27:21 153
原创 学习笔记13
首先整个纹理本身是一个正方形,现在被wrap上去,投影上去之后,顶部其实是有挤压的,越靠顶部挤压越严重,这么一挤压,他就不再是线性的了,也就是UV之间的变化就不是线性的了,但是插值依旧是线性插值,所以对于一些边界,必然会有一些前前后后的误差,最终就导致上边弯曲的样子。这一句的意思应该是:我们的shader一般想要看看在目标平台上能否可行,需要build,为啥,因为shader你保存后的编译只是上边所说的面板中的编译的一种情况,而在build的时候是可能多平台的,而你的程序也可能想要测试的就是多平台。
2022-10-31 00:24:57 192
原创 学习笔记11HTML
首先这里的type不只一个,name="firstname",这个的意思是,就是我们输入之后,可能会有一个提交,提交会和后台的服务器进行交互,那么提交的东西就被存储在这个firstname中去和后台进行交互。注意这里有一个优先级的问题,body里面指定的优先级是比较低的,就是如果在指定body之后,又对某一块字体做了额外的指定,那么就会采用额外指定的颜色。注意这里,他偏移之后,他本来所占据的区域还是存在的,上边绝对的情况,他完全变成了浮动的,那本来的区域也没必要保留了,所以下面的直接就挤上来了。
2022-10-31 00:22:06 133
原创 学习笔记10屏幕坐标+光衰减
这里可以把变换到灯光空间下的坐标进行一个输出,然后我们移动灯光的位置他就有所变化,重点在于,我们把灯光中心放在物体上的时候,也就是x分量基本为0,他是黑色,而当我们把灯光的范围边界放在物体上的时候,他是白色。这个我们需要在参数列表中写上,然后UNITY_VPO_TYPE,这个是屏幕坐标的类型,其实就是一个float4,但是有时候是float2,因为这个是和平台有关系的,我们可以直接修改成float4,但是他在某些平台上可能是float2,所以官方给我们搞了一个宏来处理这两种情况。所以类型直接用他的宏即可。
2022-10-30 23:32:06 144
原创 学习笔记09C#
获取材质的时候,这里有俩,带s的是一个材质数组,有可能一个模型使用多个材质,注意是一个模型,之前我们的那个一个模型多材质其实是多个模型,组成一个整体,这里指的是一个模型,这时候一个模型多个材质,那么模型会被进行多次渲染,会有大的性能消耗。这里的yield就是类似让协程挂起暂停的意思,然后后边加上waitForSecond表示暂停多少秒,也可以有其他的选择,比如暂停到下一帧等等的,当后面的暂停所指定的时间结束之后,就会继续往下执行程序。这里UnityEngine是高亮的,是因为他被用到了,这里的Mono。
2022-10-30 23:29:27 165
原创 学习笔记08立方体纹理
首先正确的思路是有的:就是我们拿着物体模型空间,来进行计算,计算发射的R,但是这时候我们把他考虑成直线,然后换到世界空间下,再在世界空间的大立方体中找交点,交点就是我们的采样点。这里就是:我们虽然把最终的范围弄到了0到1,但是由于精度问题,这个1可能是1.001,这样超出了0到1的范围,所以就有了点误差,但是为啥是上边的误差,我也无从解释,但是实际情况是无伤大雅的,因为这些反射的本就是很远的东西,不考虑近处的东西,所以就算现实中发生变化,只要移动的距离不是非常大,其实反射的内容的变化还是比较小的。
2022-10-30 23:25:33 117
原创 学习笔记07渲染路径+阴影
然后就是采样shadowmap,我们这个UNITY_LIGHT_ATTENUAITON,之前光照衰减的时候是用的这个宏,这里也用的这个,其实他俩是被放在了一起,都可以认为是光的衰减,从它的实现上也可以看出来,这里就是算了一个阴影的结果,然后乘以应该是光照衰减的结果,作为最终的一个衰减,平行光不会衰减的时候,tex2D那一项估计就是1了。有时候由于视角变换等等的问题,会导致阴影没了,是由于缺少了前向渲染的pass表示,以后做光照相关的时候,一定声明这个,否则有些宏会有问题,会进入一些错误的分支。
2022-10-30 23:21:39 301
原创 学习笔记06GI
就是他们都是烘焙,结果基本上是一样的,只是烘焙的过程,采用的算法等等的可能不同,就比如渐进式烘焙,这个他是先烘焙你摄像机看到的部分,然后在其他,enlighten就有点不一样,但是对于我们来说。对于物体,要尽可能的小一些,极端情况,一个巨大的大地板,然后它吸哪三个小球,是由他的中心点决定的,中心点距离哪三个球最近,那么整个板子就被相同的光照亮,这也是不合理的,因为地板很远的一部分。所以把物体弄的小一些,无论哪一部分距离发光物体的距离都是差不多的,然后被照亮的强度相同,没有太大的问题。
2022-10-30 23:13:15 785
原创 学习笔记05PBR
那么这就是错的,shader输出的颜色自然也不是那么准确的,比如亮度在叠加的时候,可能会大于实际相加的亮度,0.5 + 0.5 > 1,这里的0.5和1是gamma0.45下的,如果在线性下本应该等于1,现在大于1,那就产生了过曝。在一个没有光的房子里,打第一盏灯,房间从暗变成亮的,这时候再打一盏相同的灯,房间会变亮,虽是相同的灯,但是变亮的程度却不如第一添加的时候变亮的程度大,也就是亮度并没有达到一盏灯时候的两倍。这里替换的时候,右边Aa,意思是考虑大小写,大小写不一致的不算。
2022-10-30 23:07:02 408
原创 学习笔记04
其实这里说的偏导,应该是:首先说函数,这里的函数自变量就是x和y,在左边图中,我们取一个像素周围像素,也就是x在发生变化,然后因变量就是u或者v,算是两个函数。我们看到颜色,感知到颜色,是因为光的存在,而光本身是波,是有能量的,而我们对光的描述,使用光波来完成的,但是如果对色彩也这么干,那就太不直观了。其实刚刚的XYZ,也是三个变量确定俩就确定了颜色,那么就变成二维的也就是上边的,然后缺少亮度,这里就又加了一个新的Y轴,作为亮度。这里的cross,叉乘的结果的模,几何意义是组成的平行四边形的面积。
2022-10-30 22:52:51 182
原创 学习笔记03
这里就是,先把立方体变大一些,然后绘制出来,绘制的时候写入模板值,然后绘制立方体的时候,只要他的模板值是描边的模板值就给他覆盖掉。透视除法完成之后,会到一个unit cube中,如果是超出这个范围的将要被裁剪。这里说的裁剪,CVV是视锥体裁剪,裁剪的对象是顶点,在之前的粗颗粒剔除,是对于整个物体进行的剔除。后处理,就是在得到最终的一帧图像之后,做一些图像处理,模糊,景深,高光等等。模型到世界,世界到观察,观察到投影或者裁剪,裁剪到NDC。世界变换,观察变换,投影变换,透视除法和裁剪。
2022-10-30 22:45:14 73
原创 学习笔记02
fall off 那个选项是光照衰减。Specular scale 这个是控制高光的,高光往往会带来一个白色的高光点或者高光区域,如果我们改成0的话,就不会有这个点或者区域出现了。这里要把它去掉的原因是,有些类型的光源,基本上不会产生什么高光点,比如聚光灯这种,所以这种类型的灯光就可以改成0。所以这个选项是根据光源类型来说的。这个可以修改阴影边缘部分是否sharp,但是修改的只是边缘是否sharp,区别不是很大。游戏中有很多的时候角色是一种灯光,场景是一种灯光,因为场景是静态的,角色动态的,开销啥的不一样,
2022-10-30 22:44:27 266 1
原创 学习笔记01
虽说在3dmax中把移动缩放组件放在中心了,但是他是有一个相对的,导出的时候直接导出模型,ue就认为模型是在世界中心的,所以在世界中心放一个移动缩放的组件,你这没有弄到中心,他把组件放在了中心。就出现上边的情况了额。当我们给这个原型房子加洞的时候,他是一个实心的,不好弄,我们可以改成上边的选项,这样就变成了纸片,没有厚度了,如果想要厚度,局部厚度,那可以用很多块去拼接,有的选带有厚度的即可。选中一个面之后的操作,pan,rotation,flip,scale表示的分别是,UV的偏移,旋转,翻转,缩放。
2022-10-30 22:37:33 1246
原创 Real-Time Rendering读书笔记——02
一、Chapter3——TheGraphicsProcessingUnit(一)Background(二)Data-ParallelArchitectures。
2022-07-16 16:01:52 169
原创 Real-Time Rendering读书笔记——01
1、what is "real-time rendering" ? ——not individual image, rather dynamic process.2、FPS & Hz 3、display rate & refresh rateA shutter that illuminates the frame three times has a 72 Hz refresh rate, which shows frames at 24 FPS.4、real-time rendering & i
2022-07-14 15:07:21 255
原创 【unity入门】——shader学习之路
Get ready for Unity Essentials - Unity Learn官方教程:打开模板之后,根据一些提示来操作:一、The tutorial in the unity (open it : tutorial--show tutorials)1、when you click on play, you will come into the game, and then you can press ESC key to show you mouse arrow, and at this tim
2022-06-18 11:49:14 1377
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人