Ejemplo n.º 1
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("应用程序到顶点着色器的数据( appdata )");
            ShaderReferenceUtil.DrawOneContent("float4 vertex : POSITION;", "顶点的本地坐标");
            ShaderReferenceUtil.DrawOneContent("uint vid : SV_VertexID;", "顶点的索引ID");
            ShaderReferenceUtil.DrawOneContent("float3 normal : NORMAL;", "顶点的法线信息");
            ShaderReferenceUtil.DrawOneContent("float4 tangent : TANGENT;", "顶点的切线信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord : TEXCOORD0;", "顶点的UV1信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord1 : TEXCOORD1;", "顶点的UV2信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord2 : TEXCOORD2;", "顶点的UV3信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord3 : TEXCOORD3;", "顶点的UV4信息");
            ShaderReferenceUtil.DrawOneContent("fixed4 color : COLOR;", "顶点的顶点色信息");

            ShaderReferenceUtil.DrawTitle("顶点着色器到片断着色器的数据 ( v2f )");
            ShaderReferenceUtil.DrawOneContent("float4 pos:SV_POSITION;", "顶点的齐次裁剪空间下的坐标,默认情况下用POSITION也可以(PS4下不支持),但是为了支持所有平台,所以最好使用SV_POSITION.");
            ShaderReferenceUtil.DrawOneContent("TEXCOORD0~N", "例如TEXCOORD0、TEXCOORD1、TEXCOORD2...等等");
            ShaderReferenceUtil.DrawOneContent("COLOR0~N", "例如COLOR0、COLOR1、COLOR2...等等,主要用于低精度数据,由于平台适配问题,不建议在v2f中使用COLORn");
            ShaderReferenceUtil.DrawOneContent("float face:VFACE", "如果渲染表面朝向摄像机,则Face节点输出正值1,如果远离摄像机,则输出负值-1");
            ShaderReferenceUtil.DrawOneContent("UNITY_VPOS_TYPE screenPos : VPOS", "1.当前片断在屏幕上的位置(单位是像素,可除以_ScreenParams.xy来做归一化),此功能仅支持#pragma target 3.0及以上编译指令\n" +
                                               "2.大部分平台下VPOS返回的是一个四维向量,部分平台是二维向量,所以需要用UNITY_VPOS_TYPE来统一区分.\n" +
                                               "3.在使用VPOS时,就不能在v2f中定义SV_POSITION,这样会冲突,所以需要把顶点着色器的输入放在()的参数中,并且SV_POSITION添加out.");
            ShaderReferenceUtil.DrawOneContent("uint vid : SV_VertexID", "顶点着色器可以接收具有“顶点编号”作为无符号整数的变量,当需要从纹理或ComputeBuffers中获取额外的顶点数据时比较有用,此语义仅支持#pragma target 3.5及以上");
            ShaderReferenceUtil.DrawOneContent("注意事项", "1.OpenGL ES2.0支持最多8个\n2.OpenGL ES3.0支持最多16个");

            ShaderReferenceUtil.DrawTitle("片断着色器输出的数据( fragOutput )");
            ShaderReferenceUtil.DrawOneContent("fixed4 color : SV_Target;", "默认RenderTarget,也是默认输出的屏幕上的颜色\n同时支持SV_Target1、SV_Target2...等等");
            ShaderReferenceUtil.DrawOneContent("fixed depth : SV_Depth;", "通过在片断着色器中输出SV_DEPTH语义可以更改像素的深度值,注意此功能相对会消耗性能,在没有特别需求的情况下尽量不要用");

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 2
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Properties");
            ShaderReferenceUtil.DrawOneContent("_Int(\"Int\", Int) = 1", "类型:整型\nCg/HLSL:int\n取决于在Cg/HLSL中是用float还是int来声明的,如果定义为float则实际使用的就是浮点数,字义为int会被识别为int类型(去小数点直接取整)");
            ShaderReferenceUtil.DrawOneContent("_Float (\"Float\", Float ) = 0", "类型:浮点数值\nCg/HLSL:可根据需要定义不同的浮点精度\nfloat  32位精度,常用于世界坐标位置以及UV坐标\nhalf  范围[-6W,6W],常用于本地坐标位置,方向等\nfixed  范围[-2,2],常用于纹理与颜色等低精度的情况");
            ShaderReferenceUtil.DrawOneContent("_Slider (\"Slider\", Range(0, 1)) = 0", "类型:数值滑动条\n本身还是Float类型,只是通过Range(min,max)来控制滑动条的最小值与最大值");
            ShaderReferenceUtil.DrawOneContent("_Color(\"Color\", Color) = (1,1,1,1)", "类型:颜色属性\nCg/HLSL:float4/half4/fixed4");
            ShaderReferenceUtil.DrawOneContent("_Vector (\"Vector\", Vector) = (0,0,0,0)", "类型:四维向量\n在Properties中无法定义二维或者三维向量,只能定义四维向量");
            ShaderReferenceUtil.DrawOneContent("_MainTex (\"Texture\", 2D) = \"white\" {}", "类型:2D纹理\nCg/HLSL:sampler2D/sampler2D_half/sampler2D_float\n默认值有white、black、gray、bump以及空,空就是white");
            ShaderReferenceUtil.DrawOneContent("_MainTex3D (\"Texture\", 3D) = \"white\" {}", "类型:3D纹理\nCg/HLSL:sampler3D/sampler3D_half/sampler3D_float");
            ShaderReferenceUtil.DrawOneContent("_MainCube (\"Texture\", Cube) = \"white\" {}", "类型:立方体纹理\nCg/HLSL:samplerCUBE/samplerCUBE_half/samplerCUBE_float");

            ShaderReferenceUtil.DrawTitle("Attributes");
            ShaderReferenceUtil.DrawOneContent("[Header(xxx)]", "用于在材质面板中当前属性的上方显示标题xxx,注意只支持英文、数字、空格以及下划线");
            ShaderReferenceUtil.DrawOneContent("[HideInInspector]", "在材质面板中隐藏此条属性,在不希望暴露某条属性时可以快速将其隐藏");
            ShaderReferenceUtil.DrawOneContent("[Space(n)]", "使材质面板属性之前有间隔,n为间隔的数值大小");
            ShaderReferenceUtil.DrawOneContent("[HDR]", "标记为属性为高动态范围");
            ShaderReferenceUtil.DrawOneContent("[PowerSlider(3)]", "滑条曲率,必须加在range属性前面,用于控制滑动的数值比例");
            ShaderReferenceUtil.DrawOneContent("[IntRange]", "必须使用在Range属性之上,以使在材质面板中滑动时只能生成整数");
            ShaderReferenceUtil.DrawOneContent("[Toggle]", "开关,加在数值类型前,可使材质面板中的数值变成开关,0是关,1是开");
            ShaderReferenceUtil.DrawOneContent("[Enum()]", "枚举,可自行定义也可以使用内置的枚举");
            ShaderReferenceUtil.DrawOneContent("[NoScaleOffset]", "只能加在纹理属性前,使其隐藏材质面板中的Tiling和Offset");
            ShaderReferenceUtil.DrawOneContent("[Normal]", "只能加在纹理属性前,标记此纹理是用来接收法线贴图的,当用户指定了非法线的纹理时会在材质面板上进行警告提示");
            ShaderReferenceUtil.DrawOneContent("[Gamma]", "标记浮点值或者向量属性为sRGB值,并且可能需要根据所使用的颜色空间进行转换");
            ShaderReferenceUtil.DrawOneContent("[PerRendererData]", "标记当前属性将以材质属性块的形式来自于每个渲染器数据");
            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Other");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("CGPROGRAM/ENDCG", "cg代码的开始与结束.");
                ShaderReferenceUtil.DrawOneContent("CGINCLUDE/ENDCG", "通常用于定义多段vert/frag函数,然后这段CG代码会插入到所有Pass的CG中,根据当前Pass的设置来选择加载.");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("include", "#include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n" +
                                                   "#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n" +
                                                   "#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n" +
                                                   "#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"");
                ShaderReferenceUtil.DrawOneContent("CBUFFER_START(UnityPerMaterial)/CBUFFER_END", "将材质属性面板中的变量定义在这个常量缓冲区中,用于支持SRP Batcher.");
                ShaderReferenceUtil.DrawOneContent("HLSLPROGRAM/ENDHLSL", "HLSL代码的开始与结束.");
                ShaderReferenceUtil.DrawOneContent("HLSLINCLUDE/ENDHLSL", "通常用于定义多段vert/frag函数,然后这段CG代码会插入到所有Pass的CG中,根据当前Pass的设置来选择加载.");

                break;
            }

            ShaderReferenceUtil.DrawOneContent("Category{}", "定义一组所有SubShader共享的命令,位于SubShader外面。\n");
            ShaderReferenceUtil.DrawOneContent("LOD", "Shader LOD,可利用脚本来控制LOD级别,通常用于不同配置显示不同的SubShader。");
            ShaderReferenceUtil.DrawOneContent("Fallback \"name\"", "备胎,当Shader中没有任何SubShader可执行时,则执行FallBack。默认值为Off,表示没有备胎。\n示例:FallBack \"Diffuse\"");
            ShaderReferenceUtil.DrawOneContent("CustomEditor \"name\"", "自定义材质面板,name为自定义的脚本名称。可利用此功能对材质面板进行个性化自定义。");
            ShaderReferenceUtil.DrawOneContent("Name \"MyPassName\"", "给当前Pass指定名称,以便利用UsePass进行调用。");
            ShaderReferenceUtil.DrawOneContent("UsePass \"Shader/NAME\"", "调用其它Shader中的Pass,注意Pass的名称要全部大写!Shader的路径也要写全,以便能找到具体是哪个Shader的哪个Pass。另外加了UsePass后,也要注意相应的Properties要自行添加。");
            ShaderReferenceUtil.DrawOneContent("GrabPass", "GrabPass{} 抓取当前屏幕存储到_GrabTexture中,每个有此命令的Shader都会每帧执行。\nGrabPass { \"TextureName\" } 抓取当前屏幕存储到自定义的TextureName中,每帧中只有第一个拥有此命令的Shader执行一次。\nGrabPass也支持Name与Tags。");
            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("应用程序到顶点着色器的数据( appdata )");
            ShaderReferenceUtil.DrawOneContent("float4 vertex : POSITION;", "顶点的本地坐标");
            ShaderReferenceUtil.DrawOneContent("float3 normal : NORMAL;", "顶点的法线信息");
            ShaderReferenceUtil.DrawOneContent("float4 tangent : TANGENT;", "顶点的切线信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord : TEXCOORD0;", "顶点的UV1信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord1 : TEXCOORD1;", "顶点的UV2信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord2 : TEXCOORD2;", "顶点的UV3信息");
            ShaderReferenceUtil.DrawOneContent("float4 texcoord3 : TEXCOORD3;", "顶点的UV4信息");
            ShaderReferenceUtil.DrawOneContent("fixed4 color : COLOR;", "顶点的顶点色信息");

            ShaderReferenceUtil.DrawTitle("顶点着色器到片断着色器的数据 v2f )");
            ShaderReferenceUtil.DrawOneContent("float4 pos:SV_POSITION;", "顶点的齐次裁剪空间下的坐标");
            ShaderReferenceUtil.DrawOneContent("TEXCOORD0~N", "例如TEXCOORD0、TEXCOORD1、TEXCOORD2...等等,主要用于高精度数据");
            ShaderReferenceUtil.DrawOneContent("COLOR0~N", "例如COLOR0、COLOR1、COLOR2...等等,主要用于低精度数据");
            ShaderReferenceUtil.DrawOneContent("float face:VFACE", "如果渲染表面朝向摄像机,则Face节点输出正值1,如果远离摄像机,则输出负值-1");
            ShaderReferenceUtil.DrawOneContent("UNITY_VPOS_TYPE screenPos : VPOS", "像素的位置,此功能仅支持#pragma target 3.0及以上编译指令");
            ShaderReferenceUtil.DrawOneContent("uint vid : SV_VertexID", "顶点着色器可以接收具有“顶点编号”作为无符号整数的变量,当需要从纹理或ComputeBuffers中获取额外的顶点数据时比较有用,此语义仅支持#pragma target 3.5及以上");
            ShaderReferenceUtil.DrawOneContent("注意事项", "1.OpenGL ES2.0支持最多8个\n2.OpenGL ES3.0支持最多16个");

            ShaderReferenceUtil.DrawTitle("片断着色器输出的数据( fragOutput )");
            ShaderReferenceUtil.DrawOneContent("fixed4 color : SV_Target;", "默认RenderTarget,也是默认输出的屏幕上的颜色\n同时支持SV_Target1、SV_Target2...等等");
            ShaderReferenceUtil.DrawOneContent("fixed depth : SV_Depth;", "通过在片断着色器中输出SV_DEPTH语义可以更改像素的深度值,注意此功能相对会消耗性能,在没有特别需求的情况下尽量不要用");

            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("常见报错");
            ShaderReferenceUtil.DrawOneContent("Did not find shader kernel 'frag'to compile at line", "找不到片断着色器,检查下是否有正确编写片断着色器fragment.");
            ShaderReferenceUtil.DrawOneContent("syntax error : unexpected token ')'at line", "这一行存在语法错误,检测这行是否少了什么,如果没有看下它的前一句是否少了最后的分号.");
            ShaderReferenceUtil.DrawOneContent("cannot implicitly convert from 'float2' to 'half4' at line", "不能隐式的将float2转换成float4,需要手动补全,使等号两边分量数量一样才可以.");
            ShaderReferenceUtil.DrawOneContent("invalid subscript 'xx' at line", "无效的下标,通常是因为xx不存在或者xx的分量不存在导致的.");
            ShaderReferenceUtil.DrawOneContent("undeclared identifier 'xx' at line", "xx未定义.");
            ShaderReferenceUtil.DrawOneContent("unrecognized identifier 'xx' at line", "xx未识别到.");
            ShaderReferenceUtil.DrawOneContent("'xx':no matching 2 parameter intrinsic function", "通常是因为xx方法后面括号内的参数不匹配(数量或者类型).");
            ShaderReferenceUtil.DrawOneContent("comma expression used where a vector constructor may have been intended at line 48 (on d3d11)", "逗号的使用场景不对,比如float4 a = (0,0,0,1);应该写成float4 a = float4(0,0,0,1);");
            ShaderReferenceUtil.DrawOneContent("redefinition of 'xx' at xxx", "xx被重复定义了,看下是否和引用的hlsl或者cginc中的重复了.");
            ShaderReferenceUtil.DrawOneContent("incorrect number of arguments to numeric-type constructor at line", "通常是因为xx方法后面括号内的参数不匹配(数量或者类型).");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("Unrecognized sampler 'xx' - does not match any texture and is not a recognized inline name (should contain filter and wrap modes).", "纹理采样器的定义不对.");
                break;
            }

            ShaderReferenceUtil.DrawTitle("常见警告");
            ShaderReferenceUtil.DrawOneContent("implicit truncation of vector type at line xx (on d3d11)", "最好不要隐式的截断向量,参数中需要几维就写几维.");


            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 6
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("应用程序阶段( Application Stage)");
            ShaderReferenceUtil.DrawOneContent("0.Application Stage", "此阶段一般由CPU将需要在屏幕上绘制的几何体、摄像机位置、光照纹理等输出到管线的几何阶段.");

            ShaderReferenceUtil.DrawTitle("几何阶段( Geometry Stage)");
            ShaderReferenceUtil.DrawOneContent("1.模型和视图变换(Model and View Transform)", "模型和视图变换阶段分为模型变换和视图变换.\n模型变换的目的是将模型从本地空间变换到世界空间当中,而视图变换的目的是将摄像机放置于坐标原点(以使裁剪和投影操作更简单高效),将模型从世界空间变换到相机空间,以便后续步骤的操作。");
            ShaderReferenceUtil.DrawOneContent("2.顶点着色(Vertex Shading)", "顶点着色阶段的目的在于确定模型上顶点处的光照效果,其输出结果(颜色、向量、纹理坐标等)会被发送到光栅化阶段以进行插值操作。");
            ShaderReferenceUtil.DrawOneContent("3.几何、曲面细分着色器", "【可选项】分为几何着色器(Geometry Shader)和曲面细分着色器(Tessellation Shader),主要是对顶点进行增加与删除修改等操作.");
            ShaderReferenceUtil.DrawOneContent("4.投影(Projection)", "投影阶段分为正交投影与透视投影.\n投影其实就是矩阵变换,最终会使坐标位于归一化的设备坐标NDC中,之所以叫投影就是因为最终Z轴坐标将被舍弃,也就是说此阶段主要的目的是将模型从三维空间投射到了二维的空间中的过程(但是坐标仍然是三维的,只是显示上看是二维的)。");
            ShaderReferenceUtil.DrawOneContent("5.裁剪(Clipping)", "裁剪根据图元在视体的位置分为三种情况:\n1.当图元完全位于视体内部,那么它可以直接进行下一个阶段。\n2.当图元完全位于视体外部,则不会进入下一个阶段,直接丢弃。\n3.当图元部分位于视体内部,则需要对位于视体内的图元进行裁剪处理。\n最终的目的就是对部分位于视体内部的图元进行裁剪操作,以使处于视体外部不需要渲染的图元进行裁剪丢弃。");
            ShaderReferenceUtil.DrawOneContent("6.屏幕映射(Screen Mapping)", "屏幕映射阶段的主要目的,是将之前步骤得到的坐标映射到对应的屏幕坐标系上。");

            ShaderReferenceUtil.DrawTitle("光栅化阶段(Rasterizer Stage)");
            ShaderReferenceUtil.DrawOneContent("7.三角形设定(Triangle Setup)", "此阶段主要是将从几何阶段得到的一个个顶点通过计算来得到一个个三角形网格。");
            ShaderReferenceUtil.DrawOneContent("8.三角形遍历(Triangle Traversal)", "此阶段将进行逐像素遍历检查操作,以检查出该像素是否被上一步得到的三角形所覆盖,这个查找过程被称为三角形遍历.");
            ShaderReferenceUtil.DrawOneContent("9.像素着色(Pixel Shading)", "对应于ShaderLab中的frag函数,主要目的是定义像素的最终输出颜色.");
            ShaderReferenceUtil.DrawOneContent("10.混合(Merging)", "主要任务是合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色。此阶段还负责可见性问题(深度测试、模版测试等)的处理.");

            ShaderReferenceUtil.DrawTitle("Shader Lab");
            ShaderReferenceUtil.DrawOneContent("1.appdata", "将应用程序阶段的内容传递到顶点着色器中.");
            ShaderReferenceUtil.DrawOneContent("2.vertex(顶点着色器)", "本地空间>(本地到世界空间矩阵)>世界空间>(世界到观察空间矩阵)>观察空间>(投影矩阵)>齐次裁剪空间");
            ShaderReferenceUtil.DrawOneContent("3.透视除法", "齐次裁剪空间作透视除法(clip.xyzw/clip.w),变换到归一化设备坐标NDC.");
            ShaderReferenceUtil.DrawOneContent("4.视口变换", "从NDC坐标变换到屏幕坐标.");
            ShaderReferenceUtil.DrawOneContent("5.fragment(片断着色器)", "用从顶点着色器的输出来当输入进行逐片断的颜色计算并输出.");
            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("UV");
            ShaderReferenceUtil.DrawOneContent("UV重映射到中心位置", "float2 centerUV = uv * 2 - 1\n将UV值重映射为(-1,-1)~(1,1),也就是将UV的中心点从左下角移动到中间位置。");
            ShaderReferenceUtil.DrawOneContent("画圆", "float circle = smoothstep(_Radius, (_Radius + _CircleFade), length(uv * 2 - 1));\n利用UV来画圆,通过_Radius来调节大小,_CircleFade来调节边缘虚化程序。");
            ShaderReferenceUtil.DrawOneContent("画矩形", "float2 centerUV = abs(i.uv.xy * 2 - 1);\n"
                                               + "float rectangleX = smoothstep(_Width, (_Width + _RectangleFade), centerUV.x);\n"
                                               + "float rectangleY = smoothstep(_Heigth, (_Heigth + _RectangleFade), centerUV.y);\n"
                                               + "float rectangleClamp = clamp((rectangleX + rectangleY), 0.0, 1.0);\n"
                                               + "利用UV来画矩形,_Width调节宽度,_Height调节高度,_RectangleFade调节边缘虚化度。");
            ShaderReferenceUtil.DrawOneContent("极坐标", "float2 centerUV = (i.uv * 2 - 1);\n" +
                                               "float atan2UV = 1 - abs(atan2(centerUV.g, centerUV.r) / 3.14);\n" +
                                               "利用UV来实现极坐标.");
            ShaderReferenceUtil.DrawOneContent("将0-1的值控制在某个自定义的区间内", "frac(x*n+n);\n比如frac(i.uv*3.33+3.33);就是将0-1的uv值重新定义为0.33-0.66");
            ShaderReferenceUtil.DrawOneContent("随机", "1.frac(sin(dot(i.uv.xy, float2(12.9898, 78.233))) * 43758.5453);\n2.frac(sin(x)*n);");
            ShaderReferenceUtil.DrawOneContent("旋转", "fixed t=_Time.y;\nfloat2 rot= cos(t)*i.uv+sin(t)*float2(i.uv.y,-i.uv.x);");

            ShaderReferenceUtil.DrawTitle("顶点");
            ShaderReferenceUtil.DrawOneContent("模型中心点坐标", "float3 objCenterPos = mul( unity_ObjectToWorld, float4( 0, 0, 0, 1 ) ).xyz;\n"
                                               + "在Shader中获取当前模型的中心点,其实就是将(0,0,0)点从本地转换到世界空间坐标下即可,在制作对象从下往之类的效果时常用到。");

            ShaderReferenceUtil.DrawTitle("其它");
            ShaderReferenceUtil.DrawOneContent("菲涅尔", "fixed4 rimColor = fixed4(0,0.4,1,1);\n"
                                               + "half3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));\n"
                                               + "float ndotv = dot(i.normal, worldViewDir);\n"
                                               + "float fresnel = (0.2 + 2.0 * pow(1.0 - ndotv, 2.0));\n"
                                               + "fixed4 col = rimColor * fresnel;");
            ShaderReferenceUtil.DrawOneContent("XRay射线", "1.新建一个Pass\n2.设置自己想要的Blend\n3.Zwrite Off关闭深度写入\n4.Ztest greater深度测试设置为大于");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 8
