- Home /
Render into cubemap with a camera that has a replacement shader and convert to equirectangular
I am trying to render a scene with a camera that has a replacement shader and output the normal values represented by different colors into a cubemap texture. Then I transform the cubemap into equirectangular but the result isn't what I want. It's like the camera is looking each time at all the six faces of the cubemap and calculating the normals then, instead of calculating the normals of the equirectangular panorama. Any ideas on how to calculate the normals of the equirectangular panorama?
This is my shader code:
Shader "Hidden/NormalsShader"
{
Properties
{
_MainTex("", 2D) = "white" {}
_Cutoff("", Float) = 0.5
_Color("", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert(appdata_base v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv.xyz = COMPUTE_VIEW_NORMAL; // normals
o.uv.w = COMPUTE_DEPTH_01; // depth
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 c = i.uv.xyz * 0.5 + 0.5;
return float4(c, 1);
}
ENDCG
}
}
}
And this is my c# script to create cubemap and transform to equirectangular.
using System.Collections;
using System.IO;
using UnityEngine;
namespace Assets
{
public class RenderCubemap : MonoBehaviour
{
public Cubemap cubemap;
public RenderTexture cubemapTexture;
public RenderTexture equirect;
public Shader myShader;
private int faceMask = 1023;
private Start()
{
var cam = GameObject.Find("FirstPersonCharacter").GetComponent<Camera>();
if (myShader == Shader.Find("Hidden/NormalsShader"))
{
if (cam == null)
{
Debug.Log("there is no camera");
}
else
{
cam.SetReplacementShader(myShader, null);
cam.RenderToCubemap(cubemapTexture, faceMask);
Debug.Log("cubemap created succesfully");
}
cubemapTexture.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono);
ConvertEquirectToPng(equirect, levelName, shaderName);
Debug.Log("equirectangular image created");
}
}
}
}
Your answer
Follow this Question
Related Questions
Render the scene into a cubemap, adding a shader and show on display (using just one camera!) 0 Answers
Dividng clip space by "w" warps the output? 1 Answer
Render object with different shader depending on the camera 2 Answers
Render group of objects in front? 0 Answers
Is there a way to render a single object with a unique color per active camera? 1 Answer