[펌] 휘어지는 효과 렌더링
[사진 : 서브웨이 서퍼 플레이 스크린샷]
출처 : http://answers.unity3d.com/questions/288835/how-to-make-plane-look-curved.html
http://devkorea.co.kr/bbs/board.php?bo_table=m03_lecture&wr_id=3315&page=0&sca=&sfl=&stx=&sst=&sod=&spt=0&page=0¤tId=42
위의 사진처럼 땅이 평평하지 않고 휘어지는 듯한 효과를 연출하기 위함이다.
땅 자체를 곡선으로 만들수도 있겠지만
카메라가 보는 부분의 렌더링을 수정함으로써 효과를 낼 수 있다.
BendTheWorldShader.unitypackage
위의 파일은 예제 파일이며,
https://dl.dropboxusercontent.com/u/7761356/UnityAnswers/Web/BendTheWorld/WebPlayer.html
웹에서도 실행을 해볼 수 있다.
적용 방법 :
위의 예제파일이나, 웹에서 보듯이 shader프로그래밍을 하면 된다.
shader 파일을 생성한다.
shader 파일에 아래와 같이 코드를 입력한다.
접기
Shader "Custom/Curved" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_QOffset ("Offset", Vector) = (0,0,0,0)
_Dist ("Distance", Float) = 100.0
}
SubShader {
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _QOffset;
float _Dist;
struct v2f {
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
} ;
v2f vert (appdata_base v)
{
v2f o;
// The vertex position in view-space (camera space)
float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
// Get distance from camera and scale it down with the global _Dist parameter
float zOff = vPos.z/_Dist;
// Add the offset with a quadratic curve to the vertex position
vPos += _QOffset*zOff*zOff;
o.pos = mul (UNITY_MATRIX_P, vPos);
o.uv = mul( UNITY_MATRIX_TEXTURE0, v.texcoord );
return o;
}
half4 frag (v2f i) : COLOR
{
half4 col = tex2D(_MainTex, i.uv.xy);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
작성한 shader 파일을 texture의 shader로 적용한다.
그러면 카메라의 위치에서 멀리 있는 객체일수록 z축의 아래로 쳐져 있는 듯한 효과를 나타낼 수 있다.
이제, 휘어지게 보여질 객체에 스크립트에서 처리해야 한다
mOffset = new Vector2(0.0f,-1.8f)
mModelsRenderer = mModel.GetComponentsInChildren<Renderer>();
mModelsMeshFilter = mModel.GetComponentsInChildren<MeshFilter>();
foreach( Renderer render in mModelsRenderer )
render.material.SetVector("_QOffset", mOffset );
foreach( MeshFilter meshfilter in mModelsMeshFilter )
meshfilter.mesh.bounds = new Bounds( Vector3.zero, Vector3.one * 3000 );
render.material.SetVector("_QOffset", mOffset )
는 휘어지는 방향과 크기를 정하며
meshfilter.mesh.bounds = new Bounds( Vector3.zero, Vector3.one * 3000 );
는 mesh범위를 키워 카메라에서 멀리 있어도 휘어지는 효과 그대로 화면에 보이도록 함이다.
'Unity3D > Shader' 카테고리의 다른 글
[펌] Super-Blur: Screen and UI gaussian blur for Unity (0) | 2017.02.09 |
---|---|
[펌] Dvornik Unity Distortion (0) | 2016.08.31 |
[NGUI] Overlay Shader with Panel Clipping (0) | 2015.06.09 |
Shader: Photoshop Overlay Effect (0) | 2015.04.27 |
Unity3d Shader Syntax Highlighting(Visual Studio 2010/2012/2013) (0) | 2015.03.24 |