0
 public void DrawMainGUI()
 {
     scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
     ShaderReferenceUtil.DrawTitle("Math");
     ShaderReferenceUtil.DrawOneContent("dot (a,b)", "点乘,a和b必须为三维向量或者四维向量,其计算结果是两个向量夹角的余弦值,相当于a.x*b.x+a.y*b.y+a.z*b.z\na和b的位置无所谓前后,结果都是一样的\n");
     ShaderReferenceUtil.DrawOneContent("smoothstep (min,max,x)", "如果 x 比min 小,返回 0\n如果 x 比max 大,返回 1\n如果 x 处于范围 [min,max]中,则返回 0 和 1 之间的值(按值在min和max间的比例).");
     EditorGUILayout.EndScrollView();
 }
Ejemplo n.º 9
0
 public void DrawMainGUI()
 {
     scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
     ShaderReferenceUtil.DrawTitle("Pragma");
     ShaderReferenceUtil.DrawOneContent("#pragma enable_d3d11_debug_symbols", "开启d3d11调试,加此命令后相关的名称与代码不会被剔除,便于在调试工具中进行查看分析");
     //ShaderReferenceUtil.DrawOneContent("ceil (x)", "返回不小于等于x的整数,即x=0.1返回1,x=1.5返回2,x=-0.3返回0");
     //ShaderReferenceUtil.DrawOneContent("clamp (x)", "返回不小于等于x的整数,即x=0.1返回1,x=1.5返回2,x=-0.3返回0");
     EditorGUILayout.EndScrollView();
 }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            ShaderReferenceUtil.DrawTitle("Target platform");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_D3D11", "Direct3D 11");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLCORE", "桌面OpenGL核心(GL3/4)");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLES", "OpenGl ES 2.0");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLES3", "OpenGl ES 3.0/3.1");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_METAL", "IOS/Mac Metal");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_VULKAN", "Vulkan");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_D3D11_9X", "IOS/Mac Metal");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_PS4", "PS4平台,SHADER_API_PSSL同时也会被定义");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_XBOXONE", "Xbox One");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_MOBILE", "所有移动平台(GLES/GLES3/METAL)");
            //ShaderReferenceUtil.DrawOneContent("SHADER_TARGET_GLSL", "");

            ShaderReferenceUtil.DrawTitle("Shader target model");
            ShaderReferenceUtil.DrawOneContent("#if SHADER_TARGET < 30", "对应于#pragma target的值,2.0就是20,3.0就是30");

            ShaderReferenceUtil.DrawTitle("Unity version");
            ShaderReferenceUtil.DrawOneContent("#if UNITY_VERSION >= 500", "Unity版本号判断,500表示5.0.0");

            ShaderReferenceUtil.DrawTitle("Platform difference helpers");
            ShaderReferenceUtil.DrawOneContent("UNITY_UV_STARTS_AT_TOP", "一般此判断当前平台是DX(UV原点在左上角)还是OpenGL(UV原点在左下角)");
            ShaderReferenceUtil.DrawOneContent("UNITY_NO_SCREENSPACE_SHADOWS", "定义移动平台不进行Cascaded ScreenSpace Shadow.");
            ShaderReferenceUtil.DrawTitle("UI");
            ShaderReferenceUtil.DrawOneContent("UNITY_UI_CLIP_RECT", "当父级物体有Rect Mask 2D组件时激活.\n" +
                                               "需要先手动定义此变体#pragma multi_compile _ UNITY_UI_CLIP_RECT\n" +
                                               "同时需要声明:_ClipRect(一个四维向量,四个分量分别表示RectMask2D的左下角点的xy坐标与右上角点的xy坐标.)\n" +
                                               "UnityGet2DClipping (float2 position, float4 clipRect)即可实现遮罩.");

            ShaderReferenceUtil.DrawTitle("Lighting");
            ShaderReferenceUtil.DrawOneContent("UNITY_SHOULD_SAMPLE_SH", "是否进行计算SH(光照探针与顶点着色)\n" +
                                               "-当静态与动态Lightmap启用时,此项不激活.\n" +
                                               "-当静态与动态Lightmap没有启用时,此项激活.\n" +
                                               "-除ForwardBase其它Pass都不激活,每个Pass需要指定UNITY_PASS_FORWARDADD、UNITY_PASS_SHADOWCASTER等.");
            ShaderReferenceUtil.DrawOneContent("UNITY_SAMPLE_FULL_SH_PER_PIXEL", "光照贴图uv和来自SHL2的环境颜色在顶点和像素内插器中共享,在启用静态lightmap和LIGHTPROBE_SH时,在像素着色器中执行完整的SH计算。");
            ShaderReferenceUtil.DrawOneContent("HANDLE_SHADOWS_BLENDING_IN_GI", "当同时定义了SHADOWS_SCREEN与LIGHTMAP_ON时开启.");
            ShaderReferenceUtil.DrawOneContent("UNITY_SHADOW_COORDS(N)", "定义一个float4类型的变量_ShadowCoord,语义为第N个TEXCOORD.");
            ShaderReferenceUtil.DrawOneContent("V2F_SHADOW_CASTER;", "用于\"LightMode\" = \"ShadowCaster\"中,相当于定义了float4 pos:SV_POSITION.");
            // ShaderReferenceUtil.DrawOneContent ("UNITY_TRANSFER_LIGHTING(o,v.texcoord1.xy);", "");
            ShaderReferenceUtil.DrawTitle("Other");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("SHADERGRAPH_PREVIEW", "在ShaderGraph中的Custom Function自义定节点上使用,用于判断是否处于SG面板预览中.");
                break;
            }
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 11
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Tags");
            ShaderReferenceUtil.DrawOneContent("Tags { \"TagName1\" = \"Value1\" \"TagName2\" = \"Value2\" }", "Tag的语法结构,通过Tags{}来表示需要添加的标识,大括号内可以添加多组Tag(所以才叫Tags嘛),名称(TagName)和值(Value)是成对成对出现的,并且全部用字符串表示。");

            ShaderReferenceUtil.DrawTitle("Queue");
            ShaderReferenceUtil.DrawOneContent("Queue", "渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。\n渲染队列数目小于2500的对象都被认为是不透明的物体(从前往后渲染),高于2500的被认为是半透明物体(从后往前渲染)。\n\"Queue\" = \"Geometry+1\" 可通过在值后加数字的方式来改变队列。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Background\"", "值为1000,此队列的对象最先进行渲染。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Geometry\"", "默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"AlphaTest\"", "值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Transparent\"", "值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Overlay\"", "值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)。");

            ShaderReferenceUtil.DrawTitle("RenderType");
            ShaderReferenceUtil.DrawOneContent("RenderType", "用来区别这个Shader要渲染的对象是属于什么类别的,你可以想像成是我们把各种不同的物体按我们需要的类型来进行分类一样。\n当然你也可以根据需要改成自定义的名称,这样并不会影响到Shader的效果。\n此Tag多用于摄像机的替换材质功能(Camera.SetReplacementShader)。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"Opaque\"", "大多数不透明着色器。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"Transparent\"", "大多数半透明着色器,比如粒子、特效、字体等。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"TransparentCutout\"", "透贴着色器,多用于植被等。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"Background\"", "多用于天空盒着色器。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"Overlay\"", "GUI、光晕着色器等。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"TreeOpaque\"", "Terrain地形中的树干。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"TreeTransparentCutout\"", "Terrain地形中的树叶。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"TreeBillboard\"", "Terrain地形中的永对面树。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"Grass\"", "Terrain地形中的草。");
            ShaderReferenceUtil.DrawOneContent("\"RenderType\" = \"GrassBillboard\"", "Terrain地形中的永对面草。");

            ShaderReferenceUtil.DrawTitle("DisableBatching");
            ShaderReferenceUtil.DrawOneContent("DisableBatching", "在利用Shader在模型的顶点本地坐标下做一些位移动画,而当此模型有批处理时会出现效果不正确的情况,这是因为批处理会将所有模型转换为世界坐标空间,因此“本地坐标空间”将丢失。");
            ShaderReferenceUtil.DrawOneContent("\"DisableBatching\" = \"True\"", "禁用批处理。");
            ShaderReferenceUtil.DrawOneContent("\"DisableBatching\" = \"False\"", "不禁用批处理。");
            ShaderReferenceUtil.DrawOneContent("\"DisableBatching\" = \"LODFading\"", "仅当LOD激活时禁用批处理。");

            ShaderReferenceUtil.DrawTitle("ForceNoShadowCasting");
            ShaderReferenceUtil.DrawOneContent("ForceNoShadowCasting", "是否强制关闭投射阴影。");
            ShaderReferenceUtil.DrawOneContent("\"ForceNoShadowCasting\" = \"True\"", "强制关闭阴影投射。");
            ShaderReferenceUtil.DrawOneContent("\"ForceNoShadowCasting\" = \"False\"", "不关闭阴影投射。");

            ShaderReferenceUtil.DrawTitle("IgnoreProjector");
            ShaderReferenceUtil.DrawOneContent("IgnoreProjector", "是否忽略Projector投影器的影响。");
            ShaderReferenceUtil.DrawOneContent("\"IgnoreProjector\" = \"True\"", "不受投影器影响。");
            ShaderReferenceUtil.DrawOneContent("\"IgnoreProjector\" = \"False\"", "受投影器影响。");

            ShaderReferenceUtil.DrawTitle("CanUseSpriteAtlas");
            ShaderReferenceUtil.DrawOneContent("CanUseSpriteAtlas", "是否可用于打包图集的精灵。");
            ShaderReferenceUtil.DrawOneContent("\"CanUseSpriteAtlas\" = \"True\"", "支持精灵打包图集。");
            ShaderReferenceUtil.DrawOneContent("\"CanUseSpriteAtlas\" = \"False\"", "不支持精灵打包图集。");

            ShaderReferenceUtil.DrawTitle("PreviewType");
            ShaderReferenceUtil.DrawOneContent("PreviewType", "定义材质面板中的预览的模型显示,默认不写或者不为Plane与Skybox时则为圆球。");
            ShaderReferenceUtil.DrawOneContent("\"PreviewType\" = \"Plane\"", "平面。");
            ShaderReferenceUtil.DrawOneContent("\"PreviewType\" = \"Skybox\"", "天空盒。");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 12
