自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 games101--shading 2

着色1中我们主要知晓了漫反射的定义和实现今天需要学的内容如下纹理映射和重心坐标也包括在其中在上一节课中我们已经知道了漫反射独立于视觉射线,和看的位置没有关系。

2024-07-10 16:35:52 921

原创 Games101——光珊化——深度缓存——shading着色 1

如何解决远近的问题,能正确的覆盖按照画作来说,先画出远处的物体,再画出近处的物体,近处会将其覆盖,这种算法叫做画家算法但事实上,排序不仅要花更多的时间,而且排序并不容易,而且如果存在互相遮挡关系存在的情况下,画家算法就无法实现为了解决这个问题,现代图形学所使用的都是深度缓存的算法,我们最后要做到的是基于每一个像素,我们存下每一个位置最前的那个像素,生成深度图,每一次计算的时候,我们会同时生成一个结果图和一个深度图。

2024-07-09 16:53:06 787

原创 计算机图形学games101——MVP

首先记得一个知识点在旋转矩阵中,旋转矩阵的逆矩阵就是旋转矩阵的转置,这个矩阵是正交矩阵我们需要做到的就是观测变换,这个变换包括视图变换和投影变换(投影变换包含正交变换和透视变换)首先复习一下三维变换,三维变换在二维变换的基础上添加一个维度,首先我们在之前的学习中可以了解到,物体的旋转和缩放都可以通过一个矩阵来表示,但是位移比较特殊,如果我们需要完整的描述一个物体在空间内的变换,就需要做到仿射变换+位移变换。

2024-07-03 15:48:25 871

原创 太极图形课——渲染——光线追踪实战第二部分

现在我们有了采样的方法,但是我们还可以做的更好,我们使用的是蒙特卡洛方法,目的是为了不断地逼近我们的数值解,也就是期望,我们采样的期望是什么,采样期望是每一个光线的颜色和亮度(亮度和角度有关),我们也可以认为每条光线都没有衰减,但我们采到每条光线的概率会随着角度而变化,采到的最亮的也就是法线方向的比较多,采到的最暗的最少,这两种方法期望是相同的,但计算却简单一些。这样的原因是因为,一个球体被展开的时候,两级上的图像会被放大,这样的话采样并不均匀,那么我们应该怎么去平均的在球体上采样呢,有一个标准的答案。

2024-06-25 15:10:42 318

原创 太极图形课——渲染——光线追踪实战第一部分

那么我们如何把这样一条射线放进我们所定义的虚拟世界中呢,首先需要设定的就是在这个虚拟世界中我们眼睛(摄像机)的位置,这个位置通过三维世界的坐标一个三维的数组就可以表达了,第二就是定义我们看的方向,也就是方向向量,也通过一个三维的数组表达。通过fov可以求出屏幕的半宽和半长,宽由长决定,取决于你需要几比几的屏幕,例如16:9,有了这些我们设定一个以屏幕中心为原点的坐标系uvw,最后可以确定眼睛或者说摄像机左下角出发的点,并确定其水平和垂直的向量。由于像素是一个方块,我们还可以把这个射线正好移动到点的中心。

2024-06-04 22:14:53 490

原创 太极图形学——渲染——光线追踪概念部分

光线是射线,有起点,有方向,当这个方向指向我们的眼睛,或者说摄像头的时候,我么可以获取光线所附带的信息,当我们在做假设的时候,认为光线是走直线的,并且光和光之间没有碰撞和交互,且最重要的是,假设光线是可逆的,可以通过光线找到光源,为什么可逆最重要,因为我们可以通过眼睛(摄像机)射出去的光线找到光源,并让其提供信息。如果有镜面反射,应该怎么解决,我们的目的是追踪从眼睛出发的光线。人眼所看到的是一个亮度和颜色的叠加,事实上,这两个方块的颜色是一样的,但是亮度不一样,因此着色有两个部分:一个是颜色,一个是亮度。

2024-05-28 15:58:48 710

原创 计算机图形学入门games103——碰撞检测

