浮点数
浮点数表示方法浮点数是用科学计数法来表示一个数字的,它的表示格式可以写成这样:
这种表示格式根据每个部分中不同的数据分成这四种类型:
IEEE754标准中的四种舍入模式
Round-to-even/Round-to-nearest(向偶数舍入/就近舍入)1234对于1.001_1001,舍入处理后为1.010(去掉多余的4位,加0.001)对于1.001_0111,舍入处理后为1.001(去掉多余的4位)对于-1.001_1000,舍入处理后为-1.010(去掉多余的4位,加0.001,因为此时最低位为1)对于-1.010_1000,舍入处理后为-1.010(直接去掉多余的4位,因为此时最低位为0)
所以对于需要取近似值时,需要查看舍去数据的高两位和舍去数据的上一位下面是将一个uint32_t的数字按照float格式转化为float,调试打印每个部分12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 ...
memory consistency model
背景cache coherence和memory consistency的区别这只是我个人的一点理解,cache coherence指的是多核处理器中每个核心的private cache line的数据的一致性,memory consistency指在多核处理器中,如果操作读写内存中的数据才能保证整个程序流程执行正确,而不会导致程序执行完,数据被随机修改,能产生很多不同的结果,维护程序正确执行而不产生随机记过的这个规则的模型被叫做memory consistency model,这个model贯穿了硬件编译器和程序员的程序开发,这是一套开发规则约定
message passing有一个经典的message passing例子,能反映mcm的存在意义,有两个线程分别在core0和core1上运行,两个线程都会读写x和y两个变量,x存储的是数据,y相当于一个flag,程序理想的执行顺序是,首先初始化x和y为0,core0上thread0将x修改为然后再置y这个flag变量为1,然后core1上的thread1读到flag y为1,也就是thread0已经修改完变量x的值,然后读变量x的值 ...
cache coherence
背景缓存一致性(cache coherence)是指在多核系统中不同缓存中的数据的一致性和同步性问题
这里有一个例子可以比较清晰的反应这个问题,如下图所示,在Time1时,core1的private cache读取了共享存储中的A值,此时A为42,在Time2时core2也读取了共享存储中的变量A的值,还是为42,接着在Time3时,core1将A的值从42增加为43,此时core2的private cache中A的值还是为42,这时就需要一个协议一种方法来维护private cache中变量,来防止在变量被修改时,其他private cache中的变量数据没有被及时更新
下图是cpu的多级缓存结构,在L0和L1cache之间会产生cache coherence的问题,之所以会产生这样的问题,是由于多核在读一个变量时,当中产生了一个或多个写操作,需要同步给其他core,显而易见的是,如果只存在都,不存在写,就不需要同步
cache到memory的数据更新关系从缓存和内存间的数据更新关系来看
写回(write back)对缓存的修改不会立刻传播到内存,只有在当前的cache line被 ...
cache replacement policy
概述背景
如何评价一个cache系统的performance
\begin{aligned}
CPU_{time}
&= IC * (Alu_{Ops} / Inst * CPI_{AluOps} + (MemOps / Inst) * AMAT) * CycleTime \\
&= IC * CPI * CycleTime
\end{aligned}
IC: Instruction count,需要执行指令的数量CPI: Cycles Per Instruction,每条指令执行的平均时长CycleTime: 芯片一个周期的时间,提高主频降低每个周期的时间
Average Memory Access Time(AMAT)
\begin{aligned}
AMAT
&= HitRate * HitTime + MissRate * MissPenalty \\
&= HitRate * HitTime_{inst} + MissRate_{inst} * MissPenalty_{inst} + HitTime_{data} + Miss ...
曲面细分着色器
概述曲面细分阶段是一种将低多边形模型模型动态细分为更多的三角形或面片的技术,用于生成更平滑和精细的几何形状
上面左图为曲面细分的效果,右图是直接将面分为了平面,并没有保持面与面之间的平滑,而曲面细分阶段实现的细分会自行实现平面之间平滑
曲面细分阶段主要由三个阶段组成,
曲面细分控制着色器(Tessellation Contorl Shader)
曲面细分生成器(Tessellation Primitive Generator)
曲面细分评估着色器(Tessellation Evalution Shader)
细分的流程:
vertex shader 将topo发送给TCS
tcs对patch中的点进行分析,然后根据硬件实现的算法进行细分,可增加或减少点
tcs将TL发送给TPG,然后TPG生成增加或减少的点,然后将点转发给tes
tes将生成的点融入到原始topo中,然后tes以point为单位发送给下一级shader
示例
vertex shader:
123456789#version 450layout (location = 0) in vec4 positi ...
几何着色器
概述几何着色器(Geometry Shader)是pipeline中的可选阶段,位于vertex shader和tcs和tes之后,在fragment shader之前,几何着色器用单个基元作为输入,然后输入零个或多个基元,所以理论上geometry shader阶段可以更改图元类型
示例
vertex shader
123456789101112131415#version 450layout(location = 0) in vec3 position;layout(location = 1) in vec3 in_color;layout(location = 2) in float in_point_size;layout(location = 0) out vec4 vout_color;layout(location = 1) out float vout_point_size;void main(){ gl_Position = vec4(position, 1.0); gl_PointSize = in_point_size; vout_col ...
cs1.6方框透视
概述这篇wiki介绍了怎么cs1.6的方框透视
涉及内容 Cheat Engine的使用 Visual Studio的使用 界面用Windows MFC绘制 方框用sdl2框架绘制 涉及一些MVP矩阵知识
实现步骤搜索矩阵
搜索mvp矩阵,mvp矩阵在其他文章中介绍,也可自行搜索相关文章附上我学习mvp矩阵的网页链接mvp矩阵学习链接
用狙击枪晃动,然后开镜关镜等操作搜索变动的数值以及用键盘Enter键来射击等枪静止搜索未变动的数值来定位mvp矩阵
根据观察mvp矩阵的特征可以大致观察找到的矩阵是否找对
代码实现
实现原理上图可以看出,我们自身的坐标,也就是输入的顶点坐标,通过公式
模型矩阵*观察矩阵*投影矩阵*转化到屏幕坐标矩阵*自身坐标=屏幕坐标计算出自身在屏幕的位置,同理我们用这些矩阵乘上敌人坐标就能计算出敌人在屏幕的位置
代码实现123456789101112131415161718192021222324252627282930for (uint32_t i = 1; i < players.size(); i++){ float ndc[ ...
植物大战僵尸自动启动恢复小推车
天气太热了,工地的砖头今天格外的烫手,白天在工地搬砖,工地对面的小卖部冰箱里的雪糕是我遥不可及的梦。晚上回家,没有空调的加持,风扇的风出啦也是热风,还是先讲今天的教程吧。
小推车触发条件,僵尸在小推车前面,说明小推车触发需要僵尸所在行数这个参数
一共有5、6个小推车,僵尸在哪行就会触发哪行的推车,所以小推车大概率存放在一个数组里面,数组的成员结构体存放的是小推车的状态
需要找到小推车function call
12345// 小推车的状态小推车消失并恢复 = 0小推车静止 = 1小推车运动 = 2小推车消失 = 3
首先寻找小推车的状态
在选择植物时,搜索未知的初始值
选择好植物,开始游戏后,看见小推车全部恢复后,搜索改变的数值
随意做一些动作,打开图鉴,等待僵尸出现,收集阳光,种植植物等,只要不发动小推车,就搜索未变动的数值,过滤掉其他不相关数据
让僵尸走到小推车前,触发小推车,让小推车发动,暂停游戏并搜索改变的数值
搜索一次变动的数值之后,因为小推车一直处于运动中,所以回到游戏,再暂停游戏我们都得搜所未变动的数值
因为保存小推车的状态这种数据肯定是小的数据,所以可以用 ...
vulkan变换与坐标系(翻译)
概述在光栅化过程之前,顶点位置和法线向量等几何数据通过Rasterization Pipeline顶点操作和图元操作进行变换
顶点操作包括模型变换、视图变换、投影变换
图元操作包括将点组成的图元、剔除、裁剪、屏幕投影
模型矩阵输入没有经过任何的变换顶点数据是物体的局部坐标,经过模型矩阵变换后,将物体从模型空间坐标转化为世界空间的坐标,矩阵中可以包含平移、缩放、旋转等变换
平移矩阵
\begin{pmatrix}
X \\
Y \\
Z \\
1 \\
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0 & d_x \\
0 & 1 & 0 & d_y \\
0 & 0 & 1 & d_z \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
*
\begin{pmatrix}
x_0 \\
y_0 \\
z_0 \\
1 \\
\end{pmatrix}等号左边表示为顶点的齐次坐标(x,y,z,1),是将等号右边的4*4矩阵为平移矩阵,是将(x0,y0,z0,1)进行平移变 ...
计算着色器
简介计算着色器的操作与其他光栅化的着色器截然不同,其他着色器大多又明确的输入输出数据,也有一些是用户自定义的变量,而计算着色器的工作方式与这些截然不同,计算着色器的计算空间单元很大程度上是抽象的,由用户自定义大小,而计算着色器的计算次数也由执行计算操作的函数定义,而计算着色器没有特定的输入输出数据的描述,只是由用户定义输入输出数据的位置,计算着色器可以处理计算任务或者是处理图像任务
输入输出变量类型
Storage Buffer:以缓冲的形式存储数据
Storage Texel Buffer:以缓冲的形式存储数据,以图像的形式访问数据
Storage Image:以图像的形式存储数据,其子资源图像布局必须为VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR或VK_IMAGE_LAYOUT_GENERAL
示例处理计算任务computer shader:12345678910111213141516#version 450layout(local_size_x = 32, local_size_y = 1, local_size_z = 1) in;layout ...