谁能简单粗暴的解释下shader是什么?

文档太简单了,不知所云。所以也没有尝试。
百度之后也是稀里糊涂。看起来就是用gpu渲染一个节点的。节点可以添加材质,材质又依赖effect和shader balabala。。。
那疑问就是为什么要用shader呢?每个节点已经能很好的渲染了啊?比如我显示个图片,就扔个贴图进去,想显示动画就编辑一个等等等等。
shader有什么功能是节点的默认功能不好实现的么?
我去百度unity shader也同样没找到简单的答案,估计只能尝试之后才能理解了。

GPU渲染时候会执行到的代码片段

2赞

shader是代码,运行在GUP上,能加速渲染图像。它也叫"着色器",说实在的着色器这3个字不是很好理解。shader用于实现图像的外观,(比如给图像上色,为它贴上图片,实现一些特效,比如水流波浪,下雨,灯光)等等,反正只有你想不到的没有shader做不到的。

2赞

自动挡、手动挡区别。

2赞

如果有兴趣建议先学习OpenGL,学完就明白Shader是什么了

1赞

另外,用Shader可以实现很多动画实现不了的东西,Shader是直接作用于渲染管线的。

1赞

看webgl吧。

1赞

我曾经跟你一样搞不懂这个,,,虽然,现在也不懂,反正有大手子写好了,直接用就行了

1赞

用都不会用- -之前培训教过,忘完个球了

1赞

很简单,下载下来,把材质那个地方+1,然后拖进去,然后把脚本拖上去,胡乱改就行了

2赞

嗯 就是 很骚的 操作, 很骚很骚 那种

1赞

简单简单简单说,shader就是一串指令,用来告诉计算机屏幕上的某个像素点该显示什么颜色(实际情况要复杂点)

打个比方,活字印刷术你知道吧,古代的人要印刷一本书,要用很多字的 模具 ,排列在一起,然后刷上墨,把纸盖上去,然后纸上就有字了,印刷模具控制这个字具体是什么样

假如说我们的屏幕是一本书,书上的整整齐齐排列的字就是 像素点 ,那shader就相当于一个字的模板,用来控制像素的具体形态(颜色)

计算机要渲染一幅图像,比如大小是100X100像素,就要执行100X100次shader程序,获得这100X100个像素的信息,然后一幅图像就出来了

实际的渲染管线(pipeline,相当于印刷工厂的流水线)要复杂的多,感兴趣可以去看看计算机图形学

2赞

感谢各位大佬。目前已经理解creator怎么使用shader。然后读别人的博客,简单的过了一遍glsl的语法。准备尝试几个案例去理解一下,现在卡在了vert和frag能获取到的参数到底是啥意思,比如说顶点是什么意思,是mesh的顶点么,mesh也不懂,顶点坐标,纹理坐标又是啥,变量名怎么都很有规律,比如用v_开头,用a_开头等等等等。

Shader是在现代GPU可编程管线中使用的编程语言.GPU的脚本(配置)语言.分为顶点处理阶段和像素处理阶段.

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效果, 逻辑简单, 但效果酷炫.

2赞

大佬~~~

1赞

你节点的渲染,就是靠的shader,或读取顶点颜色,或者采样渲染的。。。先有底层shader程序帮你渲染,你才能看到图片。。。。

1赞

Javascript/Typescript 是给 CPU 用的代码,shader 是给 GPU 用的代码。

2赞

顶一个,谁知道为什么cocos-js的new cc.GLProgram() 变灰卡的跟死狗一样?

1赞

在渲染过程中,对每一个像素点的位置和颜色进行干预操作,
位置操作对应顶点着色器,颜色操作对应片元着色器.
这两个可以操作的阶段,是穿插在整个渲染流程里的.

1赞