0
 public void DrawMainGUI()
 {
     scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
     foreach (var i in ShaderReferenceUtil.SearchDic)
     {
         if (i.Key.ToLower().Contains(ShaderReferenceEditorWindow.SEARCH_TEXT.ToLower()) || i.Value.ToLower().Contains(ShaderReferenceEditorWindow.SEARCH_TEXT.ToLower()))
         {
             ShaderReferenceUtil.DrawOneContent(i.Key, i.Value);
         }
     }
     EditorGUILayout.EndScrollView();
 }
Ejemplo n.º 13
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Font Size");

            ShaderReferenceUtil.DrawOneContent("Font Size测试大小", "Font Size测试大小,通过这里查看设置的大小是否合适.");

            //字体大小设置
            ShaderReferenceEditorWindow.FONTSIZE = EditorGUILayout.IntSlider("Font Size", ShaderReferenceEditorWindow.FONTSIZE, 16, 50);

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 14
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Transformations");
            ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MVP", "模型空间>>投影空间");
            ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MV", "模型空间>>观察空间");
            //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_V", "");
            //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_P", "");
            //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_VP", "");
            //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_T_MV", "");
            //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_IT_MV", "");
            //ShaderReferenceUtil.DrawOneContent("unity_ObjectToWorld", "");
            //ShaderReferenceUtil.DrawOneContent("unity_WorldToObject", "");

            ShaderReferenceUtil.DrawTitle("Camera and Screen");
            ShaderReferenceUtil.DrawOneContent("_WorldSpaceCameraPos", "主相机的世界坐标,类型:float3");
            //ShaderReferenceUtil.DrawOneContent("_ProjectionParams", "");
            ShaderReferenceUtil.DrawOneContent("_ScreenParams", "屏幕的相关参数,单位为像素。\nx表示屏幕的宽度\ny表示屏幕的高度\nz表示1+1/屏幕宽度\nw表示1+1/屏幕高度");
            //ShaderReferenceUtil.DrawOneContent("_ZBufferParams", "");
            //ShaderReferenceUtil.DrawOneContent("unity_OrthoParams", "");
            //ShaderReferenceUtil.DrawOneContent("unity_CameraProjection", "");
            //ShaderReferenceUtil.DrawOneContent("unity_CameraInvProjection", "");
            //ShaderReferenceUtil.DrawOneContent("unity_CameraWorldClipPlanes[6]", "");

            ShaderReferenceUtil.DrawTitle("Time");
            ShaderReferenceUtil.DrawOneContent("_Time", "时间,主要用于在Shader做动画,类型:float4\nx = t * 20\ny = t\nz = t *2\nw = t*3");
            ShaderReferenceUtil.DrawOneContent("_SinTime", "t是时间的正弦值,返回值(-1~1): \nx = t/8\ny = t/4\nz = t/2\nw = t");
            ShaderReferenceUtil.DrawOneContent("_CosTime", "t是时间的余弦值,返回值(-1~1):\nx = t/8\ny = t/4\nz = t/2\nw = t");
            ShaderReferenceUtil.DrawOneContent("unity_DeltaTime", "dt是时间增量,smoothDt是平滑时间\nx = dt\ny = 1/dt\nz = smoothDt\nw = 1/smoothDt");

            //ShaderReferenceUtil.DrawTitle("Lighting(Forward)");
            //ShaderReferenceUtil.DrawOneContent("_LightColor0", "");
            //ShaderReferenceUtil.DrawOneContent("_WorldSpaceLightPos0", "");
            //ShaderReferenceUtil.DrawOneContent("_LightMatrix0", "");
            //ShaderReferenceUtil.DrawOneContent("unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0", "");
            //ShaderReferenceUtil.DrawOneContent("unity_4LightAtten0", "");
            //ShaderReferenceUtil.DrawOneContent("unity_LightColor", "");
            //ShaderReferenceUtil.DrawOneContent("unity_WorldToShadow", "");

            //ShaderReferenceUtil.DrawTitle("Fog and Ambient");
            //ShaderReferenceUtil.DrawOneContent("unity_AmbientSky", "");
            //ShaderReferenceUtil.DrawOneContent("unity_AmbientEquator", "");
            //ShaderReferenceUtil.DrawOneContent("unity_AmbientGround", "");
            //ShaderReferenceUtil.DrawOneContent("UNITY_LIGHTMODEL_AMBIENT", "");
            //ShaderReferenceUtil.DrawOneContent("unity_FogColor", "");
            //ShaderReferenceUtil.DrawOneContent("unity_FogParams", "");

            //ShaderReferenceUtil.DrawTitle("Various");
            //ShaderReferenceUtil.DrawOneContent("unity_LODFade", "");
            //ShaderReferenceUtil.DrawOneContent("_TextureSampleAdd", "");
            EditorGUILayout.EndScrollView();
        }
 public void DrawMainGUI()
 {
     scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
     ShaderReferenceUtil.DrawTitle("Other");
     ShaderReferenceUtil.DrawOneContent("Category{}", "定义一组所有SubShader共享的命令,位于SubShader外面。\n");
     ShaderReferenceUtil.DrawOneContent("LOD", "Shader LOD,可利用脚本来控制LOD级别,通常用于不同配置显示不同的SubShader。");
     ShaderReferenceUtil.DrawOneContent("Fallback \"name\"", "备胎,当Shader中没有任何SubShader可执行时,则执行FallBack。默认值为Off,表示没有备胎。\n示例:FallBack \"Diffuse\"");
     ShaderReferenceUtil.DrawOneContent("CustomEditor \"name\"", "自定义材质面板,name为自定义的脚本名称。可利用此功能对材质面板进行个性化自定义。");
     ShaderReferenceUtil.DrawOneContent("Name \"MyPassName\"", "给当前Pass指定名称,以便利用UsePass进行调用。");
     ShaderReferenceUtil.DrawOneContent("UsePass \"Shader/NAME\"", "调用其它Shader中的Pass,注意Pass的名称要全部大写!Shader的路径也要写全,以便能找到具体是哪个Shader的哪个Pass。另外加了UsePass后,也要注意相应的Properties要自行添加。");
     ShaderReferenceUtil.DrawOneContent("GrabPass", "GrabPass{} 抓取当前屏幕存储到_GrabTexture中,每个有此命令的Shader都会每帧执行。\nGrabPass { \"TextureName\" } 抓取当前屏幕存储到自定义的TextureName中,每帧中只有第一个拥有此命令的Shader执行一次。\nGrabPass也支持Name与Tags。");
     EditorGUILayout.EndScrollView();
 }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Tags");
            ShaderReferenceUtil.DrawOneContent("Tags { \"TagName1\" = \"Value1\" \"TagName2\" = \"Value2\" }", "Tag的语法结构,通过Tags{}来表示需要添加的标识,大括号内可以添加多组Tag(所以才叫Tags嘛),名称(TagName)和值(Value)是成对成对出现的,并且全部用字符串表示。");

            ShaderReferenceUtil.DrawTitle("Queue");
            ShaderReferenceUtil.DrawOneContent("Queue", "渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。\n渲染队列数目小于2500的对象都被认为是不透明的物体(从前往后渲染),高于2500的被认为是半透明物体(从后往前渲染)。\n\"Queue\" = \"Geometry+1\" 可通过在值后加数字的方式来改变队列。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Background\"", "值为1000,此队列的对象最先进行渲染。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Geometry\"", "默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"AlphaTest\"", "值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Transparent\"", "值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。");
            ShaderReferenceUtil.DrawOneContent("\"Queue\" = \"Overlay\"", "值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)。");

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 17
0
 public void DrawMainGUI()
 {
     scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
     ShaderReferenceUtil.DrawTitle("基本类型");
     ShaderReferenceUtil.DrawOneContent("void", "空类型,即不返回任何值.");
     ShaderReferenceUtil.DrawOneContent("bool", "布尔类型,即真或者假,true false.");
     ShaderReferenceUtil.DrawOneContent("int", "带符号的整数.");
     ShaderReferenceUtil.DrawOneContent("float", "带符号的浮点数.");
     ShaderReferenceUtil.DrawOneContent("vec2,vec3,vec4", "n维浮点数向量.");
     ShaderReferenceUtil.DrawOneContent("bvec2,bvec3,bvec4", "n维布尔向量.");
     ShaderReferenceUtil.DrawOneContent("ivec2,ivec3,ivec4", "n维向整数向量");
     ShaderReferenceUtil.DrawOneContent("mat2,mat3,mat4", "2x2,3x3,4x4浮点数矩阵.");
     ShaderReferenceUtil.DrawOneContent("sampler2D", "2D纹理.");
     ShaderReferenceUtil.DrawOneContent("samplerCube", "立方体纹理.");
     EditorGUILayout.EndScrollView();
 }
