如何渲染分别在团结和three.js所法线贴图与着色器?

问题描述 投票:0回答:1

我想呈现three.js所和统一法线贴图,但我觉得最终的输出是不同的。

着色器中统一使用如下:

Shader "Unlit/normal"
{
Properties
{
    _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
    Tags { "RenderType"="Opaque" }
    LOD 100

    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        // make fog work
        #pragma multi_compile_fog

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
            float3 normal:NORMAL;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            UNITY_FOG_COORDS(1)
            float4 vertex : SV_POSITION;
            fixed4 color : COLOR;
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
            o.color.xyz = mul(_Object2World, v.normal)*0.5+0.5 ;
            o.color.w = 1.0f;
            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {

            return i.color; //output normal
        }
        ENDCG
    }
}

}

在three.js所,我用的是MeshNormalMaterial渲染法线贴图,但它不同于渲染统一。

统一输出Unity output

threejs输出threejs output

unity3d three.js glsl shader hlsl
1个回答
0
投票

我认为问题是,你正在使用的unity_ObjectToWorld矩阵,其中还包括了规模改造正常。这可能会导致缩放或剪切法线,这可能是发生了什么考虑统一版本多少暗外观。我的建议是改为使用包含在UnityCG.cginc内置功能:

o.color.rgb = UnityObjectToWorldNormal(v.normal);

正常的应该理想地在片段的功能进行归一化太,因为硬件插值将不能保证你的价值观留归。此外,你的shader有一堆中有多余的东西,这是不是真的需要 - 你可以删除下面几行:

#pragma multi_compile_fog
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
sampler2D _MainTex;
float4 _MainTex_ST;

编辑:也请注意,它看起来像MeshNormalMaterial呈现鉴于空间法线,而不是在世界空间。这是你如何改变世界正常进入视野空间:

float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_V, worldNormal));
© www.soinside.com 2019 - 2024. All rights reserved.