首页 > 其他分享 >从零开始游戏开发——3.4 片断处理

从零开始游戏开发——3.4 片断处理

时间:2022-09-18 16:25:21浏览次数:96  
标签:返回 equal 参考值 3.4 从零开始 测试 缓冲区 片断 模板

  在光栅阶段,除了要通过片断着色程序(OpenGL叫法)着色外,还需要进行裁剪测试、Alpha测试、模板测试、深度测试、混合操作,这些操作在OpenGL、D3D、Vulkan等操作顺序不尽相同,在软件渲染器,片断着色程序是渲染管线的瓶颈所在,因此这里的光栅化之后流程如下,这里的橙色部分任意一条执行失败,都不会继续执行后面操作。

  裁剪测试:用来表示绘制过程定义的一个矩形区域,只有位于这个区域内的像素才会被最终绘制。

  模板测试:模板测试用到了模板缓冲区,可以实现各种特效,有些阴影算法会用到模板。模板缓冲区可进行读写操作,使用启用测试时,首先设定一个参考值和Mask值,在模板测试阶段对当前像素模板缓冲区中的值与Mask按位与后和设置的参考值进行比较,得到比较结果后对模板缓冲区当前像素值执行一些操作,比较结果通过时,继续执行下个阶段。这里的比较操作包含:

    never:比较结果总是返回false。

    always:比较结果总是返回true。

    equal:模板值与参考值相等返回true,否则返回false。

    not equal:模板值与参考值不等返回true,否则返回false。

    less than:模板值小于参考值返回true,否则返回false。

    less or equal:模板值小于等于参考值返回true,否则返回false。

    greater than:模板值大于参考值返回true,否则返回false。

    greater or equal:模板值大于等于参考值返回true,否则返回false。

 对模板值的操作分为三种情况,分别为模板测试不同过,深度测试不通过和模板测试与深度测试均通过。针对这三种情况,模板值可进行以下操作:

    zero:将模板缓冲区的值置为0。

    keep:保持当前模板缓冲区中的数值不变。

    replace:参考值替换模板缓冲区中的值。

    invert:模板缓冲区的值按位取反。

    increment:当前模板缓冲区的值小于最大模板值,则模板值加1。

    decrement:当前模板缓冲区的值大于0,则模板值减1。

   深度测试:深度测试用到了深度缓冲区,即zbuffer。在光栅化时得到的当前待绘制点的1/z值与缓冲区中的值进行比较,如果通过测试,则写深度值,并继续执行下一个操作,这里比较操作与上面模板比较操作相同。这里所以是1/z,是因为前面提到通过透视投影后,z值遇到到[-1,1]区间是非线性的,如果使用z值进行深度测试,将造成摄像机远处的很大范围深度值映射于很小的范围内,从而导致精度缺失,从1/z是线性的,储存1/z则可以解决这个问题。

  Alpha测试:当前像素Alpha值与设置的值进行比较,只有满足比较结果的才进行下一个阶段,Alpha测试通过条件通栏包括never、always、equal、not equal、less than、 less than or equal、greater than、greater or equal。

  混合:最终颜色值将与FrameBuffer中的颜色值进行混合,计算公式为:finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue,sourceValue是上个阶段计算出的颜色值,destinationValue是帧缓存中的颜色值,sourceFactor和destinationFactor为混合因子,其代表的值有如下几种:

    One:1

    Zero:0

    SrcColor:源RGB的值

    SrcAlpha:源A值

    DstColor:目标RGB值

    DstAlpha:目标A值

    OneMinusSrcColor:(1,1,1) - SrcColor

    OneMinusSrcAlpha:1- SrcAlpha

    OneMinusDstColor:(1,1,1) - DstColor

    OneMinusDstAlpha:1 - DstAlpha

operation可以有以下几种:

    Add:源结果+目标结果

    Sub:源结果-目标结果

    RevSub:目标结果-源结果

  经过以上几个操作,颜色值就可以写入的Framebufer中了。

标签:返回,equal,参考值,3.4,从零开始,测试,缓冲区,片断,模板
From: https://www.cnblogs.com/primarycode/p/16704604.html

相关文章

  • 从零开始配置vim(24)——自动补全
    neovim自带的代码补全的效果并不好,而且它分为好多类,如果需要人为的去判断使用路径补全、使用当前buffer中的单词补全、亦或者使用include来进行补全,那样使用起来就很不方......
  • 13.1 反射 13.2selenium键盘事件13.3文件上传13.4滚动条操作 13.5鼠标事件13.6验证码
    13.1反射#什么是反射?#如果有一个变量名,是字符串的数据类型,你能获取到这个变量的值吗?#反射方法:classStudent:def__init__(self):self.name='张三'......
  • 从零开始搭建gitea代码管理平台
    Gitea,一款极易搭建的Git自助服务。如其名,Gitwithacupoftea。跨平台的开源服务,支持Linux、Windows、macOS和ARM平台。配置要求低,甚至可以运行在树莓派上。搭建之前,首......
  • 从零开始配置vim(23)——lsp基础配置
    上一章,我们初步认识了lsp,并且对nvim-treesitter插件进行了配置,为编辑器提供了代码着色、自动格式化以及增量选中功能。算是初步体验了lsp的相关功能。从这篇开始我们通过......
  • jsp大文件上传解决方案支持分片断点上传
    ​前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对Http协议较模糊,故这次采用渐进的方式来学习文件上传的原......
  • 从零开始配置vim(21)——lsp简介与treesitter 配置
    截止到上一篇文章,我们配置了neovim的很多内容了。具备了一些编辑器的常用功能了,而且可以胜任日常的文档编辑工作了。但是想作为一个可靠的代码编辑器还缺少重要的一环,即代......
  • 从零开始的数据科学——免费
    从零开始的数据科学——免费我鼓起勇气报告了我作为数据科学家的所有发展,我认为这是一种发展自己并从数据科学家社区获得一些反馈的方式。我第一次接触数据是在Fit理工学......
  • 信息学一本通 1312:【例3.4】昆虫繁殖
    时间限制:1000ms      内存限制:65536KB提交数:30159   通过数:15099【题目描述】科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很......
  • 从零开始学python必看,“Python编程三剑客”,你值得拥有
    从0开始学Python,就问你一句:慌不慌?   第一本:《Python编程:从入门到实践》   第二本:《Python编程快速上手-让繁琐工作自动化》   第三本:《《Python极客......
  • 从零开始配置vim(21)——会话管理
    很多代码编辑器都有这么一个功能,重新进入编辑器之后能恢复上次打开的所有文件,窗口布局,有的甚至是上次设置的一些配置。那么vim是否也可以实现这样的功能呢?答案是肯定的。使......