RenderToCubemapやConvertToEquirectというUnity 2018.4.7f1以降に実装された新しい機能があり、この機能をUnity 2018.4.7f1より古いバージョンのUnity5.6.2f1で使用したいと考えています。対応していないので原則使えないのはわかっているのですが、なんとか使う方法はないでしょうか?
現在試した方法はUnity 2018.4.7f1のunityengine.dllの該当箇所だけをコピペしてソースファイルに書いたのですがうまくいかず。
もしくはRenderToCubemapやConvertToEquirectを使うソースファイルだけは参照するunityengine.dllをUnity5.6.2f1から2018.4.7f1に変えようとしたのですが、うまくいかず。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/23 04:09 編集
回答1件
0
ベストアンサー
RenderToCubemapはあるみたいですね。あとは円筒図法への展開を何とかすればいいんじゃないかと思います。
一例として、カメラにキューブマップのレンダリングを行うスクリプトを付けて...
C#
1using UnityEngine; 2using UnityEngine.Rendering; 3 4[RequireComponent(typeof(Camera))] 5public class CubemapUpdater : MonoBehaviour 6{ 7 [SerializeField] private int cubemapSize = 1024; 8 public RenderTexture Cubemap { get; private set; } 9 private new Camera camera; 10 11 private void Awake() 12 { 13 this.camera = this.GetComponent<Camera>(); 14 this.Cubemap = new RenderTexture(this.cubemapSize, this.cubemapSize, 24) 15 { 16 dimension = TextureDimension.Cube 17 }; 18 } 19 20 private void Update() 21 { 22 this.camera.enabled = false; 23 this.camera.RenderToCubemap(this.Cubemap); 24 this.camera.enabled = true; 25 } 26}
極座標をもとにキューブマップをサンプリングするシェーダーを用意し...
ShaderLab
1Shader "Hidden/CubeToEquirectangular" 2{ 3 Properties 4 { 5 _MainTex ("Texture", Cube) = "white" {} 6 } 7 SubShader 8 { 9 Cull Off ZWrite Off ZTest Always 10 11 Pass 12 { 13 CGPROGRAM 14 #pragma vertex vert 15 #pragma fragment frag 16 17 #include "UnityCG.cginc" 18 19 struct appdata 20 { 21 float4 vertex : POSITION; 22 float2 uv : TEXCOORD0; 23 }; 24 25 struct v2f 26 { 27 float2 uv : TEXCOORD0; 28 float4 vertex : SV_POSITION; 29 }; 30 31 v2f vert(appdata v) 32 { 33 v2f o; 34 o.vertex = UnityObjectToClipPos(v.vertex); 35 o.uv = v.uv; 36 return o; 37 } 38 39 samplerCUBE _MainTex; 40 float4x4 _TransformMatrix; 41 42 fixed4 frag(v2f i) : SV_Target 43 { 44 float phi = 2.0 * UNITY_PI * (i.uv.x + 0.5); 45 float theta = (i.uv.y - 0.5) * UNITY_PI; 46 float sinPhi; 47 float cosPhi; 48 float sinTheta; 49 float cosTheta; 50 sincos(phi, sinPhi, cosPhi); 51 sincos(theta, sinTheta, cosTheta); 52 float3 worldDirection = float3(sinPhi * cosTheta, sinTheta, cosPhi * cosTheta); 53 float3 localDirection = mul(_TransformMatrix, worldDirection); 54 return texCUBE(_MainTex, localDirection); 55 } 56 ENDCG 57 } 58 } 59}
レンダリングされたキューブマップをレンダーテクスチャにBlitで写してやれば円筒上に展開できるんじゃないでしょうか。
C#
1using UnityEngine; 2 3public class EquirectangularTextureUpdater : MonoBehaviour 4{ 5 [SerializeField] private CubemapUpdater cubemapUpdater; 6 [SerializeField] private RenderTexture equirectangularTexture; 7 [SerializeField] private bool useLocalDirection; 8 9 private int transformMatrixProperty; 10 private RenderTexture cubemap; 11 private Material equirectangularMaterial; 12 13 private void Start() 14 { 15 this.transformMatrixProperty = Shader.PropertyToID("_TransformMatrix"); 16 this.cubemap = this.cubemapUpdater.Cubemap; 17 this.equirectangularMaterial = new Material(Shader.Find("Hidden/CubeToEquirectangular")); 18 } 19 20 private void LateUpdate() 21 { 22 this.equirectangularMaterial.SetMatrix( 23 this.transformMatrixProperty, 24 this.useLocalDirection ? this.cubemapUpdater.transform.localToWorldMatrix : Matrix4x4.identity); 25 Graphics.Blit(this.cubemap, this.equirectangularTexture, this.equirectangularMaterial); 26 } 27}
カメラの映像
ワールド方向で展開
カメラローカル方向で展開
投稿2019/09/29 19:59
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。