- Home /
how can i catch the sky box and do a reflection in object
hi i want to create a sea that will reflect my sky box
here is my c# code :
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class WaterMesh : MonoBehaviour {
public int resX;
public int resY;
private Vector2[] getUv(){
List<Vector2> allDots = new List<Vector2>();
for (int i = 0; i < resX; i++)
{
for (int j = 0; j < resY; j++)
{
allDots.Add(new Vector3((float)i/(resX - 1), (float)j/(resY-1)));
}
}
return allDots.ToArray();
}
private Vector3[] getDotes() {
List<Vector3> allDots = new List<Vector3>();
for (int i = 0; i < resX; i++) {
for (int j = 0; j < resY; j++) {
allDots.Add(new Vector3(i , 0 , j));
}
}
return allDots.ToArray();
}
private int[] getIndex() {
List<int> indexesToReturn = new List<int>();
for (int i = 0; i < resX - 1; i++) {
for (int j = 0; j < resY - 1; j++) {
indexesToReturn.Add(i + (j * resX));
indexesToReturn.Add(i + (j * resX) + 1);
indexesToReturn.Add(i + ((j + 1) * resX));
indexesToReturn.Add(i + (j * resX) + 1);
indexesToReturn.Add(i + ((j + 1) * resX) + 1);
indexesToReturn.Add(i + ((j + 1) * resX));
}
}
return indexesToReturn.ToArray();
}
private Vector3[] getNormal() {
Vector3[] normals = new Vector3[resX * resY];
for (int i = 0; i < normals.Length; i++)
normals[i] = new Vector3(0, 1, 0);
return normals;
}
// Use this for initialization
void Start () {
Mesh mesh = new Mesh();
Vector3[] dotes = getDotes();
Vector2[] uv = getUv();
int[] indexes = getIndex();
mesh.vertices = dotes;
mesh.uv = uv;
mesh.triangles = indexes;
mesh.normals = getNormal();
GetComponent<MeshFilter>().mesh = mesh;
}
// Update is called once per frame
void Update () {
}
}
here is my shader code :
Shader "Unlit/WaterShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_heightImageOne("Height1" , 2D) = "white"{}
_heightImageTwo("Height2" , 2D) = "white"{}
_height("height",FLOAT) = 10
_scale("scale",FLOAT) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float3 normal : TEXCOORD1;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD2;
};
sampler2D _MainTex;
sampler2D _heightImageOne;
sampler2D _heightImageTwo;
float4 _MainTex_ST;
float _height;
float _scale;
float getHeight(float2 cord)
{
float flow = _Time;
return (tex2Dlod(_heightImageOne, float4(cord + float2(flow, flow), 0, 0)).y * _height) +
(tex2Dlod(_heightImageTwo, float4(cord + float2(-flow, -flow), 0, 0)).y * _height);
}
v2f vert (appdata v)
{
v2f o;
float myHeight, leftHeight, forwardHeight;
myHeight = v.vertex.y = getHeight(v.uv.xy);
o.worldPos = mul(_Object2World, v.vertex).xyz;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
v.uv *= _scale;
leftHeight = getHeight(float2(v.uv.x + 0.005f , v.uv.y)) - myHeight;
forwardHeight = getHeight(float2(v.uv.x , v.uv.y + 0.005f)) - myHeight;
o.normal = normalize(cross(normalize(float3(v.uv , 0) + float3(leftHeight, 0, 0)) , normalize(float3(v.uv, 0) + float3(0, 0, forwardHeight))));
return o;
}
fixed4 frag (v2f i) : SV_Target
{
half3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
half3 worldRefl = reflect(-worldViewDir, i.normal);
half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, worldRefl);
half3 skyColor = DecodeHDR(skyData, unity_SpecCube0_HDR);
// sample the texture
fixed4 col = 0;
col.rgb = skyColor;
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
the part of code that needed to catch the sky box and reflect it is mostly copy past from unity site and its still not working can anyone know why?
Comment
Your answer
Follow this Question
Related Questions
Why does my shader only shade objects based on their normals in the X axis? 1 Answer
Clarification on static batching a shader-animated mesh 1 Answer
Vertex shader breaks render to texture - camera preview and render texture not the same 1 Answer
How can I make shadows pixelated in fragment function? 1 Answer
Prevent ColorMask obscuring parts of an object's mesh 0 Answers