버퍼 (Buffer)버퍼는 '미리 받아와 저장해 둔 데이터 메모리'를 뜻합니다. 데이터를 전송하는 과정에서, 데이터를 받는 속도가 느린 탓에 중간에 출력이 끊기는 일을 방지하는데요, 그럼에도 불구하고 버퍼를 채우는 속도가 데이터 출력 속도를 못 따라갈 때 발생하는 현상이 우리가 흔히 말하는 '버퍼링'입니다. 평소 영상을 볼 때 "아 버퍼링 걸렸어.." 라고 말하던 그것 입니다. 하여튼 버퍼는 데이터를 미리 킵 해두는 것이다, 아직 출력되지 않은(=앞으로 출력할) 데이터를 저장하는 것이다, 정도로 이해합시다. 오늘 중요한 것은 다양한 '버퍼' 중에서도 'Z버퍼'라는 것입니다. Z버퍼 (Z Buffer = Depth Buffer) (https://ko.wikipedia.org/wiki/Z_%EB%B2%84%..
커스텀 라이트: 물 셰이더 스페큘러 구현 지난번에 만든 물 셰이더에 이어서 작업합니다. 1234 float4 Lightingcus(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) { return float4 (0,0,0,s.Alpha); }Colored by Color Scriptercs 커스텀 라이트를 추가합니다. 이 상태에선 o.Smoothness로 스페큘러를 구현한 것이 적용되지 않습니다. 커스텀 라이트에서 스페큘러를 구현해봅니다. 1234567891011 float4 Lightingcus(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) { //스페큘러 구현 float3 ..
Diffuse Wrap Diffuse Wrap이라는 기법을 이용해봅니다. 이 기법을 이용하면 텍스쳐를 통해 라이팅을 제어할 수 있게 되는데요, 차근히 구현해 보겠습니다.(*Diffuse Wrap은 밸브에서 개발한 기술로, 팀 포트리스2에서 이용되었습니다.) 1) 커스텀 라이트 구현 + 하프램버트 적용 + 텍스쳐를 받을 변수, RampTex 생성 여기서 RampTex의 uv는 따로 받아올 필요 없습니다.하프 램버트를 적용하여 라이트 값을 0~1까지로 합니다. 12345678910111213141516171819202122232425262728293031323334353637Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _RampTex ("Ramp", 2..
렌더링 파이프 라인 (Rendering Pipeline) 렌더링 파이프라인에 대해 알아봅시다. 지금까지 셰이더 코드를 짜고, 유니티 씬/게임뷰를 통해 너무나 당연히도 결과물을 봐왔는데요. 셰이더는 어떤 과정을 거쳐 데이터를 받아, 우리에게 이미지를 출력하는 걸까요? (자료 출처: https://kblog.popekim.com/2011/11/) (1) 데이터를 받아오고(2) 정점 셰이더 계산(3) 래스터라이저(4) 픽셀 셰이더 계산 크게 네 단계의 과정을 거칩니다. 하나씩 살펴봅시다. (1) 정점 데이터를 받아온다.먼저 데이터를 받아옵니다. '정점'은 꼭짓점, 즉 Vertex를 뜻합니다. 우리가 3D 데이터는 폴리곤으로 이루어져 있고, 폴리곤(다각형)은 삼각형의 집합이며, 삼각형은 버텍스의 집합입니다. '..
01. 커스텀 라이트 + 림라이트 본격적으로 시작하기 앞서 기본형을 만들어봅시다. 커스텀 라이트에 림라이트를 적용합니다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf cus fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex..
RimLight 적용하기 viewDir 라는 변수를 이용해볼 것입니다. viewDir는 Struct Input에 포함되어있는 기능으로 float3의 값을 가집니다. Struct input에 포함된 값들 (https://docs.unity3d.com/Manual/SL-SurfaceShaders.html) 123456789101112131415161718192021222324252627282930313233343536373839404142Shader "Custom/8week"{ Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opa..
(1) Vector - 벡터란 화살표로 표현할 수 있고, '크기(길이)'과 '방향'을 가진 데이터라고 했습니다. 여기서 단위벡터라는 것을 추가로 알 필요가 있는데요,단위벡터는 크기(길이)가 1인 벡터를 말합니다.앞으로 작업할 때 이 '단위벡터'라는 것을 자주 쓰게 될 것입니다. - Vector의 덧셈 벡터 A (0.1)과 벡터 B(1.0)을 더해줍시다.간단히(1.0)+(0.1) = (1.1)의 벡터가 나옵니다. 위 경우 벡터의 크기가 동일하여, 방향만을 더해 값을 낸 경우입니다. -Vector의 뺄셈 그렇다면 벡터 A와 B의 뺄셈은 어떻게 이루어질까요? A-B를 달리 표현해봅시다. A+(-B) A값에 -B값(B에 -1을 곱합니다)을 더하는 것 입니다. 벡터가 -될 경우, 역방향을 갖게 됩니다. 간단히 그..
Light Diffuse Light (난반사) 빛이 여러 각도로 굴절, 반사되어 여러 방향으로 퍼지는 현상을 말합니다. 물체의 표면에 흡수된 후에 빛이 방출되기 때문에, 물체 고유의 색을 인지할 수 있도록 합니다. Ambient Light 주 광원의 영향을 직접 받지 않고 다른 물체에 흡수, 반사되어 도달하는 간접광을 말합니다. 주 광원의 색상이 아닌, 주변 물체, 환경의 색상을 띠게 됩니다. 작년 과제를 봅시다... 천장의 Diffuse Color는 흰 색인데도, 노란 색의 벽지가 강하게 반사되어 노란 빛을 띠는 것을 확인할 수 있습니다. Specular Reflection (정반사) 매끈한 면을 경계로 일어나는 반사입니다. 빛의 방향과 같은 각도의 방향으로 반사됩니다. 빛이 반사하는 정도에 따라 대상..
Vertex (정점, 꼭짓점) - 버텍스는 Index, Position , UV (Texcoord0), Normal, Color의 정보를 가지고 있다.- 버텍스 셰이더를 통해 이러한 정보값을 변화시켜 텍스쳐를 바꾸거나, 색상을 바꾸거나, 버텍스의 위치를 바꾸는 등의 작업이 가능하다. - Unity에서의 VertexDraw는 별도의 플러그인을 받아서 진행할 수 있다 : polybrush Vertex Color- Vertex가 가진 Color값을 가져와보자. Vertex는 엔진 내의 오브젝트가 가지고 있는 정보이므로, Struct Input에서 불러온다. 버텍스 컬러가 출력됨 - c 텍스쳐에 버텍스 컬러값을 연산하면(더하거나, 곱하는 등) 텍스쳐 위에 컬러를 얹을 수 있다. 곱하기 연산을 했기 때문에, 어둡..
1. UV 컨트롤 - UV? 텍스쳐의 좌표계를 의미한다. U는 X로, V는 Y로 이해하면 됩니다. 주의할 점!엔진에서 차용하는 API에 따라 UV 좌표의 기준이 다릅니다. 언리얼에서는 DirectX를, 유니티에서는 OpenGL의 기준을 따르니 이 점 꼭 생각하고 작업하도록 합시다. 모델링 데이터를 엔진에 가져가면, UV의 데이터값이 float2(U,V) 로 들어갑니다.데이터의 버텍스 위치에 UV좌표값을 입력하여 계산합니다. 이를 활용하여 UV를 컨트롤할 수 있 수 있습니다. 셰이더를 한 번 열어보자. 이 안에 UV 정보는 어디에 있을까요? Struct Input 에서 엔진에 입력된 UV값을 받아오고 있습니다. UV이기 때문에 역시나 float2 값을 쓰고 있네요. - UV 컨트롤 float2 UV 값에 ..