[SOLVED] Illuminating Sphere from inside for 360 Photo

Hi,
I am currently trying to make a 360 degree photo viewer in unity. I have a test 360 photo that seems to be lit fine when I look at it outside my Unity environment, but when I try to view it within a sphere, it gets really dark. I am hoping to eventually export my project as an app, so I’m building from the GoogleVR demo. I have tried several things and I can’t seem to figure it out. As a note, I’m using a shader that I found to invert my sphere so I can see the texture from the inside. Here it is:

Shader "Custom/MediaShader"

{
    Properties {
        _Color("Color", Color) = (1,1,1,1)
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Glossiness("Smoothness", Range(0,1)) = 0.5
        _Metallic("Metallic", Range(0,1)) = 0.0
    }
   
    SubShader {
        Tags{ "RenderType" = "Opaque" }
        LOD 200
        cull off

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf(Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
   
    FallBack "Diffuse"
}

Basically, is there a way to adapt this shader so that I can light my sphere from the inside as well? If pictures are needed to further explain, let me know. Thanks - TMG

Also note that I tried adding light sources within the sphere itself, but to no avail.

Step one: Don’t use a surface shader, use a basic vertex fragment shader like that created by creating a new unlit shader in the editor.
Step two: Add Cull Off to that shader (see your original shader for an example of where to put it).
Step three: Profit!

1 Like

Thanks, that worked!

@bgolus , your solution works becase the surface shader is more directly connected to unity lighting model where as vert is not? Just curious

Sort of. A surface shader is a vertex fragment shader generator, so it’s not that the surface shader is “more directly connected” to Unity’s lighting systems than a vertex fragment shader, it ultimately is a vertex fragment shader after all, just one that it includes all of the code to use the lighting values being past to it by Unity’s rendering systems.

Technically this problem could have been solved by using a surface shader’s Emission property as that works pretty much exactly like the basic vertex fragment shader of just rendering the color you set unmodified, but then you’re also still doing all of the work to calculate lighting you don’t need or want.

1 Like