🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2183閲覧

RenderToCubemapやConvertToEquirectをUnity5.6.2f1で使いたい

masa_000

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/09/23 03:04

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2019/09/23 03:20

そもそも、なぜそこまでして旧バージョンに拘る必要があるのでしょうか?
masa_000

2019/09/23 04:09 編集

Unity5.6.2f1で作られたゲームがあり、それを改造したいからです。
guest

回答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}

カメラの映像

図1

ワールド方向で展開

図2

カメラローカル方向で展開

図3

投稿2019/09/29 19:59

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa_000

2019/10/04 13:50

本当に困り果てていたので助かりました。しかもこんなに詳しく書いていただきありがとうございました。 RenderToCubemapもないと思いこんでいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問