• [游戏开发][Shader]ShaderToy通用模板转Unity-CG语言


     这个通用模板貌似是Candcat写的,漏了几个宏定义,我这给补一下,例如:

    #define iTime _Time.y

    #define atan atan2

    对照表如下

     矩阵与向量相乘

    1. //原代码,向量乘矩阵会报错。
    2. vec3 rd = vec3(1,1,1);
    3. mat2 matrix = mat2(1,2,3,4);
    4. rd.xy *= matrix;
    5. rd.xz *= matrix;
    6. //新代码
    7. vec3 rd = vec3(1,1,1);
    8. mat2 matrix = mat2(1,2,3,4);
    9. rd.xy = mul(matrix,rd.xy);
    10. rd.xz = mul(matrix,rd.xz);
    1. Shader "Shadertoy/Template" {
    2. Properties{
    3. iMouse("Mouse Pos", Vector) = (100, 100, 0, 0)
    4. iChannel0("iChannel0", 2D) = "white" {}
    5. iChannelResolution0("iChannelResolution0", Vector) = (100, 100, 0, 0)
    6. }
    7. CGINCLUDE
    8. #include "UnityCG.cginc"
    9. #pragma target 3.0
    10. #define vec2 float2
    11. #define vec3 float3
    12. #define vec4 float4
    13. #define mat2 float2x2
    14. #define mat3 float3x3
    15. #define mat4 float4x4
    16. #define iGlobalTime _Time.y
    17. #define iTime _Time.y
    18. #define mod fmod
    19. #define mix lerp
    20. #define fract frac
    21. #define texture2D tex2D
    22. #define iResolution _ScreenParams
    23. #define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)
    24. #define PI2 6.28318530718
    25. #define pi 3.14159265358979
    26. #define halfpi (pi * 0.5)
    27. #define oneoverpi (1.0 / pi)
    28. fixed4 iMouse;
    29. sampler2D iChannel0;
    30. fixed4 iChannelResolution0;
    31. struct v2f {
    32. float4 pos : SV_POSITION;
    33. float4 scrPos : TEXCOORD0;
    34. };
    35. v2f vert(appdata_base v) {
    36. v2f o;
    37. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    38. o.scrPos = ComputeScreenPos(o.pos);
    39. return o;
    40. }
    41. vec4 main(vec2 fragCoord);
    42. fixed4 frag(v2f _iParam) : COLOR0{
    43. vec2 fragCoord = gl_FragCoord;
    44. return main(gl_FragCoord);
    45. }
    46. vec4 main(vec2 fragCoord) {
    47. return vec4(1, 1, 1, 1);
    48. }
    49. ENDCG
    50. SubShader{
    51. Pass {
    52. CGPROGRAM
    53. #pragma vertex vert
    54. #pragma fragment frag
    55. #pragma fragmentoption ARB_precision_hint_fastest
    56. ENDCG
    57. }
    58. }
    59. FallBack Off
    60. }

     测试Shader的代码,把这个脚本挂到相机上,把shader托进去即可,如果有的shader需要material,则把material拖进去。

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. [ExecuteInEditMode]
    5. [RequireComponent(typeof(Camera))]
    6. public class ScreenEffect : MonoBehaviour
    7. {
    8. public Shader effectShader;
    9. public Material effectMaterial;
    10. public Material EffectMaterial
    11. {
    12. get
    13. {
    14. if (effectMaterial == null)
    15. {
    16. effectMaterial = CreateMaterial(effectShader, effectMaterial);
    17. return effectMaterial;
    18. }
    19. else
    20. {
    21. return effectMaterial;
    22. }
    23. }
    24. }
    25. [Range(0.0f, 3.0f)]
    26. public float brightness = 1.0f; //亮度
    27. [Range(0.0f, 3.0f)]
    28. public float saturation = 1.0f; //饱和度
    29. [Range(0.0f, 3.0f)]
    30. public float contrast = 1.0f; //对比度
    31. void OnRenderImage(RenderTexture src, RenderTexture dest)
    32. {
    33. if (EffectMaterial != null)
    34. {
    35. EffectMaterial.SetFloat("_Brightness", brightness);
    36. EffectMaterial.SetFloat("_Saturation", saturation);
    37. EffectMaterial.SetFloat("_Contrast", contrast);
    38. //对渲染纹理进行处理
    39. Graphics.Blit(src, dest, EffectMaterial);
    40. }
    41. else
    42. {
    43. Graphics.Blit(src, dest);
    44. }
    45. }
    46. private void Start()
    47. {
    48. bool isSupported = CheckSupport();
    49. if (isSupported == false)
    50. {
    51. this.enabled = false;
    52. }
    53. }
    54. // 检测当前平台是否支持屏幕特效
    55. private bool CheckSupport()
    56. {
    57. if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false)
    58. {
    59. Debug.LogWarning("当前平台不支持!");
    60. return false;
    61. }
    62. return true;
    63. }
    64. // 创建材质
    65. private Material CreateMaterial(Shader shader, Material material)
    66. {
    67. if (shader == null)
    68. {
    69. return null;
    70. }
    71. if (shader.isSupported && material && material.shader == shader)
    72. return material;
    73. if (!shader.isSupported)
    74. {
    75. return null;
    76. }
    77. else
    78. {
    79. material = new Material(shader);
    80. material.hideFlags = HideFlags.DontSave;
    81. if (material)
    82. return material;
    83. else
    84. return null;
    85. }
    86. }
    87. }

  • 相关阅读:
    字符函数、字符串函数和内存函数
    消失的人!消除视频中不需要的人物
    2022年全球高被引科学家公布
    python目标检测将视频按照帧率切除成图片
    vue学习之element-ui组件集成
    [零基础学IoT Pwn] 复现Netgear WNAP320 RCE
    redis为什么快,消息队列,单线程
    options.css 内容优化2 --chatPGT
    如何通用系统平台这个黑科技把网店做大,需要注意什么?
    h()函数
  • 原文地址:https://blog.csdn.net/liuyongjie1992/article/details/133068381