本部分是对《Unity Shader入门精要》的学习记录和总结反思,之后更新的更多部分也是如此

1、基础框架和结构体概念

  1. Shader "Unlit/Shader/Test01"{
  2. SubShader{
  3. Pass{
  4. CGPROGRAM
  5. #pragma vertex vert
  6. #pragma fragment frag
  7. struct a2v {
  8. float4 vertex : POSITION;
  9. float3 normal : NORMAL;
  10. float4 texcoord : TEXCOORD0;
  11. };
  12. float4 vert(a2v v) : SV_POSITION {
  13. return UnityObjectToClipPos(v.vertex);
  14. }
  15. fixed4 frag() : SV_Target {
  16. return fixed4 (1.0, 1.0, 1.0, 1.0);
  17. }
  18. ENDCG
  19. }
  20. }
  21. }
  1. 在此先不考虑开放属性Properties模块,由ShaderSubShader、和其中的pass作为基础模块,而核心的代码部分在CGPROGRAM-ENDCG之间,其中包括了上面的struct结构体,通过声明一个额外的结构体,可以让vertex(顶点着色器)和fragment(片元着色器)读取,这便是结构体的作用

2、顶点和片元着色器之间的通信

  1. Shader "Unlit/Shader/Test01"{
  2. SubShader{
  3. Pass{
  4. CGPROGRAM
  5. #pragma vertex vert
  6. #pragma fragment frag
  7. struct a2v {
  8. float4 vertex : POSITION;
  9. float3 normal : NORMAL;
  10. float4 texcoord : TEXCOORD0;
  11. };
  12. struct v2f {
  13. float4 pos : SV_POSITION;
  14. fixed3 color : COLOR0;
  15. }
  16. v2f vert(a2v v) {
  17. v2f o;
  18. o.pos = UnityObjectToClipPos(v.vertex);
  19. o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
  20. return o;
  21. }
  22. fixed4 frag(v2f i) : SV_Target {
  23. return fixed4(i.color, 1.0);
  24. }
  25. ENDCG
  26. }
  27. }
  28. }

这里通过v2f这个结构体来储存顶点、片元着色器的信息传递。
通过这个思路,再加上properties就能够看到之前模拟挑战中代码的整体结构了
基本框架大概了解后就能更方便的看懂其他人的代码了,之后比较基础的地方就不再更新,应用在Shader测试部分都有记录