Shader 学习20160625

本文探讨了Unity中顶点和片段着色器的应用技巧,包括如何在顶点着色器和片段着色器中分配计算任务以实现特定效果,以及如何使用Unity提供的便捷函数进行光照和纹理操作。

Writing vertex and fragment shaders
Vertex and Fragment Shader Examples
http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html


这一章实在是太有趣了!!!

我把自己能recognition的写一下吧。

A,a Vertex Journey。看图说话,自然知道进去vert()的必须有vertex: POSION ,以及可能有uv: COORDINATE。出来的一定有MVP 转过的vertex position。
这里写图片描述

B,其实很多计算放在vert()或者frag()都有可能,就看你想得到的效果和使用多少资源。例子里面reflection的那两个例子真是让人印象深刻。一个是在vert()里面做ref向量;一个是在frag()里面做ref向量,触目惊心!虽然没实验,但我坚信frag()的开销高,即便vert()加上那些插值的计算。

C,occlusion居然真的就是一个Tex,仔细想想,非常合理,否则这些个自我遮罩如果要用算数算的,即便有简便方法,但是还是过猛。

D,ambient light 居然就是一个light probe,纯用ShadeSH9(half4(worldNormal,1))算出来的。

E,为什么用了normal Tex之后所有的反射都要在frag()里面做?! 因为vert()里面根本不可能做到pixel级别的读取,强上的话就会丢掉很多细节。而搞在frag()里面,故事就多了,一个是要把反射计算弄到frag()里面,另外一个就是要把normal Tex里面的normal decode之后从tangentspace转到 worldspace,也是个操心耗计算的活。

F,UnityCG.cginc里面真的有好多handy函数,什么UnityObjectToWorldNormal(),什么reflect(),什么ShadeSH9(),太他妈的方便了。唯一的缺点就是要看一遍函数头记得都有啥.

G,那个使用三个Tex从X,Y,Z axis投影渲染Texture的方式比较有趣。

H,所有阴影就别自己费劲了,抄pass{}就好,如果懒得抄,就用这句
// shadow casting support
UsePass “Legacy Shaders/VertexLit/SHADOWCASTER”
接受阴影也是,用现成的
vert( ){TRANSFER_SHADOW(o)} , frag(){SHADOW_ATTENUATION(i)}

I,最最关键的,
**模拟真实世界,请老老实实的使用surfaceshader,别创造;
如果有效率需求,首选mobile的,实在没有自己再做;
如果搞显示世界里面没有的,把幻想带进现实的,请自己写vert(), frag()。**

### 学习 Shader 编程的基础方法 学习 Shader 编程可以从以下几个方面入手: #### 1. **了解图形渲染管线** 在开始编写 Shader 前,理解图形渲染管线的基本概念至关重要。这包括顶点着色器、片元着色器(也称为像素着色器)、几何着色器等及其各自的作用[^3]。 - 顶点着色器负责处理每个顶点的数据,比如位置变换和法线计算。 - 片元着色器用于定义屏幕上每个像素的颜色和其他属性。 - 几何着色器可以用来生成新的几何体或者修改现有的几何结构。 通过掌握这些基本组件的工作原理,能够更好地设计和优化 Shader 的逻辑。 #### 2. **熟悉 Unity Shader 开发环境** 对于初学者来说,Unity 提供了一个友好的开发平台来实践 Shader 编程。一篇针对 Unity Shader 编程的文章总结了一些基础知识点和技术要点[^1]。建议从简单的表面着色器(Surface Shaders)开始尝试,逐步过渡到更复杂的片段着色器(Fragment Shaders)。 #### 3. **深入研究光照模型** 光照是 Shader 中非常重要的组成部分之一。例如,Lambert 光照模型是一种常见的漫反射光照算法,在实际应用中广泛存在[^5]。可以通过分析此类经典光照模型的实现方式,进一步加深对 Shader 工作机制的理解。 #### 4. **数据类型的初始化与操作** 熟练掌握各种数据类型及其初始化规则也是必不可少的一部分。例如矩阵(`mat3`, `mat4`)支持按列优先顺序进行赋值[^4]。以下是几个例子展示如何正确创建并使用矩阵: ```glsl // 使用单个数值初始化单位矩阵 mat3 identityMatrix = mat3(1.0); // 利用向量构建自定义矩阵 vec3 col1 = vec3(1.0, 0.0, 0.0); vec3 col2 = vec3(0.0, 1.0, 0.0); vec3 col3 = vec3(0.0, 0.0, 1.0); mat3 customMatrix = mat3(col1, col2, col3); ``` #### 5. **探索高级技术** 当具备了一定的基础之后,就可以考虑挑战一些更加先进的 Shader 技术了,像几何变形、动态阴影投射、大气散射模拟等等[^2]。这类主题不仅有助于提升视觉表现力,还能锻炼解决复杂问题的能力。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值