球形映射
Spherical mapping
我在将物体(例如平面)投影到球面上时遇到问题。
着色器只需获取顶点局部位置 (P0),将其转换为世界坐标 (P1),然后找到从给定中心 (C) 到 P1 (P1 - C) 的向量。所以将这个向量归一化并乘以给定的系数,最后转换回局部坐标。
我在 Unity 中使用表面着色器
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
}
}
现在的问题是,在场景中,我有一些带有此着色器的平面,它们看起来是分裂的,而且比它们应该是的要小得多。有什么想法吗?
编辑
以下是部分截图:
您正在将 world_vertex
转换为方向 (X,Y,Z,0
) 而不是位置 (X,Y,Z,1
)。有关详细信息,请参阅 this。
所以这一行
v.vertex = mul(unity_WorldToObject, world_vertex);
应该是
v.vertex = mul(unity_WorldToObject, float4(world_vertex, 1) );
我在将物体(例如平面)投影到球面上时遇到问题。
着色器只需获取顶点局部位置 (P0),将其转换为世界坐标 (P1),然后找到从给定中心 (C) 到 P1 (P1 - C) 的向量。所以将这个向量归一化并乘以给定的系数,最后转换回局部坐标。
我在 Unity 中使用表面着色器
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
}
}
现在的问题是,在场景中,我有一些带有此着色器的平面,它们看起来是分裂的,而且比它们应该是的要小得多。有什么想法吗?
编辑
以下是部分截图:
您正在将 world_vertex
转换为方向 (X,Y,Z,0
) 而不是位置 (X,Y,Z,1
)。有关详细信息,请参阅 this。
所以这一行
v.vertex = mul(unity_WorldToObject, world_vertex);
应该是
v.vertex = mul(unity_WorldToObject, float4(world_vertex, 1) );