左右の目を個別にレンダリングして、RenderToCubemapというメソッドでキューブマップにしようと思っているのですがメインカメラの映像を左右別にする方法が調べてみてまったくわかりません。普通のメインカメラの映像はキューブマップにすることはできました。方法だけでもいいので教えてくださると幸いです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
カメラを左右の目の位置の分だけ少しずらして、左右でそれぞれキューブマップを作成すればいいんじゃないでしょうかね?
RenderToCubemapやConvertToEquirectをUnity5.6.2f1で使いたいで例示しましたコードをベースに改造するとこんな感じでしょうか。
まずCubeToEquirectangular
のバーテックスシェーダー内で頂点座標・UV座標を調整できるようにして...
ShaderLab
1Shader "Hidden/CubeToEquirectangular" 2{ 3 Properties 4 { 5 _MainTex ("Texture", Cube) = "white" {} 6 _VertexOffsetAndScale ("Vertex Offset and Scale", Vector) = (0.0, 0.0, 1.0, 1.0) 7 _UvOffsetAndScale ("UV Offset and Scale", Vector) = (0.0, 0.0, 1.0, 1.0) 8 } 9 SubShader 10 { 11 Cull Off ZWrite Off ZTest Always 12 13 Pass 14 { 15 CGPROGRAM 16 #pragma vertex vert 17 #pragma fragment frag 18 19 #include "UnityCG.cginc" 20 21 struct appdata 22 { 23 float4 vertex : POSITION; 24 float2 uv : TEXCOORD0; 25 }; 26 27 struct v2f 28 { 29 float2 uv : TEXCOORD0; 30 float4 vertex : SV_POSITION; 31 }; 32 33 float4 _VertexOffsetAndScale; 34 float4 _UvOffsetAndScale; 35 36 v2f vert(appdata v) 37 { 38 v2f o; 39 o.vertex = UnityObjectToClipPos(v.vertex); 40 o.vertex.xy = o.vertex.xy * _VertexOffsetAndScale.zw + _VertexOffsetAndScale.xy; 41 o.uv = v.uv * _UvOffsetAndScale.zw + _UvOffsetAndScale.xy; 42 return o; 43 } 44 45 samplerCUBE _MainTex; 46 float4x4 _TransformMatrix; 47 48 fixed4 frag(v2f i) : SV_Target 49 { 50 float phi = 2.0 * UNITY_PI * (i.uv.x + 0.5); 51 float theta = (i.uv.y - 0.5) * UNITY_PI; 52 float sinPhi; 53 float cosPhi; 54 float sinTheta; 55 float cosTheta; 56 sincos(phi, sinPhi, cosPhi); 57 sincos(theta, sinTheta, cosTheta); 58 float3 worldDirection = float3(sinPhi * cosTheta, sinTheta, cosPhi * cosTheta); 59 float3 localDirection = mul(_TransformMatrix, worldDirection); 60 return texCUBE(_MainTex, localDirection); 61 } 62 ENDCG 63 } 64 } 65}
キューブマップ描画スクリプトは左右2枚のキューブマップを作るようにし...
C#
1using UnityEngine; 2using UnityEngine.Rendering; 3 4[RequireComponent(typeof(Camera))] 5public class StereoCubemapUpdater : MonoBehaviour 6{ 7 [SerializeField] private int cubemapSize = 1024; 8 [SerializeField, Range(0.0f, 0.2f)] private float separation = 0.065f; 9 private new Camera camera; 10 private Transform cameraTransform; 11 public RenderTexture CubemapLeft { get; private set; } 12 public RenderTexture CubemapRight { get; private set; } 13 14 private void Awake() 15 { 16 this.camera = this.GetComponent<Camera>(); 17 this.cameraTransform = this.camera.transform; 18 this.CubemapLeft = new RenderTexture(this.cubemapSize, this.cubemapSize, 24) 19 { 20 dimension = TextureDimension.Cube 21 }; 22 this.CubemapRight = new RenderTexture(this.cubemapSize, this.cubemapSize, 24) 23 { 24 dimension = TextureDimension.Cube 25 }; 26 } 27 28 private void Update() 29 { 30 this.camera.enabled = false; 31 var cameraCenter = this.cameraTransform.localPosition; 32 this.cameraTransform.Translate(-this.separation * 0.5f, 0.0f, 0.0f); 33 this.camera.RenderToCubemap(this.CubemapLeft); 34 this.cameraTransform.Translate(this.separation, 0.0f, 0.0f); 35 this.camera.RenderToCubemap(this.CubemapRight); 36 this.cameraTransform.localPosition = cameraCenter; 37 this.camera.enabled = true; 38 } 39}
円筒図法展開スクリプトでは左右のキューブマップを並べてそれぞれレンダリングすればどうでしょう。
C#
1using System; 2using UnityEngine; 3 4public class StereoEquirectangularTextureUpdater : MonoBehaviour 5{ 6 public enum Arrangement 7 { 8 TopAndBottom, 9 SideBySide 10 } 11 12 public enum FieldOfView 13 { 14 Full, 15 Half 16 } 17 18 [SerializeField] private StereoCubemapUpdater stereoCubemapUpdater; 19 [SerializeField] private RenderTexture equirectangularTexture; 20 [SerializeField] private bool useLocalDirection; 21 [SerializeField] private Arrangement arrangement; 22 [SerializeField] private FieldOfView fieldOfView; 23 24 private int transformMatrixProperty; 25 private int vertexOffsetAndScaleProperty; 26 private int uvOffsetAndScaleProperty; 27 private RenderTexture cubemapLeft; 28 private RenderTexture cubemapRight; 29 private Material equirectangularMaterial; 30 31 private void Start() 32 { 33 this.transformMatrixProperty = Shader.PropertyToID("_TransformMatrix"); 34 this.vertexOffsetAndScaleProperty = Shader.PropertyToID("_VertexOffsetAndScale"); 35 this.uvOffsetAndScaleProperty = Shader.PropertyToID("_UvOffsetAndScale"); 36 this.cubemapLeft = this.stereoCubemapUpdater.CubemapLeft; 37 this.cubemapRight = this.stereoCubemapUpdater.CubemapRight; 38 this.equirectangularMaterial = new Material(Shader.Find("Hidden/CubeToEquirectangular")); 39 } 40 41 private void LateUpdate() 42 { 43 Vector4 leftVertexOffsetAndScale; 44 Vector4 rightVertexOffsetAndScale; 45 Vector4 uvOffsetAndScale; 46 switch (this.fieldOfView) 47 { 48 case FieldOfView.Full: 49 uvOffsetAndScale = new Vector4(0.0f, 0.0f, 1.0f, 1.0f); 50 break; 51 case FieldOfView.Half: 52 uvOffsetAndScale = new Vector4(0.25f, 0.0f, 0.5f, 1.0f); 53 break; 54 default: 55 throw new ArgumentOutOfRangeException(); 56 } 57 58 switch (this.arrangement) 59 { 60 case Arrangement.TopAndBottom: 61 leftVertexOffsetAndScale = new Vector4(0.0f, -0.5f, 1.0f, 0.5f); 62 rightVertexOffsetAndScale = new Vector4(0.0f, 0.5f, 1.0f, 0.5f); 63 break; 64 case Arrangement.SideBySide: 65 leftVertexOffsetAndScale = new Vector4(-0.5f, 0.0f, 0.5f, 1.0f); 66 rightVertexOffsetAndScale = new Vector4(0.5f, 0.0f, 0.5f, 1.0f); 67 break; 68 default: 69 throw new ArgumentOutOfRangeException(); 70 } 71 72 this.equirectangularMaterial.SetMatrix( 73 this.transformMatrixProperty, 74 this.useLocalDirection ? this.stereoCubemapUpdater.transform.localToWorldMatrix : Matrix4x4.identity); 75 this.equirectangularMaterial.SetVector(this.uvOffsetAndScaleProperty, uvOffsetAndScale); 76 this.equirectangularMaterial.SetVector(this.vertexOffsetAndScaleProperty, leftVertexOffsetAndScale); 77 Graphics.Blit(this.cubemapLeft, this.equirectangularTexture, this.equirectangularMaterial); 78 this.equirectangularMaterial.SetVector(this.vertexOffsetAndScaleProperty, rightVertexOffsetAndScale); 79 Graphics.Blit(this.cubemapRight, this.equirectangularTexture, this.equirectangularMaterial); 80 } 81}
ただでさえ高価なキューブマップレンダリングを2回もやりますので、描画負荷がけっこう大きいと思います。ご注意ください...
左目を上半分、右目を下半分に描画、全方位
左目を左半分、右目を右半分に描画、前方半球のみ
投稿2019/10/04 19:54
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/05 22:53
2019/10/05 23:54
2019/10/06 15:12