相关文章推荐
开朗的长颈鹿  ·  Java:类名的命名规则-CSDN博客·  1 年前    · 
玩命的汉堡包  ·  The RFC Clamp Loader: ...·  1 年前    · 
乐观的火锅  ·  日志管理之 Docker logs - ...·  2 年前    · 
暗恋学妹的领带  ·  Qt实现表格树控件-自绘树节点虚线 - 知乎·  2 年前    · 
纯真的长颈鹿  ·  numba,让python速度提升百倍 - 简书·  2 年前    · 
Code  ›  Unity3D Shader系列之中常用内置变量与方法_WangShade的博客
unity shader
https://blog.csdn.net/sinat_25415095/article/details/111186678
忐忑的铁板烧
2 年前
  • 1 常用变量
    • 1.1 顶点着色器输入结构体体
    • 1.2 _LightColor0
    • 1.3 _WorldSpaceLightPos0
    • 1.4 UNITY_LIGHTMODEL_AMBIENT
    • 1.5 unity_ObjectToWorld
    • 1.6 unity_WorldToObject
  • 2 常用方法
    • 2.1 局部坐标变换到裁剪空间
    • 2.2 模型空间法线变换到世界空间
    • 2.3 TRANSFORM_TEX

    TODO 未完待续…

    https://docs.unity3d.com/Manual/SL-BuiltinIncludes.html
    https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html
    https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html

    1 常用变量

    1.1 顶点着色器输入结构体体

    位于 UnityCG.cginc 。

    struct appdata_base {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
        float4 texcoord : TEXCOORD0;
        UNITY_VERTEX_INPUT_INSTANCE_ID
    struct appdata_img
        float4 vertex : POSITION;
        half2 texcoord : TEXCOORD0;
        UNITY_VERTEX_INPUT_INSTANCE_ID
    struct appdata_tan {
        float4 vertex : POSITION;
        float4 tangent : TANGENT;
        float3 normal : NORMAL;
        float4 texcoord : TEXCOORD0;
        UNITY_VERTEX_INPUT_INSTANCE_ID
    struct appdata_full {
        float4 vertex : POSITION;
        float4 tangent : TANGENT;
        float3 normal : NORMAL;
        float4 texcoord : TEXCOORD0;
        float4 texcoord1 : TEXCOORD1;
        float4 texcoord2 : TEXCOORD2;
        float4 texcoord3 : TEXCOORD3;
        fixed4 color : COLOR;
        UNITY_VERTEX_INPUT_INSTANCE_ID
    

    1.2 _LightColor0

    _LightColor0 位于UnityLightingCommon.cginc,可通过Lighting.cginc间接引入。

    • "LightMode" = "Vertex"
      会设置4个光源,并按亮度从明到暗进行排序,它们的值会存储在unity_LightColor[n], unity_LightPosition[n], unity_LightAtten[n]这些数组中。因此,[0]总会得到最亮的光源。
    • "LightMode = "ForwardBase"
      _LightColor0将会是主要的directional light的颜色。
    • "LightMode" = "ForwardAdd"
      和上面一样, _LightColor0将是该逐像素光源的颜色。
    fixed4 _LightColor0;
    

    1.3 _WorldSpaceLightPos0

    世界坐标中光源的位置或方向向量。
    如果 _WorldSpaceLightPos0.w为0,表示该光源为平行光。
    _WorldSpaceLightPos0.w为1。则表示光源为点光源或聚光灯。
    _WorldSpaceLightPos0位于UnityShaderVariables.cginc,可通过UnityCG.cginc间接引入。

    // 定义如下
    #ifdef USING_DIRECTIONAL_LIGHT
    half4 _WorldSpaceLightPos0;
    #else
    float4 _WorldSpaceLightPos0;
    #endif
    

    1.4 UNITY_LIGHTMODEL_AMBIENT

    环境光。
    UNITY_LIGHTMODEL_AMBIENT位于UnityShaderVariables.cginc,可通过UnityCG.cginc间接引入。

    // 定义如下
    #define UNITY_LIGHTMODEL_AMBIENT (glstate_lightmodel_ambient * 2)
    

    1.5 unity_ObjectToWorld

    模型空间到世界空间的变换矩阵。4×4的矩阵。
    位于UnityShaderVariables.cginc,可通过UnityCG.cginc间接引入。

    // 定义如下
    float4x4 unity_ObjectToWorld;
    float4x4 unity_WorldToObject;
    

    1.6 unity_WorldToObject

    世界空间到模型空间的变换矩阵。4×4的矩阵。
    其他见1.5。

    2 常用方法

    2.1 局部坐标变换到裁剪空间

    位于“UnityShaderUtilities.cginc”,可通过UnityCG.cginc间接引入。

    // 定义如下
    inline float4 UnityObjectToClipPos(float4 pos);
    inline float4 UnityObjectToClipPos(in float3 pos)
    

    2.2 模型空间法线变换到世界空间

    // 位于`“UnityCG.cginc”`
    inline float3 UnityObjectToWorldNormal( in float3 norm );
    

    2.3 TRANSFORM_TEX

    位于“UnityCG.cginc”。

    // 定义如下
    // Transforms 2D UV by scale/bias property
    #define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
                        目录1 常用变量1.1 顶点着色器输入结构体体1.2 _LightColor01.3 _WorldSpaceLightPos01.4 UNITY_LIGHTMODEL_AMBIENT1.5 unity_ObjectToWorld1.6 unity_WorldToObject2 常用方法2.1 局部坐标变换到裁剪空间2.2 模型空间法线变换到世界空间2.3 TRANSFORM_TEXTODO 未完待续…1 常用变量1.1 顶点着色器输入结构体体位于UnityCG.cginc。struct appd
    				
    Unity Shader 常量、变量、结构体、函数一般可以在 Unity Editor 安装目录下面的【Editor\Data\CGIncludes\UnityShader】目录下查看源码,主要源码文件如下: UnityCG.cginc UnityShaderUtilities.cginc UnityShaderVariables.cginc
    之前在 Unity Built-in 管线中,我们在自定义 shader 中,可以使用一下代码来获取 Ambient 环境光的颜色: fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb 但是在 Unity URP 中,发现不生效了,虽然 URP 中也有定义这个宏,定义在:#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl" 中 #define UN
    LightMode是个非常重要的选项,因为它将决定该pass中光源的各变量的值。如果一个pass没有指定任何LightMode tag,那么我们就会得到上一个对象残留下来的光照值,这并不是我们想要的。其他各个LightMode的具体含义可以参见官网(很重要,一定要去看,特别是对于每个Pass的细节解释,一定要点进去看!!!),这里做一个简单的解释。 LightMode=Vertex:会设置4个光源,并按亮度从明到暗进行排序,它们的值会存储在unity_LightColor[n], unity_Ligh
    这里主要就漫反射和高光反射中的两种(共三种)进行讨论。 ================================================================================================ 一、漫反射(Diffuse...
    问题:unity shader中,表示主光源颜色的变量_LightColor0的数值不正确。 原因出在——我在2017.4.40的built-in渲染管线下用了command buffer渲染模型。built-in管线下,渲染都是unity内部处理的,我们看不见,无法管理。可能就是unity对使用command buffer的情况没有很好地覆盖到,导致错误。最终我创建gameobject,挂上mesh filter和mesh renderer,就是最普通的渲染方法,就没有这个错误了。 Lighting.hlsl引用 Common.hlsl、EntityLighting.hlsl、ImageBasedLighting.hlsl、Core.hlsl、Shadows.hlsl、
    1.常用的几个内置文件 这些文件通常都被封装在cginc文件中,通过文件的包含来实现对文件中函数及变量的引用,大家可以到unity的安装目录下找到对应的文件,当然我们也可以写一些自己的cginc文件放置到该目录中,方便自己使用,具体方法可以参考Unity着色器代码复用。 A.UnityCG.cginc 1.这里包含了最常使用的帮助函数、宏和结构体。 2.UnityCG.cginc中一些常用的结构体 appdata_base:(用于顶点着色器的输入),包含变量:顶点位置、顶点法线、第一组纹理坐标
    当您创建Unity3D模型时,Shader是用于控制模型外观和材质的组件。Shader可以定义模型的表面特征,例如颜色,纹理,透明度和光照效果。以下是一个简单的Unity3D模型Shader示例: Shader "Custom/MyShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _Gloss ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 SubShader { Tags { "RenderType"="Opaque" } LOD 100 CGPROGRAM #pragma surface surf Standard sampler2D _MainTex; fixed4 _Color; float _Gloss; float _Metallic; struct Input { float2 uv_MainTex; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Gloss; o.Alpha = c.a; ENDCG FallBack "Diffuse" 上面的代码定义了一个名为"Custom/MyShader"的Shader,该Shader包含了几个属性,包括主要纹理(_MainTex),颜色(_Color),光滑度(_Gloss)和金属度(_Metallic)。 此外,SubShader中定义了使用SurfaceOutputStandard结构的surf函数。此函数控制着表面的输出,其中o.Albedo表示表面颜色,o.Metallic表示金属度,o.Smoothness表示光滑度,o.Alpha表示透明度。 最后,FallBack定义了在无法使用此Shader时应该回退使用的默认Shader。 这只是一个简单的Shader示例,但它展示了如何使用属性和函数来控制Unity3D模型的外观。
 
推荐文章
开朗的长颈鹿  ·  Java:类名的命名规则-CSDN博客
1 年前
玩命的汉堡包  ·  The RFC Clamp Loader: Structure and Function - PMC
1 年前
乐观的火锅  ·  日志管理之 Docker logs - 每天5分钟玩转 Docker 容器技术(87)-阿里云开发者社区
2 年前
暗恋学妹的领带  ·  Qt实现表格树控件-自绘树节点虚线 - 知乎
2 年前
纯真的长颈鹿  ·  numba,让python速度提升百倍 - 简书
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号