那么如果是运动的话,只要根据运动轨迹,将轨迹上的小区域都存进去就可以了,这样的问题是存储量太大了,而且事先我并不知道要存入多少三角形,而且有大量的可能是空的 这个解决方法就是先存入序列,然后再根据小区域的顺序进行排序,这样可优化内存,对每一个区域存入一个开始和结束的位置,我需要知道几号区域有三角形,直接访问几号区域的开始指针就可以了。对于有体积的物体来说,如果有相交,把物体推出去就可以了,例如之前球和布料的模拟,或者那个弹性体的模拟。

2024-05-23 18:47:31 614

原创 太极图形学——程序动画

在做每一个程序动画的开始,codebase,也是分为四个步骤,初始化,设置数据(像素),渲染画布,gui实现可视化,在太极中的实现步骤如下。引入柏林噪声,创造了一个既保有随机性,同时又具有局部连续性的东西,和白噪声不同,整体随机但是局部连续,生成这种噪声并不复杂。图形学的基础是编程,在此基础上又有了三种需要学习的分支,分别是程序动画,渲染和仿真,这也就是为什么图形学难以入门的原因。在画布上最小的单元认为是像素,每一个像素填充上不同的颜色就可以认为是程序动画的简单实现。这个画圆的方式就是一个简单的分型。

2024-05-22 13:40:18 184

原创 计算机图形学games103——非线性优化

现在做有限元的paper重点就在于优化,例如几万个四面体如何去做实时模拟(手术训练器所需要的)模型上的创新点已经不太多了,更加重点优化的就剩下了效率问题和准确性的提升在效率优化方面就有比较重要的非线性优化问题,所谓的非线性优化问题,就是我们如何取得函数的最小值例如,梯度下降法(机器学习)梯度下降法的思想很简单,就是如何计算点的梯度,梯度代表了该点最快上升的方向,我减去这个方向那就是最快下降的位置,反复多次迭代后,逼近最小值。

2024-05-21 16:19:13 253

原创 算法入门——二叉树——相同的树

该方法中输入为两个数类型的指针,那么也可以假设,递归后每次输入的也是两个指针,我们每次需要比较的就是这两个指针的状态以及这两个指针指向的值是否一样,指针的状态是为了防止越界。第二步 两指针一个为空,因为上一步已经判断了都为空,此时指针状态只剩下一个为空和都不为空,因此直接判断两指针不都为非空( || ) 返回false。完成了这些判断后,我们需要做的就是如何改变每次输入的指针,指针的移动有左右两个方向,因此需要分两次重复调用。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

2024-05-20 20:23:06 202

原创 太极图形学——性能调优——Debugging

确保debug模式开启,当debug模式开启后会检查所有的断言,可以抛出数组越界等错误,或者人为的定义一些断言,再就是assert中不要放任何有关于计算的部分,因为这会在release版本中被省略。不损耗性能的print,可以得到一些维度信息等等,只在编译的时候运行一次,用来检查一些常量是不是对的。运行工程出的打印,打印的顺序是不一定的,打印是非常消耗性能的,因此只有在debug的时候才会使用。在python中,打印有很多种语法,但在太极核中,支持的比较少。在课程中的太极不支持断点调优的功能。

2024-05-20 15:25:51 270

原创 算法入门——二叉树——二叉树的最大深度

所谓递归函数是指重复在函数中调用自身,在这个例子中,就是重复调用了这个找寻最大深度的函数,那么对于这样的函数,理解上最重要的就是入口和出口,入口就是输入的root这个二叉树结构,也就是输入进来的节点的指针,出口需要自己设计,这里设计的出口就是第一句吗,当节点为空指针的时候,函数递归结束,假设有这么一个二叉树。二叉树的基本结构为一个节点,以及这个节点的左指针和右指针,即一个节点和最多两个子节点的结构。返回 3,表示从根节点到最远叶子节点的最长路径上的节点数。是指从根节点到最远叶子节点的最长路径上的节点数。

2024-05-18 21:18:56 246

原创 计算机图形学games103——作业lab3——有限元弹性体

接下来进行判断,若是距离小于0,说明碰撞发生了,碰撞发生后我们计算法向的速度分量,再做判断,若是法向的速度也是小于0.就说明物体继续往下,此时我们计算法向的速度向量和切向的速度向量,法线速度的变化由恢复系数决定,切向的权重则由恢复系数,摩擦系数决定,最终还要做一个比较,都计算完后相加赋值新的速度。第一步 创建一个3维向量的数组,这个数组存储是三角形的顶点位置信息,每一个四面体有四个三角面,每一个三角面有3各顶点,所以这个数组一共是12倍的四面体数量,再定义一个整型用以追踪已经添加的顶点数量。

