代码之家  ›  专栏  ›  技术社区  ›  Rumata

简单的双面自定义明暗器看起来很奇怪

  •  0
  • Rumata  · 技术社区  · 6 年前

    我对明暗器编程非常陌生,我尝试创建一个明暗器,它:

    • 允许使用2个对应的法线贴图更改2个纹理(淡入/淡出)
    • 双面(显示曲面两侧的网格)

    以下是我的结论:

      Shader "Custom/TextureBlend" {
             Properties {
                 _Color ("Color", Color) = (1,1,1,1)
                 _Blend ("Texture Blend", Range(0,1)) = 0.0
                 _MainTex ("Albedo (RGB)", 2D) = "white" {}
                 _MainTex2 ("Albedo 2 (RGB)", 2D) = "white" {}
                 _Glossiness ("Smoothness", Range(0,1)) = 0.5
                 _Metallic ("Metallic", Range(0,1)) = 0.0
                 _BumpMap ("Bumpmap", 2D) = "bump" {}
                 _BumpMap2 ("Bumpmap", 2D) = "bump" {}
             }
             SubShader {
                 Tags { "RenderType"="Opaque" }
                 LOD 200
                  Cull Off
                  ZTest LEqual
    
                 CGPROGRAM
                 // Physically based Standard lighting model, and enable shadows on all light types
                 #pragma surface surf Standard fullforwardshadows
    
                 // Use shader model 3.0 target, to get nicer looking lighting
                 #pragma target 3.0
    
                 sampler2D _MainTex;
                 sampler2D _MainTex2;
                 sampler2D _BumpMap;
                 sampler2D _BumpMap2;
    
                 struct Input {
                     float2 uv_MainTex;
                     float2 uv_MainTex2;
                     float2 uv_BumpMap;
                     float2 uv_BumpMap2;
                 };
    
                 half _Blend;
                 half _Glossiness;
                 half _Metallic;
                 fixed4 _Color;
    
                 void surf (Input IN, inout SurfaceOutputStandard o) {
                     // Albedo comes from a texture tinted by color
                     fixed4 c = lerp (tex2D (_MainTex, IN.uv_MainTex), tex2D (_MainTex2, IN.uv_MainTex2), _Blend) * _Color;
                     o.Albedo = c.rgb;
                     // Metallic and smoothness come from slider variables
                     o.Metallic = _Metallic;
                     o.Smoothness = _Glossiness;
                     o.Alpha = c.a;
                     fixed4 n = lerp (tex2D (_BumpMap, IN.uv_BumpMap), tex2D (_BumpMap2, IN.uv_BumpMap2), _Blend) * _Color;
                     o.Normal = n.rgb;
                 }
                 ENDCG
             }
             FallBack "Diffuse"
         }
    

    它可以工作,但由于某种原因,表面上的纹理看起来很暗(在网格的另一侧,通常不可见,甚至更暗),正常的地图反射几乎不可见。

    在这里,在左侧,您可以看到带有我的明暗器的平面,在右侧-标准明暗器:

    enter image description here

    而且反射看起来很奇怪,如果我将金属滑块移到右边,您会看到它:

    enter image description here

    我会非常感谢任何帮助,因为我是一个非常新的着色编程。
    提前非常感谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Brice V.    6 年前

    普通贴图存储矢量信息,而常规纹理不带符号,因此需要使用 UnpackNormal() 辅助方法 as shown in the samples . 你也不需要乘以颜色。

    最终代码将沿着以下行:

    fixed4 n0 = tex2D(_BumpMap, IN.uv_BumpMap);
    fixed4 n1 = tex2D(_BumpMap2, IN.uv_BumpMap2);
    o.Normal = UnpackNormal(lerp(n0, n1, _Blend)).xyz;