2017-11-27 26 views
1

개체 (예 : 비행기)를 구형 표면에 투영하는 데 문제가 있습니다.구면 매핑

셰이더는 꼭지점 로컬 위치 (P0)를 가져 와서 좌표를 월드 좌표 (P1)로 변환 한 다음 주어진 중심 (C)에서 P1 (P1 - C)까지 벡터를 찾아야합니다. 그래서이 벡터를 정규화하고 주어진 계수로 곱하고 마지막으로 다시 로컬 좌표로 변환하십시오.

나는 표면 쉐이더와 유니티에서 일하고 있어요

Shader "Custom/testShader" { 
    Properties { 
     _MainTex("texture", 2D) = "white" {} 
     _Center("the given center", Vector) = (0,0,0) 
     _Height("the given coefficient", Range(1, 1000) = 10 
    } 
    Subshader { 
     CGPROGRAM 
     #pragma surface surf Standard vertex:vert 
     sampler2D _MainTex; 
     float3 _Center; 
     float _Height; 

     struct Input { float2 uv_MainTex; } 

     // IMPORTANT STUFF 
     void vert (inout appdata_full v) { 
     float3 world_vertex = mul(unity_ObjectToWorld, v.vertex) - _Center; 
     world_vertex = normalize(world_vertex) * _Height; 
     v.vertex = mul(unity_WorldToObject, world_vertex); 
     } 
     // END OF IMPORTANT STUFF 

     void surf (Input IN, inout SurfaceOutputStandard o) { 
     o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb; 
     } 
     ENDCG 
    } 
} 

이제 문제는 내가이 쉐이더와 비행기들을 현장에서, 그들은 분할 및 훨씬 더 작은 볼 것을 그들이 생각하는 그 무엇 되려고. 어떤 아이디어? 여기

편집 스크린 샷이다 : The meshes without the shader The same meshes with the shader

+0

는 유니티에서 입력 및 출력 객체 스냅을 게시 할 수 있어야한다? –

답변

2

넌 방향 (X,Y,Z,0) 대신에 위치 (X,Y,Z,1) world_vertex로 변환된다. 자세한 내용은 this을 참조하십시오.

그래서
v.vertex = mul(unity_WorldToObject, world_vertex);
이 라인은
v.vertex = mul(unity_WorldToObject, float4(world_vertex, 1));

+0

고마워, 적어도 8 번 링크 된 자습서를 읽겠습니다! – Gugu