2024-05-16 15:18:49 529

原创 算法入门——堆栈——简化路径

第二步 对字符串流进行处理,使用‘/’作为分隔符,若是在此期间,temp等于“”或者“.”说明没有要处理的,若是为“..”进入第三步,若是其它情况进入第四步,结束循环后进入第五步。任意多个连续的斜杠(即,第一步,定义三个变量,分别是一个栈stack,一个字符串流ss,一个临时字符串temp。这个题目需要掌握堆栈的特点,同时也需要对怎么处理字符串流有一定的了解。第六步当栈不为空时,链接字符串,注意先出来的是路径后面的。开头),请你将其转化为更加简洁的规范路径。对于此问题,任何其他格式的点(例如,

2024-05-15 21:57:22 248

原创 算法入门——链表——环形链表

指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。

2024-05-15 21:16:58 204

原创 太极图形学——性能优化——稀疏矩阵

一个求解器会分为三块来使用,首先是定义求解器,例如实例代码中选择的求解方式是将矩阵分解为一个下三角矩阵和它转置的乘积,第二步就是求解,再到第三步查看求解是否成功。现在在api中可以实现加减,矩阵的乘法(与矩阵,与矩阵逐项乘积),A@B是矩阵乘法包括向量,最后还实现了矩阵转置和元素访问。所以我们应该用的是下一个时刻的温度进行传导,那么此时我们可以得出的就是一个线性求解的问题。目前只支持cpu的计算,效率也不太高,更多的是用来作为一个验证想法的正确性。我们使用的是显式积分方式来传播温度的。

2024-05-15 12:25:31 396

原创 计算机图形学入门games103——有限元材料

我们可以认为P是形变矩阵的一个函数,(P是第一皮耶尔应力,而在之前的模拟中P是通过Green strain计算出来的,而Green strain是一个关于F形变矩阵的一个函数)将F做一个SVD可以得到两个旋转和一个缩放的形变,旋转—拉伸—旋转,将旋转拉出去,应力主要基于拉伸这部分,也就是拉伸矩阵,基于此根据一些数学力学公式,我们将P用三个量表示。所谓各向同性材料,就是对一种材料来说,从各个方向对他所施加的力,所造成的形变效果是一样的。其中绿色部分是用来抵抗拉伸的,蓝色部分是为了阻止体积的改变。

2024-05-14 12:23:54 149

原创 计算机图形学入门games103——fvm体积有限元

那么怎么得到应力stress呢,注意这个应力和我们上一次所使用的应力是不一样的,在这里的解释是,之前我们在线性有限元中,能量是能量密度和面积的乘积,能量密度和strain的函数,而这个面积是原面积(reference),这个条件下我们所计算出的矩阵Stress是在reference条件下的。这些计算的选择逻辑是选择对计算最友好的方式,本质上几种应力的所做的工作都是映射,最后计算出的力都是等价的。在三维的情况下,计算的原理是一样的,就是多了一个维度,因此此时是对面的积分,转化后的公式也就如下。

2024-05-14 11:45:25 351

原创 算法入门——合并区间

第六步,判断当前的区间和结果中的最后一个区间是否有重合,有的话合并区间,更新最后一个区间的结束位置,若没有则到第七步。2.对于数据越界的检索,使用暴力法容易越界,因此应该记得方法back(),该方法用于取得最后一个区间。1.排序的这一部分,因为题目中并未按照区间起始位置进行排序。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。第三步 定义一个结果的合并区间merged。表示若干个区间的集合,其中单个区间为。第一步,判断数组是否为空,为空返回{}请你合并所有重叠的区间,并返回。第八步 输出结果数组。

2024-05-13 20:52:49 109

原创 太极图形学——高级数据结构——稀疏

这样的数据定义看起来很复杂,但其实从i和j就可以看出定义的结构,首先是一个2x3的矩阵,使用了pointer作为指针优化,然后是一个4x1的向量,定义了一个指针,指针指向的4x1向量中前两个用稠密结构,后两个用的是掩码。在还未写入任何数据的时候,该结构都没激活,只要写入第一个数据,那么首先会激活pointer,然后这一整块指针指向的结构都会激活,也就是block2。这样做其实没有省下内存,但是有一个好处是,使用for访问的时候,如果一旦发现某一个cell没有激活,它就不会继续访问。

2024-05-13 18:27:34 261

原创 太极图形学——高级数据结构——稠密

例如上面这个例子,首先定义了shape之后,在写入数据时并行处理,若是四线程的GPU处理,每一个单位填完第一个数字后(这个数字是从内存中取过来的),还会预缓存一段相邻的数字,这样填后面的数字是直接从缓存中直接取得,访问自然也就变快了。在并行计算的框架下,在计算上花费的时间反而是少数,大量的时间都花在了数据获取(也就是访问内存)上面,这一点在之前的games103课程上也有简单的提及。root出发,挂载的是dense,dense描述的形状,在dense后面挂着的就是那个没定义shape 的field。

2024-05-13 16:30:21 448

原创 太极图形学——面向对象

其中有数据和方法,这个方法是单独的对这个对象的应用,做的是内部的数据处理。而面向对象的编程的是重点是你所声明的类是自带方法和内部的数据处理的。2.data 对数据进行处理,包括顶点,边,面的坐标和索引。这样做的意义在于此时我们就可以在类定义成员变量的时候定义场。3.computation 取出数据后对数据的运算。这样做还有的好处就是写成不同的py文件,提高可读性。同时在定义方法的时候可以使用计算核的修饰符了。继承的关系以及多态和python中是一样的。这种过程可以认为是面向过程的编程DOP。

2024-05-13 14:17:57 167

原创 计算机图形学入门——太极图形学元编程

我们要做的是生成,可以从物理出发也可以从规则出发,当然也可以从大数据出发(这样的话就涉及到深度学习的Gan网络)注意在ti.func中使用的话传递的是引用,也就是说在func中改变数据的值夜会改变源数据的值。有点像C++中的部分操作,和C++模板类似,在实例化的时候生成一个新的kernel。之后还有一个代码加速的部分,ti.static(),这都是给编译器给的代码。直观的解释就是:图像——计算机视觉的目的是输入图像理解其中的信息。什么是源编程——源编程的概念在编程之上。图形个图像是有很大的区别的。

2024-05-10 16:57:07 115 2

原创 计算机图形学入门Games103——线性有限元模型FEM

对于图形学中线性有限元模型的学习笔记

2024-05-10 11:17:49 295

原创 算法入门——同构字符串

不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。第五步 判断smap[s[i]]是否存在,若是再判断smap[s[i]]是否不等于th,若不等于return false若不存在第六步。第七步 判断tmap[t[i]]是否存在,若是再判断smap[t[i]]是否不等于sh,若不等于return false若不存在第八步。这是一个简单题目,我自己做的时候先是忽视了方向映射,同时再做的时候用了二次循环,虽然通过且效率还行但实际上单次循环即可解决问题。i<s.size();

2024-05-10 00:37:41 191

原创 算法入门——汇总区间

第四步 判断i+1是否已经到了nums.size()或者是否nums[i+1]!= nums[i]+1 若不是跳到第三步。第五步 判断start和i是否相等,若相等则为一个单数 将数字转为字符后推入result。的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于。第一步 定义一个列表,元素为string 一个整数指针 start。第六步 若不是证明为多数组将nums[start]"第二步 判断数组是否为空,若是直接输出result。"nums[i]推入result中。

2024-05-08 21:01:22 144

原创 计算机图形学入门GAMES103——布料模拟约束(PD方法)

如上图所示,对每一个边来说,也就是spring来说,我们通过约束得到新的位置,不直接使用,而是将其用来构造一个能量函数,由于新的位置差值肯定为原长(约束),方向肯定为边的方向,最后我们可以得到的是一个近似于弹簧的能量方程,也就是我们将新的位置这个变量作为了能量函数的一个中间结果,我们也就拥有了能量对x的一个二阶函数,根据这个能量求导我就能算出来力fi(其中有一个假设是新的位置x_i^new和x_i没有关系)回顾:Hessian矩阵,所谓的Hessian矩阵是是一个多变量函数的二阶偏导数构成的方阵。

2024-05-08 11:29:55 324

原创 算法入门——螺旋矩阵

第三步 定义变量,4个整数指针,分别指向顶top,底bottom,左边left,右边right。第七步 先判断左边是否还小于等于右边(right改变了)再从bottom从右到左。输入为一个矩阵vector<vector<int>> martix。第二步 判断是否为一个空的矩阵,若是,返回result(提高效率)第一步 定义变量,向量vector<int> result。第四步 当左边小于等于右边,上边小于下边,不满足跳到第九步。第九步,循环结束,return result。,返回矩阵中的所有元素。

2024-05-07 20:59:45 108 1

原创 算法入门——赎金信

+i)或者(char c :magzaine)两者性能消耗差不多,第二种容易看懂一些,循环中 charmap[magzine[i]]++或charmap[c]++;第四步,判断charmap[ransomNote[j]] == 0,若是则return flase结束,若不是则到第五步。第三步 for循环(intj=0;第四步 判断该字符ransomNote[j]在M中的个数是否为0,若是,执行第五步,不是执行第六步。第六步 删除该字符在M中的一个erase(M.find(ransomNote[j]))

2024-05-06 22:18:56 235

原创 计算机图形学入门Games103——约束,布料模拟(PBD) lab2

这个方法虽然容易,但是变形是和边的顺序是有关的,会有偏向性而且会影响收敛的速度,而且不管怎么做,总会有不收敛的边虽然这个方法叫做高斯-赛德尔方法,但事实上更像机器学习的梯度下降,只不过有方向。多弹簧(高斯—赛德尔方法),就是一根一根的处理这些弹簧,每处理一根,另外的也会变化,也就是需要不断迭代运算(方法很好理解,但名字很高大上。有稳定性的问题(大形变),模拟非线性的表现,可以在比较小的阶段使用物理模拟,在形变比较大的阶段使用约束限制,,解决锁死问题。此时,后面的约束只是用来保证模拟的稳定,解决抖动问题。

2024-05-06 13:58:06 491

原创 计算机图形学入门Games103——弹簧弯曲问题,锁死问题

3.最终的合力为0,因为所有弯曲的力为合力,u1+u2+u3+u4 = 0,说明u3和u4也是由两个法线向量线性组合构成(因为以此可以得出u3+u4是两个法向量的线性组合,u3-u4也是两个法向量的线性组合,所以u3和u4分别是两个法向量的线性组合)根据经典的欧拉定律,自由度为3+边界边(边缘上的边),(边=3*顶点-3-边界边,自由度= 变量-边,变量= 3*顶点)会造成自由度不够,边界上的边比较少,弹簧弹性很弱网格分辨率很低的时候,问题很明显。将弯曲力的问题分为了两个步骤,分别是力的方向和大小,

2024-05-06 11:49:17 287

原创 算法入门——有效的数独

第三步 取出矩阵中的值board[i][j],判断其是否为‘.'若不是则转为int n,并计算矩阵的指针,一共也是从0到8,若是,则跳到第五步(此时n未变)第一步,定义三个向量,向量中的元素为哈希表<int>,行row(9),列cols(9),3x3矩阵blocks(9)第四步,判断其是否在该行,该列,该矩阵出现过,若出现过,return false(循环结束)若不是跳转到下一步。输入为一个矩阵board,类型为vector<vector<char>>第五步 将n存入该行,该列,该矩阵的哈希表中。

2024-05-05 17:47:34 161 3

原创 算法入门——无重复字符的最长子串

第一步,定义变量,整数left为窗口左指针,整数n为字符串长度(可不定义),整数maxlength为子串最长长度,哈希表charmap(char,int)键值类型。第三步判断s[right]是否在哈希表里,若在则更新left将其跳转至charmap[s[right]]+1,也就是出现过的该字符的下一个位置。第四步 将s[right]存入哈希表中,charmap[s[right]] = right。第二步定义for循环(int right =0;,请你找出其中不含有重复字符的。

2024-05-04 20:12:10 186

原创 算法入门--滑动窗口判断最小子序列

第一步,定义变量,n为数组长度,minlength为子序列的最小长度初始化需要用一个很大的值,这里可以使用std::numeric_limits::max()方法取得int的最大值,整数left为数组左指针初始化为0,整数sum,窗口内值的和。第二步,定义for循环,初始化窗口右指针right为0,条件为right

2024-05-03 16:44:51 232 1

原创 算法入门—判断子序列

第二步,进入while循环,当两个指针的值小于字符串的长度时判断s的指针指向的字符和t指向的是否相等,若是相等,则s指针自增,不管是否相等t的指针每次循环都自增。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。第三步,循环结束后,判断s的指针和s的长度是否相等,若相等,说明其为字序列,输出true。第一步也是先定义两个指针,分别指向两个字符串的开头。使用双指针的办法可以达到目的,运行时间在0ms。输入为两个字符串s和t。

2024-05-02 23:20:59 169 1

原创 算法入门——验证回文串

第四步,比较两个字符数字,首先使用std::tolower()方法将字符统一转为小写字符,当这两个字符不相同时,直接return False。第一步,设定双指针,第一个指针指向字符串的开头,另一个指针指向字符串的结尾,字符串的长度可以通过size()方法获得。判断方法使用函数 std ::isalnum()函数,当指向的为一个字母或者数字,返回true。第三步,在循环语句中,左指针指向的数不是一个字母或者数字时时,左指针加一。第二步,判断语句,在左指针地址小于右指针地址时,循环语句开始。

2024-04-26 15:21:57 205

原创 STM32学习日志——定时器定时中断

基本定时器的结构十分简单那,主要有一个时基单元,基准频率进入预分频器PSC后被分频,得到一个新的频率,这个频率决定了CNT计时器计数的频率,当计数值到达自动重装计数器的值ARR的时候,产生中断信号(更新中断),这个信号通往NVIC,NVIC配置好后就可以得到CPU的响应了,或者产生更新事件,不触发中断,但是触发内部其它电路的工作(例如说主从模式DAC功能,这样就能节省软件资源,不需要通过中断来触发)STM32主要有三种类型的定时器,分别位高级定时器,通用计时器和基本定时器,其中用的最多的是通用计时器。

2023-12-13 16:16:35 176 1

原创 OpenGL学习日志————搭建绘画框架(初级)(高级)

其中大部分值都是固定的,在之后也不会进行修改,主要通过结构体进行赋值,定义灭一个像素在各个缓冲区所占据的比特数的大小,例如在颜色缓冲区中,rgb就占据了24个比特,每一个颜色一个字节的大小,这些配置完成后创建上下文,之后需要进行场景初始化(在这后会有相应的函数),之后对窗口刷新等操作(大部分为固定模板)至此初级的绘画框架就已经搭建完成了。返回当前文件的位置(由于文件时从首部到了尾部,ftell()所返回函数的位置表示指针到文件首部的距离)因此返回的就是文件的大小(单位为字节)框架的搭建也是差不多的。

2023-12-12 16:48:24 52

原创 OpenGL学习日志——矩阵操作

OpenGL的矩阵在操作之前需要选定操作的矩阵,可以认为是绑定了相应的矩阵之后,再写矩阵操作的命令才会作用在相应的矩阵上,现阶段,OpenGl涉及到的矩阵主要有投影矩阵,这是在写各种操作之前需要设定的矩阵,决定了Fov,画布的宽高比,以及最近和最远能看到的距离,设定完成之后切换到模型视口矩阵,该矩阵就可以对模型进行平移,旋转等操作,在绑定该矩阵后先压入一个单位矩阵。矩阵的压栈和出栈操作,若是想要达成对某一个图元绘制时的单独操作和多个矩阵混合操作需要用到矩阵的压栈和出栈操作。

2023-12-12 11:21:40 58

原创 OpenGL学习日志——基本图元的绘制

接下来就是基本图元的绘制,事实上这种绘制方式是一种传统的绘制方式,现如今一般通过着色器来绘制,而基本图元中,真正能用上的实际上只有三角形图元,因为计算机在处理三角形是既能在几何上保证其共面,同时也能保证性能。颜色缓冲区全部重置为0,深度缓冲区重置为1(暂时用不上),缓冲区说白了也即是每个像素上的一堆数字而已,通过这些数字决定每个像素的呈现方式。glMatrixMode函数决定了你要操作的矩阵设置,当通过这个函数指定了矩阵后,之后对于矩阵操作的函数便只会作用于选定的函数。

2023-12-06 13:23:54 81 1

空空如也

空空如也

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

TA关注的人

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