【发布时间】:2020-06-23 08:51:00
【问题描述】:
我想在一个球体上投影几个等距矩形纹理(每个纹理仅包含地球大陆上保持其原始等距矩形形状,其余部分是透明的)。我想缩放球体,以便大陆保持其表面/大小并保持在其位置而不随球体缩放。所有这些都在着色器中完成。投影仪方法被排除在外,因为大陆/纹理可以根据其原始大小或球体大小映射到截锥体后面。
我现在正在为此苦苦挣扎,因为有些日子无法找到解决方案。
到目前为止,我的方法是根据球体的缩放比例调整纹理 UV 的大小(以便它似乎保持其表面和位置),但它不能正常工作,因为它在笛卡尔平面中缩放,而它应该是在等角坐标系或径向坐标系中缩放。而且我不知道这样做的数学...
也许有人知道在等角坐标系或径向坐标系中缩放的数学?也许我只是使事情复杂化,并且与世界坐标有关。我也在考虑将 equirectangular 投影到 gnomonic,缩放,然后重新投影到 equirectangular,但我很确定这是矫枉过正而且太近似了。
着色器“Unlit/Equirectangular2SphereSimple” { 特性 { [NoScaleOffset] _FirstTex ("Equirectangular (First)", 2D) = "white" {} _Scale ("Scale", Range(0,10)) = 1.0 } 子着色器 { 经过 { 标签 { "DisableBatching"="True" } CG程序 #pragma 顶点 vert #pragma 片段片段 #pragma 目标 3.0 #include "UnityCG.cginc" sampler2D _FirstTex; 一半 _Scale; 结构 v2f { float4 位置:SV_POSITION; float3 texcoord : TEXCOORD0; }; 内联 float2 ToRadialCoords(float3 coords) { float3 normalizedCoords = normalize(coords); 浮动纬度 = acos(normalizedCoords.y); 浮点经度 = atan2(normalizedCoords.z, normalizedCoords.x); float2 sphereCoords = float2(经度,纬度) * (1/UNITY_PI); 返回 float2(0.5F - sphereCoords.x * 0.5F, 1.0F - sphereCoords.y); } v2f vert(appdata_full v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); //注意:我们需要逆x法线 o.texcoord = v.vertex * half3(-1,_Scale,1); //如果不在极点,缩放不起作用 返回 o; } 固定4碎片(v2f i):SV_Target { float2 equirectangularUV = ToRadialCoords(i.texcoord); fixed4 first = tex2D(_FirstTex, equirectangularUV); 首先返回.a != 0 ?第一个:固定4(1,1,1,1); } ENDCG } } 后备“VertexLit” }【问题讨论】:
标签: unity3d geometry shader coordinates textures