欢迎光临散文网 会员登陆 & 注册

百人计划图形3.1——深度与模板测试

2023-08-29 00:47 作者:咽泣子  | 我要投稿



  1. 颜色缓冲区

  2. 模板缓冲区,我们会在模板缓冲区中给每个片元分配一个[0,255]之间的数值,8位,默认位0。

  3. 通过自定义的准则,上图展示了,模板缓冲区中片元为0,则不显示颜色缓冲区对应的片元;为1,则显示颜色缓冲区的片元。

模板测试在渲染管线的位置


在片元着色器结束,到帧缓存输出之间,有一个逐片元操作,有很多种测试。

Pixel Ownership Test :控制像素的使用权限。(只能在game窗口和scene窗口显示。其他位置都会被剔除掉)

Scissor Test :裁剪测试。(在game和scene窗口内,自己可以再次定义渲染范围)

Alpha Test :透明度测试。(设置一个透明度阈值,大于这个阈值就通过测试,相反小于就剔除)

Stencil Test :模板测试。

Depth Test :深度测试。

Blending :透明度混合。(实现半透明效果)

Dithering

Logic Op 


逻辑上理解模板测试
1模板缓存参考值和读掩码按位与
2比较
3模板缓冲值和读掩码按位与
通过一定条件来判断是对该片元或片元属性执行抛弃操作还是保留操作。

if(referenceValue & readMask comparisonFuction stencilBufferValue &readMask)

{

        通过像素

}

else

{

        剔除像素

}

3.从书面概念上理解

模板测试

说到模板测试,就要先说到模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值(通常的话是个8位整数)。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alphatest)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。


模板测试总结

·使用模板缓冲区最重要的两个值:当前模板缓冲值(stencilBufferValue)和模板参考值(referenceValue)

·模板测试主要就是对这两个值使用特定的比较操作:Never,Always,Less ,LEqual,Greater,Equal等等

·模板测试之后要对模板缓冲区的值(stencilBufferValue)进行更新操作,更新操作包括:Keep,Zero,Replace,IncrSat,DecrSat,Invert等等

·模板测试之后可以根据结果对模板缓冲区做不同的更新操作,比如模板测试成功操作Pass,模板测试失败操作Fail,深度测试失败操作ZFail,还有正对正面和背面精确更新操作PassBack,PassFront,FailBack等等


Z Test——深度测试

3.从书面概念上理解

深度测试

所谓深度测试,就是针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区,否则否则不会写入颜色缓冲

深度缓冲区(Z-Buffer)

深度缓冲就像颜色缓冲(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的

z-buffer中存储的是当前的深度信息,对于每个像素存储一个深度值

通过Z Write和Z Test来调用Z-Buffer,实现想要的渲染结果


Z Write

深度写入包括两种状态:ZWrite On与ZWrite Off

当我们开启深度写入的时候,物体被渲染时针对物体在屏幕(更准确地说是frame buffer)上每个像素的深度都写入到深度缓冲区;反之,如果是ZWrite Off,那么物体的深度就不会写入深度缓冲区。但是,物体是否会写入深度,除了ZWrite这个状态之外,更重要的是需要深度测试通过,也就是ZTest通过,如果ZTest都没通过,那么也就不会写入深度了


ZTest分为通过和不通过两种情况,ZWrite分为开启和关闭两种情况的话,一共就是四种情况:

1.深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;                                          2.深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;                                          3.深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;                                          4.深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区;

默认是ZWrite On和ZTest Lequal,深度缓存一开始为无穷大

作业以及各个效果相应demo后续补上

百人计划图形3.1——深度与模板测试的评论 (共 条)

分享到微博请遵守国家法律