找回密码
 立即注册
查看: 714|回复: 0

[学术/精华文章] 简单粗暴的 shader 解释?

[复制链接]
发表于 2020-5-26 16:09 | 显示全部楼层 |阅读模式

Shader 是面向GPU 渲染编程的一种技术手段. 通常我们的程序是控制CPU 计算获得结果的. 而Shader 让我们可以干预GPU渲染结果. 比如给物体加阴影, 加投影, 加光线反射,镜面效果, 或者光线扭曲等效果.
比如正常情况下我们给节点设置贴图后, GPU帮我们原样输出到屏幕, 此时如果我们希望贴图能随时间进行水波一样的扭曲效果,此效果在很多游戏中都可见到, 比如一些捕鱼游戏的背景,看起来泪光鳞鳞. 那么我们就需要干预GPU的渲染. 人为控制GPU 对我们的贴图的每一个像素的输出效果. 控制过程可能是 对某些像素点亮度增强(高光/变暗), 某些像素点输出坐标改变(扭曲/旋转), 某些像素点隐藏等等. 这样就能实现仅需一张静态贴图就能实现动态的流光/熔岩等酷炫效果.

可以想像, 如果不借助Shader, 而又想实现放大招后的地面裂纹,熔岩, 或者闪电光效的话, 可能需要上百张细腻的帧动画才能表现出来. 但使用了Shader的话, 仅仅是一张或几张静态贴图进行混合运算,就能控制GPU 输出等效的表现内容.

GPU 就是最后输出到屏幕的一道过滤眼镜. 你给他贴上各种哈哈镜,或者有色镜, 他就能给你各种表现.

再说为什么要用GPU, 而不是CPU 去做这些逻辑.
我们知道CPU,擅长高强度连续运算, 但却不擅长密集并发运算. 想像一下, 往屏幕中输出一张图,尺寸1024x1024, 那么我们就要在极短时间内, 遍历1 048 576, 百万个像素点, 然后控制每个像素点输出新的结果. 虽然CPU也有多线程, 但每输出一帧画面就要百万次的遍历, CPU基本无法胜任, 这就是GPU的由来. GPU 胜在小运算量, 大并行计算. 由硬件将每个逻辑线程固定下来, 即渲染管线,实际就是GPU中的一个很小的浮点计算单元,微型CPU. GPU中包含的渲染管线数量越多, 一次处理的像素点就越多. 画面表现就越流畅.
实际的一条渲染管线还细分成顶点着色,片着色器等几个组成部分, 着重于对一个像素点做不同的处理. 对于二维的游戏,顶点其实就只是一个矩形的四个顶点, 片面也只有矩形中间划开的两个三角形.
但对于3D 游戏来说, 3D模型本身会分割成成千上万个顶点以及面. Shader 的处理就是针对模型的每个顶点的位置, 每个面的色彩进行再加工的过程.
比如一个3D模型如果直接放在场景中, 他是不包含任何现实世界的表现效果的, 现实世界的表现效果有 光照, 有反光, 有阴影, 有灰尘,有划痕, 有眼睛放光, 有武器发光.等等效果. 而这些效果单纯用建模是无法体现出来的. 所以就需要Shader 对模型的再加工. 让模型能够模拟世界的反光,折射反射, 面料的抖动, 武器的发光. 而再加工的过程,无外乎就是对每一个顶点/像素进行色彩和位置的修改,重定位.

最后再说Shader 的使用场景, 实际上我们一直在用Shader 只是你没有注意, Sprite组件中引用的几个默认内置材质就是用Shader 进行实现的. 比如贴图变灰效果. 实际是在Shader代码中 对每一个像素的RGB颜色进行混合,产生了一个新的色彩输出到屏幕.
同样的,我们需要改变贴图原本的样貌时, 如果不希望增加美术贴图,或者美术实现不了的效果, 都可以尝试用Shader代码的形式去实现. 网上有很多现成的Shader效果, 逻辑简单, 但效果酷炫.
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 02:56 , Processed in 0.063755 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表