- Home /
Question by
fxcarl · Jul 17, 2013 at 06:21 PM ·
iosmaterialscriptingproblemc#-and-js
RealTimeCubemap in both C# & JS, C# code Can't working on iOS. why ?
Two version of realtime cubemap code.
JS Ver :
#pragma strict
// Attach this script to an object that uses a Reflective shader.
// Realtime reflective cubemaps!
@script ExecuteInEditMode
var cubemapSize = 128;
var oneFacePerFrame = false;
var mask : LayerMask;
var anchorOffset : Vector3;
private var cam : Camera;
private var rtex : RenderTexture;
function Start () {
// render all six faces at startup
UpdateCubemap( 63 );
}
function LateUpdate () {
if (oneFacePerFrame) {
var faceToRender = Time.frameCount % 6;
var faceMask = 1 << faceToRender;
UpdateCubemap (faceMask);
} else {
UpdateCubemap (63); // all six faces
}
}
function UpdateCubemap (faceMask : int) {
if (!cam) {
var go = new GameObject ("CubemapCamera", Camera);
go.hideFlags = HideFlags.HideAndDontSave;
go.transform.position = transform.position;
go.transform.rotation = Quaternion.identity;
cam = go.camera;
cam.clearFlags = CameraClearFlags.Skybox;
cam.backgroundColor = Color.gray;
cam.renderingPath = RenderingPath.VertexLit;
cam.cullingMask = mask;
cam.farClipPlane = 200; // don't render very far into cubemap
cam.aspect = 1.0f;
cam.fov = 90.0f;
cam.enabled = false;
}
if (!rtex) {
rtex = new RenderTexture (cubemapSize, cubemapSize, 16);
rtex.isCubemap = true;
rtex.useMipMap = true;
rtex.hideFlags = HideFlags.HideAndDontSave;
var renderers = GetComponentsInChildren(Renderer);
for(var r : Renderer in renderers){
for(var m : Material in r.sharedMaterials){
m.SetTexture ("_Reflections", rtex);
m.SetTexture ("_Cube", rtex);
m.SetFloat ("_Bias", Mathf.Log(cubemapSize,2));
}
}
}
cam.transform.position = transform.position + anchorOffset;
cam.RenderToCubemap (rtex, faceMask);
}
function OnDisable () {
DestroyImmediate (cam);
DestroyImmediate (rtex);
}
C# Ver :
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq;
public class CSharpCube : MonoBehaviour {
// Attach this script to an object that uses a Reflective shader.
// Realtime reflective cubemaps!
public int cubemapSize = 128;
public bool oneFacePerFrame = true;
public LayerMask mask = 1;
public Vector3 anchorOffset = Vector3.up;
private Camera cam;
private RenderTexture rtex;
void Start ()
{
// render all six faces at startup
UpdateCubemap (63);
}
void LateUpdate ()
{
if (oneFacePerFrame) {
int faceToRender = Time.frameCount % 6;
int faceMask = 1 << faceToRender;
UpdateCubemap (faceMask);
} else {
UpdateCubemap (63); // all six faces
}
}
void UpdateCubemap (int faceMask)
{
if (!cam) {
GameObject go = new GameObject ("CubemapCamera", typeof(Camera));
go.hideFlags = HideFlags.HideAndDontSave;
go.transform.position = transform.position;
go.transform.rotation = Quaternion.identity;
cam = go.camera;
cam.clearFlags = CameraClearFlags.Skybox;
cam.backgroundColor = Color.gray;
cam.renderingPath = RenderingPath.VertexLit;
cam.cullingMask = mask;
cam.farClipPlane = 100f; // don't render very far into cubemap
cam.aspect = 1.0f;
cam.fov = 90.0f;
cam.enabled = false;
}
if (!rtex) {
rtex = new RenderTexture (cubemapSize, cubemapSize, 16, RenderTextureFormat.RGB565);
rtex.isCubemap = true;
rtex.useMipMap = true;
rtex.hideFlags = HideFlags.HideAndDontSave;
Shader.SetGlobalTexture ("_Reflections", rtex);
Renderer[] renderers = GetComponentsInChildren<Renderer> ();
foreach (Renderer r in renderers) {
foreach (Material m in r.sharedMaterials) {
m.SetTexture ("_Reflections", rtex);
m.SetTexture ("_Cube", rtex);
//m.SetFloat ("_Bias", Mathf.Log(cubemapSize,2));
}
}
}
cam.transform.position = transform.position + anchorOffset;
cam.RenderToCubemap (rtex, faceMask);
}
void OnDisable ()
{
DestroyImmediate (cam);
DestroyImmediate (rtex);
}
}
They all work fine in editor, but C# version can't work on iOS -- camera rending looks okay, but never really set texture to material...
屏幕快照 2013-07-18 上午1.51.29.png
(256.6 kB)
Comment