Ejemplo n.º 18
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("UV");
            ShaderReferenceUtil.DrawOneContent("UV重映射到中心位置", "float2 centerUV = uv * 2 - 1\n将UV值重映射为(-1,-1)~(1,1),也就是将UV的中心点从左下角移动到中间位置。");
            ShaderReferenceUtil.DrawOneContent("画圆", "float circle = smoothstep(_Radius, (_Radius + _CircleFade), length(uv * 2 - 1));\n利用UV来画圆,通过_Radius来调节大小,_CircleFade来调节边缘虚化程序。");
            ShaderReferenceUtil.DrawOneContent("画矩形", "float2 centerUV = abs(i.uv.xy * 2 - 1);\n"
                                               + "float rectangleX = smoothstep(_Width, (_Width + _RectangleFade), centerUV.x);\n"
                                               + "float rectangleY = smoothstep(_Heigth, (_Heigth + _RectangleFade), centerUV.y);\n"
                                               + "float rectangleClamp = clamp((rectangleX + rectangleY), 0.0, 1.0);\n"
                                               + "利用UV来画矩形,_Width调节宽度,_Height调节高度,_RectangleFade调节边缘虚化度。");

            ShaderReferenceUtil.DrawTitle("顶点");
            ShaderReferenceUtil.DrawOneContent("模型中心点坐标", "float3 objCenterPos = mul( unity_ObjectToWorld, float4( 0, 0, 0, 1 ) ).xyz;\n"
                                               + "在Shader中获取当前模型的中心点,其实就是将(0,0,0)点从本地转换到世界空间坐标下即可,在制作对象从下往之类的效果时常用到。");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 19
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("部件");
            ShaderReferenceUtil.DrawOneContent("GPU", "Graphic Processing Unit,简称GPU,中文翻译为图形处理器。");
            ShaderReferenceUtil.DrawOneContent("BIOS", "BIOS是Basic Input Output System的简称,也就是基本输入输出系统。\n显卡BIOS主要用于存放显示芯片与驱动程序之间的控制程序,另外还保存显卡的型号、规格、生产厂家以及出厂时间等信息。");
            ShaderReferenceUtil.DrawOneContent("PCB", "Printed Circuit Board,显卡PCB就是印制电路板,除了用于固定各种小零件外,PCB的主要功能是提供其上各项零件的相互电气连接。");
            ShaderReferenceUtil.DrawOneContent("晶振", "Crystal,石英振荡器的简称,是时钟电路中最重要的部分。\n显卡晶振为27MHz,其作用是向显卡各部分提供基准频率。晶振就像个标尽尺,工作频率不稳定会造成相关设备工作频率不稳定。");
            ShaderReferenceUtil.DrawOneContent("电容", "在显卡上是两个直立的零件,电容对显卡主要起滤波和稳定电流的作用,只有在保证电流稳定的情况下,显卡才能正常的工作。");

            ShaderReferenceUtil.DrawTitle("性能参数");
            ShaderReferenceUtil.DrawOneContent("显卡架构", "就是指显示芯片各种处理单元的组成和工作模式,在参数相同的情况下,架构越先进,效率就越高,性能也就越强。\n而同架构的显卡 最重要的指标由处理器数量、核芯频率、显存、位宽来决定。");
            ShaderReferenceUtil.DrawOneContent("核心频率", "显卡的核心频率是指显示核心的工作频率。");
            ShaderReferenceUtil.DrawOneContent("显存", "显存也称为帧缓存,它的作用是用来存储显示芯片处理过的或者即将提取的渲染数据。我们在显示屏上看到的画面都是由一个个的像素点构成的,而每个像素点都是以4~64bit的数据来控制亮度和色彩的,这些数据必须通过显存来保存,并交由显示芯片和CPU调配,才能把运算结果转化为图像输出到显示器上。");
            ShaderReferenceUtil.DrawOneContent("显存位宽", "显存位宽是显存在一个时钟周期内所能传送数据的位数,位数越大则瞬间能传输的数据量就越大。\n显存带宽=显存频率X显存位宽÷8\n举例:500MHzx256bit÷8=16GB/s");
            ShaderReferenceUtil.DrawOneContent("显存速度", "显存速度一般以ns(纳秒)为单位。常用的显存速度有7ns、5ns、1.1ns等,越小速度越快,性能越好。");
            ShaderReferenceUtil.DrawOneContent("显存频率", "显存频率在一定程度上反应着显存的速度,以MHz(兆赫兹)为单位。显存频率与显存时钟周期是相关的,二者成倒数关系:\n显存频率=1÷显存时钟周期");

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 20
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Properties");
            ShaderReferenceUtil.DrawOneContent("_Int(\"Int\", Int) = 1", "类型:整型\nCg/HLSL:int\n取决于在Cg/HLSL中是用float还是int来声明的,如果定义为float则实际使用的就是浮点数,字义为int会被识别为int类型(去小数点直接取整)");

            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("_Float (\"Float\", Float ) = 0", "类型:浮点数值\nCg/HLSL:可根据需要定义不同的浮点精度\nfloat  32位精度,常用于世界坐标位置以及UV坐标\nhalf  范围[-6W,6W],常用于本地坐标位置,方向等\nfixed  范围[-2,2],常用于纹理与颜色等低精度的情况");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("_Float (\"Float\", Float ) = 0", "任何需要显式精度的函数,使用float或half限定符,当函数可以同时支持两者时,则使用real.");
                break;
            }

            ShaderReferenceUtil.DrawOneContent("_Slider (\"Slider\", Range(0, 1)) = 0", "类型:数值滑动条\n本身还是Float类型,只是通过Range(min,max)来控制滑动条的最小值与最大值");
            ShaderReferenceUtil.DrawOneContent("_Color(\"Color\", Color) = (1,1,1,1)", "类型:颜色属性\nCg/HLSL:float4/half4/fixed4");
            ShaderReferenceUtil.DrawOneContent("_Vector (\"Vector\", Vector) = (0,0,0,0)", "类型:四维向量\n在Properties中无法定义二维或者三维向量,只能定义四维向量");
            ShaderReferenceUtil.DrawOneContent("_MainTex (\"Texture\", 2D) = \"white\" {}", "类型:2D纹理\nCg/HLSL:sampler2D/sampler2D_half/sampler2D_float\n默认值有white、black、gray、bump以及空,空就是white");
            ShaderReferenceUtil.DrawOneContent("_MainTex3D (\"Texture\", 3D) = \"white\" {}", "类型:3D纹理\nCg/HLSL:sampler3D/sampler3D_half/sampler3D_float");
            ShaderReferenceUtil.DrawOneContent("_MainCube (\"Texture\", Cube) = \"white\" {}", "类型:立方体纹理\nCg/HLSL:samplerCUBE/samplerCUBE_half/samplerCUBE_float");

            ShaderReferenceUtil.DrawTitle("Attributes");
            ShaderReferenceUtil.DrawOneContent("[Header(xxx)]", "用于在材质面板中当前属性的上方显示标题xxx,注意只支持英文、数字、空格以及下划线");
            ShaderReferenceUtil.DrawOneContent("[HideInInspector]", "在材质面板中隐藏此条属性,在不希望暴露某条属性时可以快速将其隐藏");
            ShaderReferenceUtil.DrawOneContent("[Space(n)]", "使材质面板属性之前有间隔,n为间隔的数值大小");
            ShaderReferenceUtil.DrawOneContent("[HDR]", "标记为属性为高动态范围");
            ShaderReferenceUtil.DrawOneContent("[PowerSlider(3)]", "滑条曲率,必须加在range属性前面,用于控制滑动的数值比例");
            ShaderReferenceUtil.DrawOneContent("[IntRange]", "必须使用在Range属性之上,以使在材质面板中滑动时只能生成整数");
            ShaderReferenceUtil.DrawOneContent("[Toggle]", "开关,加在数值类型前,可使材质面板中的数值变成开关,0是关,1是开");
            ShaderReferenceUtil.DrawOneContent("[Enum(Off, 0, On, 1)]", "数值枚举,可直接在cg中使用此关键字来替代数字.");
            ShaderReferenceUtil.DrawOneContent("[KeywordEnum (Enum0, Enum1, Enum2, Enum3, Enum4, Enum5, Enum6, Enum7, Enum8)]", "关键字枚举,可最多定义8个,需要#pragma multi_compile _ENUM_ENUM0 _ENUM_ENUM1 ...来依次声明变体关键字.");
            ShaderReferenceUtil.DrawOneContent("[Enum (UnityEngine.Rendering.CullMode)]", "内置枚举,可在Enum()内直接调用Unity内部的枚举.");
            ShaderReferenceUtil.DrawOneContent("[NoScaleOffset]", "只能加在纹理属性前,使其隐藏材质面板中的Tiling和Offset");
            ShaderReferenceUtil.DrawOneContent("[Normal]", "只能加在纹理属性前,标记此纹理是用来接收法线贴图的,当用户指定了非法线的纹理时会在材质面板上进行警告提示");
            ShaderReferenceUtil.DrawOneContent("[Gamma]", "Float和Vector属性默认情况下不会进行颜色空间转换,可以通过添加[Gamma]来指明此属性为sRGB值");
            ShaderReferenceUtil.DrawOneContent("[PerRendererData]", "标记当前属性将以材质属性块的形式来自于每个渲染器数据");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 21
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("应用程序阶段( Application Stage)");
            ShaderReferenceUtil.DrawOneContent("0.Application Stage", "此阶段将需要在屏幕上绘制的几何体、摄像机位置、光照等输出到管线的几何阶段。");

            ShaderReferenceUtil.DrawTitle("几何阶段( Geometry Stage)");
            ShaderReferenceUtil.DrawOneContent("1.模型和视图变换(Model and View Transform)", "模型和视图变换阶段分为模型变换和视图变换.\n模型变换的目的是将模型变换到适合渲染的空间当中,而视图变换的目的是将摄像机放置于坐标原点(以使裁剪和投影操作更简单高效),方便后续步骤的处理。");
            ShaderReferenceUtil.DrawOneContent("2.顶点着色(Vertex Shading)", "对应于ShaderLab中的vertex函数.\n顶点着色阶段的目的在于确定模型上顶点处的光照效果,其输出结果(颜色、向量、纹理坐标等)会被发送到光栅化阶段以进行插值操作。");
            ShaderReferenceUtil.DrawOneContent("3.投影(Projection)", "投影阶段分为正交投影与透视投影.\n投影其实就是矩阵变换,最终会使坐标位于归一化的设备坐标中,之所以叫投影就是因为最终Z轴坐标将被舍弃,也就是说此阶段主要的目的是将模型从三维空间投射到了二维的空间中的过程(但是坐标仍然是三维的,只是显示上看是二维的)。");
            ShaderReferenceUtil.DrawOneContent("4.裁剪(Clipping)", "裁剪根据图元在视体的位置分为三种情况:\n1.当图元完全位于视体内部,那么它可以直接进行下一个阶段。\n2.当图元完全位于视体外部,则不会进入下一个阶段,直接丢弃。\n3.当图元部分位于视体内部,则需要对位于视体内的图元进行裁剪处理。\n最终的目的就是对部分位于视体内部的图元进行裁剪操作,以使处于视体外部不需要渲染的图元进行裁剪丢弃。");
            ShaderReferenceUtil.DrawOneContent("5.屏幕映射(Screen Mapping)", "屏幕映射阶段的主要目的,是将之前步骤得到的坐标映射到对应的屏幕坐标系上。");

            ShaderReferenceUtil.DrawTitle("光栅化阶段(Rasterizer Stage)");
            ShaderReferenceUtil.DrawOneContent("6.三角形设定(Triangle Setup)", "主要用来计算三角形表面的差异和三角形表面的其他相关数据。该数据主要用于三角形遍历,以及由几何阶段处理的各种着色数据的插值操作所用。该过程在专门为其设计的硬件上执行。");
            ShaderReferenceUtil.DrawOneContent("7.三角形遍历(Triangle Traversal)", "进行逐像素遍历检查操作,检查该像素是否由三角形覆盖,找到哪些采样点或像素在三角形中的过程通常叫三角形遍历");
            ShaderReferenceUtil.DrawOneContent("8.像素着色(Pixel Shading)", "对应于ShaderLab中的frag函数.\n主要目的是计算所有需逐像素操作的过程,纹理贴图操作就是在这阶段进行的.");
            ShaderReferenceUtil.DrawOneContent("9.混合(Merging)", "主要任务是合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色。此阶段还负责可见性问题(Z 缓冲相关)的处理.");

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 22
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("裁剪空间(规范化立方体)");
            ShaderReferenceUtil.DrawOneContent("OpenGL", "裁剪空间下坐标范围(-1,1)");
            ShaderReferenceUtil.DrawOneContent("DirectX", "裁剪空间下坐标范围(1,0)");
            ShaderReferenceUtil.DrawOneContent("UNITY_NEAR_CLIP_VALUE", "裁剪空间下的近剪裁值,(DX为1,OpenGL为-1).");

            ShaderReferenceUtil.DrawTitle("ReversedZ");
            ShaderReferenceUtil.DrawOneContent("Reversed direction(反向方向)", "DirectX 11、DirectX 12、PS4、Xbox One、Metal这些平台都属于反向方向.\n" +
                                               "深度值从近裁剪面到远裁剪面的值为[1 ~ 0]\n" +
                                               "裁剪空间下的Z轴范围为[near,0]");
            ShaderReferenceUtil.DrawOneContent("Traditional direction(传统方向)", "除以上反向方向的平台以外都属于传统方向.\n" +
                                               "深度值从近裁剪面到远裁剪面的值为[0 ~ 1]\n" +
                                               "裁剪空间下的Z轴范围为:\n" +
                                               "DX平台=[0,far]\n" +
                                               "OpenGL平台=[-near,far]");
            ShaderReferenceUtil.DrawOneContent("SystemInfo.usesReversedZBuffer", "利用C#判断当前平台是否支持ReversedZ");
            ShaderReferenceUtil.DrawTitle("其它");

            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Math");
            ShaderReferenceUtil.DrawOneContent("abs (x)", "取绝对值,即正值返回正值,负值返回的还是正值\nx值可以为向量");
            ShaderReferenceUtil.DrawOneContent("ceil (x)", "对x进行向上取整,即x=0.1返回1,x=1.5返回2,x=-0.3返回0");
            ShaderReferenceUtil.DrawOneContent("clamp (x)", "返回不小于等于x的整数,即x=0.1返回1,x=1.5返回2,x=-0.3返回0");

            ShaderReferenceUtil.DrawOneContent("dot (a,b)", "点乘,a和b必须为三维向量或者四维向量,其计算结果是两个向量夹角的余弦值,相当于a.x*b.x+a.y*b.y+a.z*b.z\na和b的位置无所谓前后,结果都是一样的\n");
            ShaderReferenceUtil.DrawOneContent("exp (x)", "计算x的指数");
            ShaderReferenceUtil.DrawOneContent("exp2 (x)", "计算2的x次方");

            ShaderReferenceUtil.DrawOneContent("floor (x)", "对x值进行向下取整\n比如:floor (0.6) = 0.0,floor (-0.6) = -1.0");
            ShaderReferenceUtil.DrawOneContent("fmod (x,y)", "返回x/y的余数。如果y为0,结果不可预料");
            ShaderReferenceUtil.DrawOneContent("frac (xy)", "返回x的小数部分");

            ShaderReferenceUtil.DrawOneContent("length (v)", "返回一个向量的模,即 sqrt(dot(v,v))");
            ShaderReferenceUtil.DrawOneContent("lerp (A,B,alpha)", "线性插值.\n如果alpha=0,则返回A;\n如果alpha=1,则返回B;\n否则返回A与B的混合值");
            ShaderReferenceUtil.DrawOneContent("normalize (v)", "归一化向量");
            ShaderReferenceUtil.DrawOneContent("reflect(I, N)", "根据入射光方向向量 I ,和顶点法向量 N ,计算反射光方向向量。其中 I 和 N 必须被归一化,需要非常注意的是,这个 I 是指向顶点的;函数只对三元向量有效。");
            ShaderReferenceUtil.DrawOneContent("refract(I,N,eta)", "计算折射向量, I 为入射光线, N 为法向量, eta 为折射系数;其中 I 和 N 必须被归一化,如果 I 和 N 之间的夹角太大,则返回( 0 , 0 , 0 ),也就是没有折射光线; I 是指向顶点的;函数只对三元向量有效。");
            ShaderReferenceUtil.DrawOneContent("smoothstep (min,max,x)", "如果 x 比min 小,返回 0\n如果 x 比max 大,返回 1\n如果 x 处于范围 [min,max]中,则返回 0 和 1 之间的值(按值在min和max间的比例).");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 24
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            ShaderReferenceUtil.DrawTitle("空间变换(矩阵)");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MVP", "模型空间>>投影空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MV", "模型空间>>观察空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_V", "视图空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_P", "投影空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_VP", "观察空间>投影空间");
                //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_T_MV", "");
                //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_IT_MV", "");
                ShaderReferenceUtil.DrawOneContent("unity_ObjectToWorld", "本地空间>>世界空间");
                ShaderReferenceUtil.DrawOneContent("unity_WorldToObject", "世界空间>本地空间");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_M", "unity_ObjectToWorld,模型空间>>世界空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_I_M", "unity_WorldToObject,世界空间>>模型空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_V", "unity_MatrixV,观察空间");
                // #define UNITY_MATRIX_I_V   unity_MatrixInvV
                // #define UNITY_MATRIX_P     OptimizeProjectionMatrix(glstate_matrix_projection)
                // #define UNITY_MATRIX_I_P   ERROR_UNITY_MATRIX_I_P_IS_NOT_DEFINED
                // #define UNITY_MATRIX_VP    unity_MatrixVP
                // #define UNITY_MATRIX_I_VP  _InvCameraViewProj
                // #define UNITY_MATRIX_MV    mul(UNITY_MATRIX_V, UNITY_MATRIX_M)
                // #define UNITY_MATRIX_T_MV  transpose(UNITY_MATRIX_MV)
                // #define UNITY_MATRIX_IT_MV transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V))
                // #define UNITY_MATRIX_MVP   mul(UNITY_MATRIX_VP, UNITY_MATRIX_M)
                ShaderReferenceUtil.DrawOneContent("GetObjectToWorldMatrix()", "本地空间到世界空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToObjectMatrix()", "世界空间到本地空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToViewMatrix()", "世界空间到观察空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToHClipMatrix()", "世界空间到齐次裁剪空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetViewToHClipMatrix()", "观察空间到齐次裁剪空间的矩阵");
                break;
            }
            ShaderReferenceUtil.DrawOneContent("unity_WorldToCamera", "世界空间到观察空间的矩阵");
            ShaderReferenceUtil.DrawOneContent("unity_CameraToWorld", "观察空间到世界空间的矩阵");

            ShaderReferenceUtil.DrawTitle("空间变换(方法)");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("UnityObjectToClipPos(v.vertex)", "将模型空间下的顶点转换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("UnityObjectToWorldNormal(v.normal)", "将模型空间下的法线转换到世界空间(已归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityObjectToWorldDir (v.tangent)", "将模型空间下的切线转换到世界空间(已归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityWorldSpaceLightDir (i.worldPos)", "世界空间下顶点到灯光方向的向量(未归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityWorldSpaceViewDir (i.worldPos)", "世界空间下顶点到视线方向的向量(未归一化)");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("float3 TransformObjectToWorld (float3 positionOS)", "从本地空间变换到世界空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformWorldToObject (float3 positionWS)", "从世界空间变换到本地空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformWorldToView(float3 positionWS)", "从世界空间变换到视图空间");

                ShaderReferenceUtil.DrawOneContent("float4 TransformObjectToHClip(float3 positionOS)", "将模型空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float4 TransformWorldToHClip(float3 positionWS)", "将世界空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float4 TransformWViewToHClip (float3 positionVS)", "将视图空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformObjectToWorldNormal (float3 normalOS)", "将法线从本地空间变换到世界空间(已归一化)");
                ShaderReferenceUtil.DrawOneContent("real3 TransformTangentToWorld(real3 dirTS, real3x3 tangentToWorld)", "从切线空间变换到世界空间");
                break;
            }

            ShaderReferenceUtil.DrawTitle("基础变换矩阵");
            ShaderReferenceUtil.DrawOneContent("平移矩阵", "float4x4 M_translate = float4x4(\n" +
                                               "\t1, 0, 0, T.x,\n" +
                                               "\t0, 1, 0, T.y,\n" +
                                               "\t0, 0, 1, T.z,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("缩放矩阵", "float4x4 M_scale = float4x4(\n" +
                                               "\tS.x, 0, 0, 0,\n" +
                                               "\t0, S.y, 0, 0,\n" +
                                               "\t0, 0, S.z, 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(X轴)", "float4x4 M_rotationX = float4x4(\n" +
                                               "\t1, 0, 0, 0,\n" +
                                               "\t0, cos(θ), sin(θ), 0,\n" +
                                               "\t0, -sin(θ), cos(θ), 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(Y轴)", "float4x4 M_rotationY = float4x4(\n" +
                                               "\tcos(θ), 0, sin(θ), 0,\n" +
                                               "\t0, 1, 0, 0,\n" +
                                               "\t-sin(θy), 0, cos(θ), 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(Z轴)", "float4x4 M_rotationZ = float4x4(\n" +
                                               "\tcos(θ), sin(θ), 0, 0,\n" +
                                               "\t-sin(θ), cos(θ), 0, 0,\n" +
                                               "\t0, 0, 1, 0,\n" +
                                               "\t0, 0, 0, 1);");

            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 25
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("法线 NormalMap");
            ShaderReferenceUtil.DrawOneContent("使用切线空间下的法线",
                                               "1.appdata中定义NORMAL与TANGENT语义.\n" +
                                               "2.v2f中声明三个变量用于组成成切线空间下的旋转矩阵.\n" +
                                               "   float3 tSpace0:TEXCOORD3;\n" +
                                               "   float3 tSpace1:TEXCOORD4;\n" +
                                               "   float3 tSpace2:TEXCOORD5;\n" +
                                               "3.在顶点着色器中执行:\n" +
                                               "   half3 worldTangent = UnityObjectToWorldDir(v.tangent);\n" +
                                               "   fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n" +
                                               "   half3 worldBinormal = cross(o.worldNormal, worldTangent) * tangentSign;\n" +
                                               "   o.tSpace0 = float3(worldTangent.x,worldBinormal.x,o.worldNormal.x);\n" +
                                               "   o.tSpace1 = float3(worldTangent.y,worldBinormal.y,o.worldNormal.y);\n" +
                                               "   o.tSpace2 = float3(worldTangent.z,worldBinormal.z,o.worldNormal.z);\n" +
                                               "4.在片断着色器中计算出世界空间下的法线,然后再拿去进行需要的计算:\n" +
                                               "   half3 normalTex = UnpackNormal(tex2D(_NormalTex,i.uv));\n" +
                                               "   half3 worldNormal = half3(dot(i.tSpace0,normalTex),dot(i.tSpace1,normalTex),dot(i.tSpace2,normalTex));");
            ShaderReferenceUtil.DrawTitle("光照模型");
            ShaderReferenceUtil.DrawOneContent("Lambertian", "Diffuse = Ambient + Kd * LightColor * max(0,dot(N,L))\n" +
                                               "Diffuse:\t最终物体上的漫反射光强.\n" +
                                               "Ambient:\t环境光强度,为了简化计算,环境光强采用一个常数表示.\n" +
                                               "Kd:\t物体材质对光的反射系数.\n" +
                                               "LightColor:\t光源的强度.\n" +
                                               "N:\t顶点的单位法线向量.\n" +
                                               "L:\t顶点指向光源的单位向量.");
            ShaderReferenceUtil.DrawOneContent("Phong", "Specular = SpecularColor * Ks * pow(max(0,dot(R,V)), Shininess)\n" +
                                               "Specular:\t最终物体上的反射高光光强.\n" +
                                               "SpecularColor:\t反射光的颜色.\n" +
                                               "Ks:\t反射强度系数.\n" +
                                               "R:\t反射向量,可使用2 * N * dot(N,L) - L或者reflect (-L,N)获得.\n" +
                                               "V:\t观察方向.\n" +
                                               "N:\t顶点的单位法线向量.\n" +
                                               "L:\t顶点指向光源的单位向量.\n" +
                                               "Shininess:\t乘方运算来模拟高光的变化.");
            ShaderReferenceUtil.DrawOneContent("Blinn-Phong", "Specular = SpecularColor * Ks * pow(max(0,dot(N,H)), Shininess)\n" +
                                               "Specular:\t最终物体上的反射高光光强.\n" +
                                               "SpecularColor:\t反射光的颜色.\n" +
                                               "Ks:\t反射强度系数.\n" +
                                               "N:\t顶点的单位法线向量.\n" +
                                               "H:\t入射光线L与视线V的中间向量,也称为半角向量H = normalize(L+V).\n" +
                                               "Shininess:\t乘方运算来模拟高光的变化.");
            ShaderReferenceUtil.DrawOneContent("Disney Principled BRDF", "f(l,v) = diffuse + D(h)F(v,h)G(l,v,h)/4cos(n·l)cos(n·v)\n" +
                                               "f(l,v):\t双向反射分布函数的最终值,l表示光的方向,v表示视线的方向.\n" +
                                               "diffuse:\t漫反射.\n" +
                                               "D(h):\t法线分布函数(Normal Distribution Function),描述微面元法线分布的概率,即朝向正确的法线浓度.h为半角向量,表示光的方向与反射方向的半角向量,只有物体的微表面法向m = h时,才会反射到视线中.\nD(h) = roughness^2 / π((n·h)^2(roughness^2-1)+1)^2\n" +
                                               "F(v,h):\t菲涅尔方程(Fresnel Equation),描述不同的表面角下表面所反射的光线所占的比率.\nF(v,h) = F0 + (1-F0)(1-(v·h))^5(F0是0度入射角的菲涅尔反射值)\n" +
                                               "G(l,v,h):\t几何函数(Geometry Function),描述微平面自成阴影的属性,即微表面法向m = h的并未被遮蔽的表面点的百分比.\n" +
                                               "4cos(n·l)cos(n·v):\t校正因子(correctionfactor)作为微观几何的局部空间和整个宏观表面的局部空间之间变换的微平面量的校正.");

            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawTitle("ShadowMap阴影");
                ShaderReferenceUtil.DrawOneContent("生成阴影", "添加\"LightMode\" = \"ShadowCaster\"的Pass.\n" +
                                                   "1.appdata中声明float4 vertex:POSITION;和half3 normal:NORMAL;这是生成阴影所需要的语义.\n" +
                                                   "2.v2f中添加V2F_SHADOW_CASTER;用于声明需要传送到片断的数据.\n" +
                                                   "3.在顶点着色器中添加TRANSFER_SHADOW_CASTER_NORMALOFFSET(o),主要是计算阴影的偏移以解决不正确的Shadow Acne和Peter Panning现象.\n" +
                                                   "4.在片断着色器中添加SHADOW_CASTER_FRAGMENT(i)");
                ShaderReferenceUtil.DrawOneContent("采样阴影", "" +
                                                   "1.在v2f中添加UNITY_SHADOW_COORDS(idx),unity会自动声明一个叫_ShadowCoord的float4变量,用作阴影的采样坐标.\n" +
                                                   "2.在顶点着色器中添加TRANSFER_SHADOW(o),用于将上面定义的_ShadowCoord纹理采样坐标变换到相应的屏幕空间纹理坐标,为采样阴影纹理使用.\n" +
                                                   "3.在片断着色器中添加UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos),其中atten即存储了采样后的阴影.");

                ShaderReferenceUtil.DrawTitle("Global Illumination 全局照明GI");
                ShaderReferenceUtil.DrawOneContent("产生间接光照", "添加\"LightMode\" = \"Meta\"的Pass.\n" +
                                                   "可参考内置Shader中的Meta Pass.");

                ShaderReferenceUtil.DrawTitle("Light Probe 光照探针");
                ShaderReferenceUtil.DrawOneContent("规则01", "当逐像素平行灯标记为Mixed时,同时场景内有LightProbe时,那么当前平行灯的光照值会自动被LightProbe影响,所以不管物体Shader中是否有SH相关的运算,都会受到LightProbe的影响.");
                ShaderReferenceUtil.DrawOneContent("规则02", "当逐像素平行灯标记为Baked时,同时场景内有LightProbe时,那么需要自行在物体Shader中添加SH相关的运算,才会受到LightProbe的影响.");

                ShaderReferenceUtil.DrawTitle("Reflection Probe 反射探针");
                ShaderReferenceUtil.DrawOneContent("反射探针的采样", "反射探针中当前激活的CubeMap存储在unity_SpecCube0当中,必须要用UNITY_SAMPLE_TEXCUBE进行采样,然后需要对其进行解码\n" +
                                                   "   half3 worldView = normalize (UnityWorldSpaceViewDir (i.worldPos));\n" +
                                                   "   half3 R = reflect (-worldView, N);\n" +
                                                   "   half4 cubemap = UNITY_SAMPLE_TEXCUBE (unity_SpecCube0, R);\n" +
                                                   "   half3 skyColor = DecodeHDR (cubemap, unity_SpecCube0_HDR);");

                ShaderReferenceUtil.DrawTitle("Fog 雾效");
                ShaderReferenceUtil.DrawOneContent("unity_FogColor", "内置雾效的颜色");
                ShaderReferenceUtil.DrawOneContent("方案一:", "常规方案\n" +
                                                   "1.#pragma multi_compile_fog声明雾效所需要的内置变体:FOG_LINEAR FOG_EXP FOG_EXP2.\n" +
                                                   "2.UNITY_FOG_COORDS(idx): 声明顶点传入片断中的雾效插值器(fogCoord).\n" +
                                                   "3.UNITY_TRANSFER_FOG(o,o.vertex): 在顶点着色器中计算雾效采样.\n" +
                                                   "4.UNITY_APPLY_FOG(i.fogCoord, col): 在片断着色器中进行雾效颜色混合.");
                ShaderReferenceUtil.DrawOneContent("方案二:", "当在v2f中有定义worldPos时,可以把worldPos.w利用起来做为雾效值.\n" +
                                                   "1.#pragma multi_compile_fog声明雾效所需要的内置变体:FOG_LINEAR FOG_EXP FOG_EXP2.\n" +
                                                   "2.UNITY_TRANSFER_FOG_COMBINED_WITH_WORLD_POS(o,o.worldPos): 在顶点着色器中添加,o.worldPos表示世界空间下的顶点坐标.\n" +
                                                   "3.UNITY_EXTRACT_FOG_FROM_WORLD_POS(i): 在片断着色器中添加.\n" +
                                                   "4.UNITY_APPLY_FOG(_unity_fogCoord, c): 在片断着色器中进行雾效颜色混合.");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawTitle("获取主平行灯");
                ShaderReferenceUtil.DrawOneContent("Light light = GetMainLight();", "获取主平行灯相关参数:\n" +
                                                   "light.direction : 主平行灯的方向.\n" +
                                                   "light.color : 主平行灯的颜色.\n" +
                                                   "light.distanceAttenuation : 主平行灯的CullingMask,如果希望对象受CullingMask正常影响,就需要乘上它.\n" +
                                                   "light.shadowAttenuation : 在此函数下为1.");
                ShaderReferenceUtil.DrawTitle("Fog 雾效");
                ShaderReferenceUtil.DrawOneContent("实现方法", "#pragma multi_compile_fog\n" +
                                                   "float fogCoord  : TEXCOORD1;\t//在Varyings中定义fogCoord\n" +
                                                   "o.fogCoord = ComputeFogFactor(o.positionCS.z);\t//在顶点着色器中添加\n" +
                                                   "c.rgb = MixFog(c.rgb, i.fogCoord);\t//在片断着色器中添加");
                break;
            }
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 26
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Math");
            ShaderReferenceUtil.DrawOneContent("abs (x)", "取绝对值,即正值返回正值,负值返回的还是正值,x值也可以为向量\n" +
                                               "float abs(float a)\n" +
                                               "{\n" +
                                               "    return max(-a, a);\n" +
                                               "}");

            ShaderReferenceUtil.DrawOneContent("acos (x)", "反余切函数,输入参数范围为[-1, 1],返回[0, π] 区间的角度值");
            ShaderReferenceUtil.DrawOneContent("all (a)", "当a或a的所有分量都为true或者非0时返回1(true),否则返回0(false).\n" +
                                               "bool all(bool4 a)\n" +
                                               "{\n" +
                                               "    return a.x && a.y && a.z && a.w;\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("any (a)", "如果a=0或者a中的所有分量为0,则返回0(false);否则返回1(true).\n" +
                                               "bool any(bool4 a)\n" +
                                               "{\n" +
                                               "    return a.x || a.y || a.z || a.w;\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("asin (x)", "返回x的反正弦值,范围为(-π/2,π/2)");
            ShaderReferenceUtil.DrawOneContent("atan2 (y,x)", "返回y/x的反正切值");
            ShaderReferenceUtil.DrawOneContent("atan (x)", "返回x的反正切值,范围为(-π/2,π/2),表示弧度");
            ShaderReferenceUtil.DrawOneContent("ceil (x)", "对x进行向上取整,即x=0.1返回1,x=1.5返回2,x=-0.3返回0\n" +
                                               "float ceil(float x)\n" +
                                               "{\n" +
                                               "    return -floor(-x);\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("clamp(x,a,b)", "如果 x 值小于 a,则返回 a;如果 x 值大于 b,返回 ;否则,返回 x.\n" +
                                               "float clamp(float x, float a, float b)\n" +
                                               "{\n" +
                                               "    return max(a, min(b, x));\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("clip (x)", "如果x<0则裁剪掉此片断\n" +
                                               "void clip(float4 x)\n" +
                                               "{\n" +
                                               "    if (any(x < 0))\n" +
                                               "    discard;\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("cosh (x)", "双曲余弦函数\n" +
                                               "float cosh(float x)\n" +
                                               "{\n" +
                                               "    return 0.5 * (exp(x) + exp(-x));\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("cross (a,b)", "返回两个三维向量a与b的叉积\n" +
                                               "float3 cross(float3 a, float3 b)\n" +
                                               "{\n" +
                                               "    return a.yzx * b.zxy - a.zxy * b.yzx;\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("degrees (x)", "将x从弧度转换成角度\n" +
                                               "float degrees(float x)\n" +
                                               "{\n" +
                                               "    return 57.29577951 * x;\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("determinant (M)", "返回方阵M的行列式,注意只有方阵才有行列式");
            ShaderReferenceUtil.DrawOneContent("dot (a,b)", "点乘,a和b可以为标量也可以为向量,其计算结果是两个向量夹角的余弦值,相当于|a|*|b|*cos(θ)或者a.x*b.x+a.y*b.y+a.z*b.z\na和b的位置无所谓前后,结果都是一样的");
            ShaderReferenceUtil.DrawOneContent("distance (a,b)", "返回a,b间的距离.\n" +
                                               "float distance(a, b)\n" +
                                               "{\n" +
                                               "    float3 v = b - a;\n" +
                                               "    return sqrt(dot(v, v));\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("exp(x)", "计算e的x次方,e = 2.71828182845904523536");
            ShaderReferenceUtil.DrawOneContent("exp2 (x)", "计算2的x次方");

            ShaderReferenceUtil.DrawOneContent("floor (x)", "对x值进行向下取整(去尾求整)\n比如:floor (0.6) = 0.0,floor (-0.6) = -1.0");
            ShaderReferenceUtil.DrawOneContent("fmod (x,y)", "返回x/y的余数。如果y为0,结果不可预料,注意!如果x为负值,返回的结果也是负值!\n" +
                                               "float fmod(float a, float b)\n" +
                                               "{\n" +
                                               "    float c = frac(abs(a / b)) * abs(b);\n" +
                                               "    return (a < 0) ? -c : c;   /* if ( a < 0 ) c = 0-c */\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("frac (x)", "返回x的小数部分\n" +
                                               "float frac(float x)\n" +
                                               "{\n" +
                                               "    return x - floor(x);\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("length (v)", "返回一个向量的模,即 sqrt(dot(v,v))");
            ShaderReferenceUtil.DrawOneContent("lerp (A,B,alpha)", "线性插值.\n如果alpha=0,则返回A;\n如果alpha=1,则返回B;\n否则返回A与B的混合值;内部执行:A + alpha*(B-A)\n" +
                                               "float3 lerp(float3 A, float3 B, float alpha)\n" +
                                               "{\n" +
                                               "    return A + alpha*(B-A);\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("log (x)", "返回x的自然对数");
            ShaderReferenceUtil.DrawOneContent("max (a,b)", "比较两个标量或等长向量元素,返回最大值");
            ShaderReferenceUtil.DrawOneContent("min (a,b)", "比较两个标量或等长向量元素,返回最小值");
            ShaderReferenceUtil.DrawOneContent("mul (M,V)", "表示矩阵M与向量V进行点乘,结果就是对向量V进行M矩阵变换后的值");

            ShaderReferenceUtil.DrawOneContent("normalize (v)", "返回一个向量的归一化版本(方向一样,但是模为1)" +
                                               "\nnormalize(v) = rsqrt(dot(v,v))*v; rsqrt返回的是平方根的倒数");
            ShaderReferenceUtil.DrawOneContent("pow (x,y)", "返回x的y次方");
            ShaderReferenceUtil.DrawOneContent("reflect(I, N)", "根据入射光方向向量 I ,和顶点法向量 N ,计算反射光方向向量。其中 I 和 N 必须被归一化,需要非常注意的是,这个 I 是指向顶点的;函数只对三元向量有效。");
            ShaderReferenceUtil.DrawOneContent("refract(I,N,eta)", "计算折射向量, I 为入射光线, N 为法向量, eta 为折射系数;其中 I 和 N 必须被归一化,如果 I 和 N 之间的夹角太大,则返回( 0 , 0 , 0 ),也就是没有折射光线; I 是指向顶点的;函数只对三元向量有效。");
            ShaderReferenceUtil.DrawOneContent("round (x)", "返回x四舍五入的值");
            ShaderReferenceUtil.DrawOneContent("rsqrt (x)", "返回x的平方根倒数,注意x不能为0.相当于 pow(x, -0.5)");
            ShaderReferenceUtil.DrawOneContent("saturate (x)", "如果x<0返回0,如果x>1返回1,否则返回x.");
            ShaderReferenceUtil.DrawOneContent("sqrt (x)", "返回x的平方根.");
            ShaderReferenceUtil.DrawOneContent("step (a,b)", "如果a<b返回1,否则返回0.");
            ShaderReferenceUtil.DrawOneContent("sign (x)", "如果x=0返回0,如果x>0返回1,如果x<0返回-1.");
            ShaderReferenceUtil.DrawOneContent("smoothstep (min,max,x)", "float smoothstep (float min, float max, float x)\n" +
                                               "{\n" +
                                               "\tfloat t = saturate ((x - min) / (max - min));\n" +
                                               "\treturn t * t * (3.0 - (2.0 * t));\n" +
                                               "}\n" +
                                               "如果 x 比min 小,返回 0\n如果 x 比max 大,返回 1\n如果 x 处于范围 [min,max]中,则返回 0 和 1 之间的值(按值在min和max间的比例).\n如果只想要线性过渡,并不需要平滑的话,可以直接使用saturate((x - min)/(max - min))");

            ShaderReferenceUtil.DrawTitle("纹理采样");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("tex1D(samper1D tex,float s)", "一维纹理采样");
                ShaderReferenceUtil.DrawOneContent("tex2D(samper2D tex,float2 s)", "二维纹理采样");
                ShaderReferenceUtil.DrawOneContent("tex2Dlod(samper2D tex,float4 s)", "二维纹理采样,s.w表示采样的是mipmap的几级,仅在ES3.0以上支持.");
                ShaderReferenceUtil.DrawOneContent("tex2DProj(samper2D tex,float4 s)", "二维投影纹理采样");
                ShaderReferenceUtil.DrawOneContent("texCUBE(samperCUBE tex,float3 s)", "立方体纹理采样");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("TEXTURE2D (textureName);", "二维纹理的定义(纹理与采样器分离定义),此功能在OpenGL ES2.0上不支持,会使用原来sampler2D的形式.\n" +
                                                   "textureName:Properties中声明的2D纹理.");
                ShaderReferenceUtil.DrawOneContent("SAMPLER(samplerName);", "采样器的定义(纹理与采样器分离定义),采样器是指纹理的过滤模式与重复模式,此功能在OpenGL ES2.0上不支持,相当于没写.\n" +
                                                   "1.SAMPLER(sampler_textureName):sampler+纹理名称,这种定义形式是表示采用textureName这个纹理Inspector面板中的采样方式.\n" +
                                                   "2.SAMPLER(_filter_wrap):比如SAMPLER(point_clamp),使用自定义的采样器设置,自定义的采样器一定要同时包含过滤模式<filter>与重复模式<wrap>的设置.\n" +
                                                   "3.SAMPLER(_filter_wrapU_wrapV):比如SAMPLER(linear_clampU_mirrorV),可同时设置重复模式的U与V的不同值.\n" +
                                                   "4.filter:point/linear/triLinear\n" +
                                                   "5.wrap:clamp/repeat/mirror/mirrorOnce");
                ShaderReferenceUtil.DrawOneContent("float4 [textureName]_ST;", "获取纹理的Tiling(.xy)和Offset(.zw)");
                ShaderReferenceUtil.DrawOneContent("float4 [textureName]_TexelSize;", "获取纹理的宽高分之一(.xy)和宽高(.zw)");
                ShaderReferenceUtil.DrawOneContent("SAMPLE_TEXTURE2D(textureName, samplerName, coord);", "进行二维纹理采样操作\n" +
                                                   "textureName:Properties中声明的2D纹理名称\n" +
                                                   "samplerName:此纹理所使用的采样器设置" +
                                                   "coord:采样用的UV");
                break;
            }

            ShaderReferenceUtil.DrawTitle("常用指令");
            ShaderReferenceUtil.DrawOneContent("mov dest, src1", "dest = src1");
            ShaderReferenceUtil.DrawOneContent("add dest, src1, src2", "dest = src1 + src2 (可通过在src2前加-,实现减功能)");
            ShaderReferenceUtil.DrawOneContent("mul dest, src1, src2", "dest = src1 * src2");
            ShaderReferenceUtil.DrawOneContent("div dest, src1, src2", "dest = src1 / src2");
            ShaderReferenceUtil.DrawOneContent("mad dest, src1, src2 , src3", "dest = src1 * src2 + src3");
            ShaderReferenceUtil.DrawOneContent("dp2 dest, src1, src2", "(src1.x * src2.x) + (src1.y * src2.y)");
            ShaderReferenceUtil.DrawOneContent("dp3 dest, src1, src2", "(src1.x * src2.x) + (src1.y * src2.y) + (src1.z * src2.z)");
            ShaderReferenceUtil.DrawOneContent("dp4 dest, src1, src2", "(src1.x * src2.x) + (src1.y * src2.y) + (src1.z * src2.z) + (src1.w * src2.w)");
            ShaderReferenceUtil.DrawOneContent("rsq dest, src1", "rsqrt(src1) 对src1进行平方根的倒数,然后将值存入dest中");
            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            ShaderReferenceUtil.DrawTitle("空间变换(矩阵)");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MVP", "模型空间>>投影空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_MV", "模型空间>>观察空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_V", "视图空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_P", "投影空间");
                ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_VP", "视图空间>投影空间");
                //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_T_MV", "");
                //ShaderReferenceUtil.DrawOneContent("UNITY_MATRIX_IT_MV", "");
                ShaderReferenceUtil.DrawOneContent("unity_ObjectToWorld", "本地空间>>世界空间");
                ShaderReferenceUtil.DrawOneContent("unity_WorldToObject", "世界空间>本地空间");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("GetObjectToWorldMatrix()", "本地空间到世界空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToObjectMatrix()", "世界空间到本地空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToViewMatrix()", "世界空间到观察空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetWorldToHClipMatrix()", "世界空间到齐次裁剪空间的矩阵");
                ShaderReferenceUtil.DrawOneContent("GetViewToHClipMatrix()", "观察空间到齐次裁剪空间的矩阵");
                break;
            }
            ShaderReferenceUtil.DrawOneContent("unity_WorldToCamera", "世界空间到观察空间的矩阵");
            ShaderReferenceUtil.DrawOneContent("unity_CameraToWorld", "观察空间到世界空间的矩阵");

            ShaderReferenceUtil.DrawTitle("空间变换(方法)");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                ShaderReferenceUtil.DrawOneContent("UnityObjectToClipPos(v.vertex)", "将模型空间下的顶点转换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("UnityObjectToWorldNormal(v.normal)", "将模型空间下的法线转换到世界空间(已归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityObjectToWorldDir (v.tangent)", "将模型空间下的切线转换到世界空间(已归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityWorldSpaceLightDir (i.worldPos)", "世界空间下顶点到灯光方向的向量(未归一化)");
                ShaderReferenceUtil.DrawOneContent("UnityWorldSpaceViewDir (i.worldPos)", "世界空间下顶点到视线方向的向量(未归一化)");
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("float3 TransformObjectToWorld (float3 positionOS)", "从本地空间变换到世界空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformWorldToObject (float3 positionWS)", "从世界空间变换到本地空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformWorldToView(float3 positionWS)", "从世界空间变换到视图空间");

                ShaderReferenceUtil.DrawOneContent("float4 TransformObjectToHClip(float3 positionOS)", "将模型空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float4 TransformWorldToHClip(float3 positionWS)", "将世界空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float4 TransformWViewToHClip (float3 positionVS)", "将视图空间下的顶点变换到齐次裁剪空间");
                ShaderReferenceUtil.DrawOneContent("float3 TransformObjectToWorldNormal (float3 normalOS)", "将法线从本地空间变换到世界空间(已归一化)");
                break;
            }

            ShaderReferenceUtil.DrawTitle("基础变换矩阵");
            ShaderReferenceUtil.DrawOneContent("平移矩阵", "float4x4 M_translate = float4x4(\n" +
                                               "\t1, 0, 0, T.x,\n" +
                                               "\t0, 1, 0, T.y,\n" +
                                               "\t0, 0, 1, T.z,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("缩放矩阵", "float4x4 M_scale = float4x4(\n" +
                                               "\tS.x, 0, 0, 0,\n" +
                                               "\t0, S.y, 0, 0,\n" +
                                               "\t0, 0, S.z, 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(X轴)", "float4x4 M_rotationX = float4x4(\n" +
                                               "\t1, 0, 0, 0,\n" +
                                               "\t0, cos(θ), sin(θ), 0,\n" +
                                               "\t0, -sin(θ), cos(θ), 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(Y轴)", "float4x4 M_rotationY = float4x4(\n" +
                                               "\tcos(θ), 0, sin(θ), 0,\n" +
                                               "\t0, 1, 0, 0,\n" +
                                               "\t-sin(θy), 0, cos(θ), 0,\n" +
                                               "\t0, 0, 0, 1);");

            ShaderReferenceUtil.DrawOneContent("旋转矩阵(Z轴)", "float4x4 M_rotationZ = float4x4(\n" +
                                               "\tcos(θ), sin(θ), 0, 0,\n" +
                                               "\t-sin(θ), cos(θ), 0, 0,\n" +
                                               "\t0, 0, 1, 0,\n" +
                                               "\t0, 0, 0, 1);");

            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("Cull");
            ShaderReferenceUtil.DrawOneContent("Cull Back | Front | Off", "背面剔除,默认值为Back。\nBack:表示剔除背面,也就是显示正面,这也是最常用的设置。\nFront:表示剔除前面,只显示背面。\nOff:表示关闭剔除,也就是正反面都渲染。");

            ShaderReferenceUtil.DrawTitle("深度缓冲");
            ShaderReferenceUtil.DrawOneContent("ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)", "深度测试,拿当前像素的深度值与深度缓冲中的深度值进行比较,默认值为LEqual。"
                                               + "\nLess:小于,表示如果当前像素的深度值小于深度缓冲中的深度值,则通过,以下类同。"
                                               + "\nGreater:大于。"
                                               + "\nLequal:小于等于。"
                                               + "\nGequal:大于等于。"
                                               + "\nEqual:等于。"
                                               + "\nNotEqual:不等于。"
                                               + "\nAlways:永远通过。");
            ShaderReferenceUtil.DrawOneContent("ZWrite On | Off", "深度写入,默认值为On。\nOn:向深度缓冲中写入深度值。\nOff:关闭深度写入。");
            ShaderReferenceUtil.DrawOneContent("Offset Factor, Units", "深度偏移,offset = (m * factor) + (r * units),默认值为0,0"
                                               + "\nm:指多边形的深度斜率(在光栅化阶段计算得出)中的最大值,多边形越是与近裁剪面平行,m值就越接近0。"
                                               + "\nr:表示能产生在窗口坐标系的深度值中可分辨的差异的最小值,r是由具体实现OpenGL的平台指定的一个常量。"
                                               + "\n结论:一个大于0的offset会把模型推远,一个小于0的offset会把模型拉近。");

            ShaderReferenceUtil.DrawTitle("颜色遮罩");
            ShaderReferenceUtil.DrawOneContent("ColorMask RGB | A | 0 | R、G、B、A的任意组合", "颜色遮罩,默认值为:RGBA,表示写入RGBA四个通道。");

            ShaderReferenceUtil.DrawTitle("混合");
            ShaderReferenceUtil.DrawOneContent("说明", "颜色混合,源颜色与目标颜色以给定的公式进行混合出最终的新颜色。\n源颜色:当前Shader计算出的颜色。\n目标颜色:已经存在颜色缓存中的颜色。默认值为Blend Off,即表示关闭混合。\n在混合时可以针对某个RT做混合,比如Blend 3 One One,就是对RenderTarget3做混合。");
            ShaderReferenceUtil.DrawOneContent("Blend SrcFactor DstFactor", "SrcFactor为源颜色,DstFactor为目标颜色,将两者按Op中指定的操作进行混合。");
            ShaderReferenceUtil.DrawOneContent("Blend SrcFactor DstFactor, SrcFactorA DstFactorA", "对RGB和A通道分别做混合操作。");
            ShaderReferenceUtil.DrawOneContent("BlendOp Op", "混合时的操作运算符,默认值为Add(加法操作)。");
            ShaderReferenceUtil.DrawOneContent("BlendOp OpColor, OpAlpha", "对RGB和A通道分别指定混合运算符。");
            ShaderReferenceUtil.DrawOneContent("AlphaToMask On | Off", "当值为On时,在使用MSAA时,会根据像素结果将alpha值进行修改多重采样覆盖率,对植被和其他经过alpha测试的着色器非常有用。");
            ShaderReferenceUtil.DrawOneContent("Blend factors", "混合因子"
                                               + "\nOne:源或目标的完整值"
                                               + "\nZero:0"
                                               + "\nSrcColor:源的颜色值"
                                               + "\nSrcAlpha:源的Alpha值"
                                               + "\nDstColor:目标的颜色值"
                                               + "\nDstAlpha:目标的Alpha值"
                                               + "\nOneMinusSrcColor:1-源颜色得到的值"
                                               + "\nOneMinusSrcAlpha:1-源Alpha得到的值"
                                               + "\nOneMinusDstColor:1-目标颜色得到的值"
                                               + "\nOneMinusDstAlpha:1-目标Alpha得到的值");
            ShaderReferenceUtil.DrawOneContent("Blend Types", "常用的几种混合类型"
                                               + "\nBlend SrcAlpha OneMinusSrcAlpha// Traditional transparency"
                                               + "\nBlend One OneMinusSrcAlpha// Premultiplied transparency"
                                               + "\nBlend One One"
                                               + "\nBlend OneMinusDstColor One // Soft Additive"
                                               + "\nBlend DstColor Zero // Multiplicative"
                                               + "\nBlend DstColor SrcColor // 2x Multiplicative");
            ShaderReferenceUtil.DrawOneContent("Blend operations", "混合操作的具体运算符"
                                               + "\nAdd:源+目标"
                                               + "\nSub:源-目标"
                                               + "\nRevSub:目标-源"
                                               + "\nMin:源与目标中最小值"
                                               + "\nMax:源与目标中最大值"
                                               + "\n以下仅用于DX11.1中"
                                               + "\nLogicalClear"
                                               + "\nLogicalSet"
                                               + "\nLogicalCopy"
                                               + "\nLogicalCopyInverted"
                                               + "\nLogicalNoop"
                                               + "\nLogicalInvert"
                                               + "\nLogicalAnd"
                                               + "\nLogicalNand"
                                               + "\nLogicalOr"
                                               + "\nLogicalNor"
                                               + "\nLogicalXor"
                                               + "\nLogicalEquiv"
                                               + "\nLogicalAndReverse"
                                               + "\nLogicalAndInverted"
                                               + "\nLogicalOrReverse"
                                               + "\nLogicalOrInverted");
            EditorGUILayout.EndScrollView();
        }
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
            ShaderReferenceUtil.DrawTitle("UV");
            ShaderReferenceUtil.DrawOneContent("UV重映射到中心位置", "float2 centerUV = uv * 2 - 1\n将UV值重映射为(-1,-1)~(1,1),也就是将UV的中心点从左下角移动到中间位置。");
            ShaderReferenceUtil.DrawOneContent("画圆", "float circle = smoothstep(_Radius, (_Radius + _CircleFade), length(uv * 2 - 1));\n利用UV来画圆,通过_Radius来调节大小,_CircleFade来调节边缘虚化程序。");
            ShaderReferenceUtil.DrawOneContent("画矩形", "float2 centerUV = abs(i.uv.xy * 2 - 1);\n" +
                                               "float rectangleX = smoothstep(_Width, (_Width + _RectangleFade), centerUV.x);\n" +
                                               "float rectangleY = smoothstep(_Heigth, (_Heigth + _RectangleFade), centerUV.y);\n" +
                                               "float rectangleClamp = clamp((rectangleX + rectangleY), 0.0, 1.0);\n" +
                                               "利用UV来画矩形,_Width调节宽度,_Height调节高度,_RectangleFade调节边缘虚化度。");
            ShaderReferenceUtil.DrawOneContent("黑白棋盘格", "float2 uv = i.uv;\n" +
                                               "uv = floor(uv) * 0.5;\n" +
                                               "float c = frac(uv.x + uv.y) * 2;\n" +
                                               "return c;");
            ShaderReferenceUtil.DrawOneContent("极坐标", "float2 centerUV = (i.uv * 2 - 1);\n" +
                                               "float atan2UV = 1 - abs(atan2(centerUV.g, centerUV.r) / 3.14);\n" +
                                               "利用UV来实现极坐标.");
            ShaderReferenceUtil.DrawOneContent("将0-1的值控制在某个自定义的区间内", "frac(x*n+n);\n比如frac(i.uv*3.33+3.33);就是将0-1的uv值重新定义为0.33-0.66");
            ShaderReferenceUtil.DrawOneContent("随机", "1.frac(sin(dot(i.uv.xy, float2(12.9898, 78.233))) * 43758.5453);\n2.frac(sin(x)*n);");
            ShaderReferenceUtil.DrawOneContent("旋转", "fixed t=_Time.y;\nfloat2 rot= cos(t)*i.uv+sin(t)*float2(i.uv.y,-i.uv.x);");
            ShaderReferenceUtil.DrawOneContent("序列图", "splitUV是把原有的UV重新定位到左上角的第一格UV上,_Sequence.xy表示的是纹理是由几x几的格子组成的,_Sequence.z表示的是走序列的快慢." +
                                               "\nfloat2 splitUV = uv * (1/_Sequence.xy) + float2(0,_Sequence.y - 1/_Sequence.y);" +
                                               "\nfloat time = _Time.y * _Sequence.z;" +
                                               "\nuv = splitUV + float2(floor(time *_Sequence.x)/_Sequence.x,1-floor(time)/_Sequence.y);");
            ShaderReferenceUtil.DrawOneContent("HSV2RGB方法01", "fixed3 hsv2rgb (fixed3 c)\n" +
                                               "{\n" +
                                               "\tfloat2 rot= cos(t)*i.uv+sin(t)*float2(i.uv.y,-i.uv.x);\n" +
                                               "\tfloat3 k = fmod (float3 (5, 3, 1) + c.x * 6, 6);\n" +
                                               "\treturn c.z - c.z * c.y * max (min (min (k, 4 - k), 1), 0);\n" +
                                               "}");
            ShaderReferenceUtil.DrawOneContent("HSV2RGB方法02(更优化)", "fixed3 hsv2rgb (fixed3 c)\n" +
                                               "{\n" +
                                               "\tfloat4 K = float4 (1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" +
                                               "\tfloat3 p = abs (frac (c.xxx + K.xyz) * 6.0 - K.www);\n" +
                                               "\treturn c.z * lerp (K.xxx, saturate (p - K.xxx), c.y);\n" +
                                               "}");
            ShaderReferenceUtil.DrawTitle("顶点");
            ShaderReferenceUtil.DrawOneContent("模型中心点坐标", "float3 objCenterPos = mul( unity_ObjectToWorld, float4( 0, 0, 0, 1 ) ).xyz;\n" +
                                               "在Shader中获取当前模型的中心点,其实就是将(0,0,0)点从本地转换到世界空间坐标下即可,在制作对象从下往之类的效果时常用到。");
            ShaderReferenceUtil.DrawOneContent("BillBoard", "在Properties中添加:\n\n" +
                                               "[Enum(BillBoard,1,VerticalBillboard,0)]BillBoardType(\"BillBoard Type\",float) = 1\n\n" +
                                               "在顶点着色器中添加:\n\n" +
                                               "//将相机从世界空间转换到模型的本地空间中,而这个转换后的相机坐标即是点也是模型中心点(0,0,0)到相机的方向向量,如果按照相机空间来定义的话,可以把这个向量定义为相机空间下的Z值\n" +
                                               "float3  cameraOS_Z = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));\n" +
                                               "//BillBoardType=0时,圆柱形BillBoard;BillBoard=1时,圆形BillBoard;\n" +
                                               "cameraOS_Z.y = cameraOS_Z.y * BillBoardType;\n" +
                                               "//归一化,使其为长度不变模为1的向量\n" +
                                               "cameraOS_Z = normalize(cameraOS_Z);\n" +
                                               "//假设相机空间下的Y轴向量为(0,1,0)\n" +
                                               "cameraOS_Y = float3(0,1,0);\n" +
                                               "//利用叉积求出相机空间下的X轴向量\n" +
                                               "float3 cameraOS_X = normalize(cross(cameraOS_Z,cameraOS_Y));\n" +
                                               "//再次利用叉积求出相机空间下的Y轴向量\n" +
                                               "cameraOS_Y = cross(cameraOS_X,cameraOS_Z);\n" +
                                               "//通过向量与常数相乘来把顶点的X轴与Y对应到cameraOS的X与Y轴向上\n" +
                                               "float3 billboardPositionOS = cameraOS_X * v.vertex.x + cameraOS_Y * v.vertex.y;\n" +
                                               "o.pos = UnityObjectToClipPos(billboardPositionOS);");
            ShaderReferenceUtil.DrawOneContent("网格阴影", "half4 worldPos = mul(unity_ObjectToWorld, v.vertex);\n" +
                                               "worldPos.y = 2.47;\n" +
                                               "worldPos.xz += fixed2(阴影X方向,阴影Z方向)*v.vertex.y;\n" +
                                               "o.pos = mul(UNITY_MATRIX_VP,worldPos);");

            ShaderReferenceUtil.DrawTitle("其它 ");
            ShaderReferenceUtil.DrawOneContent("菲涅尔 ", "fixed4 rimColor = fixed4 (0, 0.4, 1, 1);\n " +
                                               "half3 worldViewDir = normalize (UnityWorldSpaceViewDir (i.worldPos));\n " +
                                               "float ndotv = dot (i.normal, worldViewDir);\n " +
                                               "float fresnel = (0.2 + 2.0 * pow (1.0 - ndotv, 2.0));\n " +
                                               "fixed4 col = rimColor * fresnel;");
            ShaderReferenceUtil.DrawOneContent("XRay射线 ", "1. 新建一个Pass\n2.设置自己想要的Blend\n3.Zwrite Off关闭深度写入\n4.Ztest greater深度测试设置为大于 ");
            EditorGUILayout.EndScrollView();
        }
Ejemplo n.º 30
0
        public void DrawMainGUI()
        {
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            ShaderReferenceUtil.DrawTitle("Target platform");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_D3D11", "Direct3D 11");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLCORE", "桌面OpenGL核心(GL3/4)");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLES", "OpenGl ES 2.0");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_GLES3", "OpenGl ES 3.0/3.1");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_METAL", "IOS/Mac Metal");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_VULKAN", "Vulkan");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_D3D11_9X", "IOS/Mac Metal");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_PS4", "PS4平台,SHADER_API_PSSL同时也会被定义");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_XBOXONE", "Xbox One");
            ShaderReferenceUtil.DrawOneContent("SHADER_API_MOBILE", "所有移动平台(GLES/GLES3/METAL)");
            //ShaderReferenceUtil.DrawOneContent("SHADER_TARGET_GLSL", "");

            ShaderReferenceUtil.DrawTitle("流程控制");
            ShaderReferenceUtil.DrawOneContent("#define UNITY_BRANCH        [branch]", "添加在if语句上面,表示此语句会根据判断只执行符合条件的代码,有跳转指令.");
            ShaderReferenceUtil.DrawOneContent("#define UNITY_FLATTEN       [flatten]", "添加在if语句上面,表示此语句会执行全部代码,然后根据条件来选择某个具体的结果,没有跳转指令.");
            ShaderReferenceUtil.DrawOneContent("#define UNITY_UNROLL        [unroll]", "添加在for语句上面,表示此循环在编绎时会展开所有循环代码,以必竟for循环中的跳转指令,会产生较多的编绎代码.");
            ShaderReferenceUtil.DrawOneContent("#define UNITY_UNROLLX(_x)   [unroll(_x)]", "添加在for语句上面,功能同上,同时可以指定具体的展开次数.");
            ShaderReferenceUtil.DrawOneContent("#define UNITY_LOOP          [loop]", "添加在for语句上面,表示此循环不可展开,正常执行跳转.");

            ShaderReferenceUtil.DrawTitle("Shader target model");
            ShaderReferenceUtil.DrawOneContent("#if SHADER_TARGET < 30", "对应于#pragma target的值,2.0就是20,3.0就是30");

            ShaderReferenceUtil.DrawTitle("Unity version");
            ShaderReferenceUtil.DrawOneContent("#if UNITY_VERSION >= 500", "Unity版本号判断,500表示5.0.0");

            ShaderReferenceUtil.DrawTitle("Platform difference helpers");
            ShaderReferenceUtil.DrawOneContent("UNITY_UV_STARTS_AT_TOP", "一般此判断当前平台是DX(UV原点在左上角)还是OpenGL(UV原点在左下角)");
            ShaderReferenceUtil.DrawOneContent("UNITY_NO_SCREENSPACE_SHADOWS", "定义移动平台不进行Cascaded ScreenSpace Shadow.");
            ShaderReferenceUtil.DrawTitle("UI");
            ShaderReferenceUtil.DrawOneContent("UNITY_UI_CLIP_RECT", "当父级物体有Rect Mask 2D组件时激活.\n" +
                                               "需要先手动定义此变体#pragma multi_compile _ UNITY_UI_CLIP_RECT\n" +
                                               "同时需要声明:_ClipRect(一个四维向量,四个分量分别表示RectMask2D的左下角点的xy坐标与右上角点的xy坐标.)\n" +
                                               "UnityGet2DClipping (float2 position, float4 clipRect)即可实现遮罩.");

            ShaderReferenceUtil.DrawTitle("Lighting");
            ShaderReferenceUtil.DrawOneContent("UNITY_SHOULD_SAMPLE_SH", "是否进行计算SH(光照探针与顶点着色)\n" +
                                               "-当静态与动态Lightmap启用时,此项不激活.\n" +
                                               "-当静态与动态Lightmap没有启用时,此项激活.\n" +
                                               "-除ForwardBase其它Pass都不激活,每个Pass需要指定UNITY_PASS_FORWARDADD、UNITY_PASS_SHADOWCASTER等.");
            ShaderReferenceUtil.DrawOneContent("UNITY_SAMPLE_FULL_SH_PER_PIXEL", "光照贴图uv和来自SHL2的环境颜色在顶点和像素内插器中共享,在启用静态lightmap和LIGHTPROBE_SH时,在像素着色器中执行完整的SH计算。");
            ShaderReferenceUtil.DrawOneContent("HANDLE_SHADOWS_BLENDING_IN_GI", "当同时定义了SHADOWS_SCREEN与LIGHTMAP_ON时开启.");
            ShaderReferenceUtil.DrawOneContent("UNITY_SHADOW_COORDS(N)", "定义一个float4类型的变量_ShadowCoord,语义为第N个TEXCOORD.");
            ShaderReferenceUtil.DrawOneContent("V2F_SHADOW_CASTER;", "用于\"LightMode\" = \"ShadowCaster\"中,相当于定义了float4 pos:SV_POSITION.");
            // ShaderReferenceUtil.DrawOneContent ("UNITY_TRANSFER_LIGHTING(o,v.texcoord1.xy);", "");
            ShaderReferenceUtil.DrawTitle("Other");
            ShaderReferenceUtil.DrawOneContent("UNITY_SHADER_NO_UPGRADE", "另Shader不自动更新API,只需把语句用注释的形式写在shader中任意位置即可.");
            switch (ShaderReferenceEditorWindow.mPipline)
            {
            case ShaderReferenceEditorWindow.Pipline.BuildIn:
                break;

            case ShaderReferenceEditorWindow.Pipline.URP:
                ShaderReferenceUtil.DrawOneContent("UNITY_NO_DXT5nm", "法线纹理是否不采用DXT5压缩,移动平台(在编缉器下切换到Android/IOS平台也可以)是,非移动平台否.");
                ShaderReferenceUtil.DrawOneContent("UNITY_ASTC_NORMALMAP_ENCODING", "当在移动平台(Android/IOS/TVOS)中,法线纹理采用类DXT5nm的压缩时启用,可通过PlayerSetting中设置NormalMapEncoding的方式.");
                ShaderReferenceUtil.DrawOneContent("SHADERGRAPH_PREVIEW", "在ShaderGraph中的Custom Function自义定节点上使用,用于判断是否处于SG面板预览中.");
                break;
            }
            EditorGUILayout.EndScrollView();
        }