x


Lightmaps don't work in ReplacedShaders

I've been trying to figure out this problem for some time now with no success. If you try to use a replaced shader in a scene that is currently using lightmaps, the lightmap variables are never set in the shader. This causes unpredictable texture problems since the shader attemps to calculate lightmaps based on garbage values.

To show what exactly is happening, I have included a link to a web player build of the project HERE

In this project, all materials are using the same default shader shown below. This is the same shader that is passed in to the replacement shader:

Shader "Custom/BasicDiffuseShader" {

Properties {
    _MainTex ("Base (RGB)", 2D) = "white" {}
}

SubShader {
    Tags { "RenderType"="Opaque" }
    LOD 200

    CGPROGRAM
    #pragma surface surf Lambert

    sampler2D _MainTex;

    struct Input {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        half4 c = tex2D (_MainTex, IN.uv_MainTex);
        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }

    ENDCG
} 
FallBack "Diffuse"

}

The script below is what is currently setting up the replacement shader:

using UnityEngine;
using System.Collections;

public class TestReplacedShaderCall : MonoBehaviour {
public Shader m_replacedShader = null;
public Camera m_Camera;
private RenderTexture m_RT;

void Start(){
    m_RT = RenderTexture.GetTemporary(Screen.width, Screen.height, 32);
    m_Camera.targetTexture = m_RT;
    m_Camera.enabled = true;
    m_Camera.SetReplacementShader(m_replacedShader, "");
}

void LateUpdate(){
    //Using this method produces the same output as using SetReplacementShader() in Start()
    //m_Camera.enabled = false;
    //m_Camera.RenderWithShader(m_replacedShader, "");       
}

void OnGUI(){
    GUILayout.BeginArea(new Rect(Screen.width * 0.5f, 0, Screen.width * 0.5f, Screen.height * 0.5f));
    GUILayout.Box(m_RT);
    GUILayout.EndArea();
}

}

Because the lightmap data is not being initialized in the shader, the shader variable "unity_LightmapST" is garbage, which is used in all the calculations for determining the correct lightmap offset and scaling. Is there a way to ensure that this variable still gets set? or pass in my own variable to replace it without iterating through every object and calling Material.SetVector()?

more ▼

asked Feb 28 '12 at 11:59 PM

0xDEADCODE gravatar image

0xDEADCODE
1 3 4

(comments are locked)
10|3000 characters needed characters left

0 answers: sort oldest
Be the first one to answer this question
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2999
x327
x75

asked: Feb 28 '12 at 11:59 PM

Seen: 350 times

Last Updated: Feb 28 '12 at 11:59 PM