-
<덧셈>
flaot3 (0.5,0.5,0.5) + flaot3 (0.5,0.5,0.5) = flaot3 (1,1,1)
flaot3 (1,1,0) + flaot3 (1,0,) = flaot3 (2,1,0) 하지만 실제로 보이는 색상은 (1,1,0) 데이터에는 (2,1,0)으로 저장되어 있다
<뺄셈>
flaot3 (1,0,0) - flaot3 (0,0,1) = flaot3 (1,0,-1) 하지만 실제로 보이는 색상은 (1,0,0) 데이터는 마찬가지
<곱셈>
flaot3 (0.5,0.5,0.5) * flaot3 (0.5,0.5,0.5) = flaot3 (0.25,0.25,0.25)
float3(1,0,0) * float3(0,1,0) = float3(0,0,0)
<한자리수 이용>
연산은 같은 자릿수끼리만 가능하다(float-float, float3-float3)
그러나 한자리와는 언제나 가능하다 (ex) float3(0,1,0) + 1 = float3(0,1,0) + float3(1,1,1)
이처럼 한자리 숫자는 어떤 자리의 숫자와도 연산이 가능하다
1 - flaot3(1,0,0) = flaot3(0,1,1)
float3(1,0,0) - 1 = float3(0,-1,-1) 실제로 보이는건 (0,0,0)
여기까지는 그렇게 어려운 내용이 아니기에 식으로만 적었다
<변수>
void surf(Input IN, Inout SurfaceOutputStandard o) { float4 test; // 혹은 float4 test = float(1,0,0,1); o.Albedo = test.rgb; }
float4 형식으로 test라는 변수에 (1,0,0,1)의 값을 넣어주었다
그리고 Albedo로 출력을 해준다. Albedo는 float3 형식이지만 test뒤에 rgb값만 쓰겠다고 했기 때문에 문제되지 않는다
(변수는 무조건 출력하겠다는 줄보다 위에 있어야한다)
이제 이것들을 응용해보자
o.Albedo = test.grb => (0,1,0) 출력
o.Albedo = test.ggt => (0,0,1) 출력
o.Albedo = test.rrr => (1,1,1) 출력
o.Albedo = test.b => b는 0이므로 (0,0,0)출력
이번에는 변수의 개수를 늘려보겠다
void surf (Input IN, inout SurfaceOutputStandard o) { float r = 1; float gg = float2(0.5, 0) float bbb = float3(1,0,1) // 입력할 줄 }
o.Albedo = float3(r,0,0); => (1,0,0)
o.Albedo = float3(0,gg) => (0,0.5,0) float3 형식이니 자연스럽게 2개가 이어 들어간다
o.Albedo = float3(bbb.b, gg.r, r.r) => (1,0.5,1)
o.Albedo = float3(bbb.rgb) => (1,0,1)
o.Albedo = float3(r.rrr) => (1,1,1)
<응용심화 - 색상 입력받아 출력1>
Shader "Custom/NewSurfaceShader" { Properties { //1. Meterial의 Inspector창에 띄운다 _Mycolor("Mycolor", color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; //2. _Mycolor 변수 선언 float4 _Mycolor; void surf (Input IN, inout SurfaceOutputStandard o) { //3.입력받은 RGB값으로 출력 o.Albedo = _Mycolor.rgb; } ENDCG } FallBack "Diffuse" }
Inspector창에서 색을 조절하는대로 실시간으로 구의 색을 바꿔주는 스크립트이다
총 3가지가 충족을 해야하는데
1. Inspector창에 색상을 조절하는 창을 띄우기
2. 입력받은 값을 가질 변수 선언
3. 변수에 받은 RGB값을 출력하기
정상적으로 작동하는것을 확인할 수 있다
<응용심화 - 색상 입력받아 출력2>
이번에는 직접 RGB값 3가지를 따로따로 조절하여 색상을 맞춰보겠다
Shader "Custom/NewSurfaceShader" { Properties { _Red("Red", range(0,1)) = 0 _Green("Green", range(0,1)) = 0 _Blue("Blue", range(0,1)) = 0 } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; float _Red; float _Blue; float _Green; void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = float3(_Red, _Green, _Blue); } ENDCG } FallBack "Diffuse" }
1. 방금것과 거의 비슷하다. 이번엔 R,G,B값으로 각각 range 형식의 3요소를 전부 Inspector창에 만들어준뒤
2. 변수 1나씩 각각 출력할 색 요소를 하나씩 맡을 예정이므로 float식의 변수 3개를 선언해준다
3. 그리고 Albedo로 flaot3의 rgb를 각각 Red, Green, Blue 변수로 1개씩 할당해주면 된다
+여기서 색을 밝고 어둡게 만드는 기능까지 추가해본다면
Shader "Custom/NewSurfaceShader" { Properties { _BrightandDark("Bright and Dark", range(-1,1)) = 0 _Red("Red", range(0,1)) = 0 _Green("Green", range(0,1)) = 0 _Blue("Blue", range(0,1)) = 0 } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; float _Red; float _Blue; float _Green; float _BrightandDark; void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = float3(_Red, _Green, _Blue) + _BrightandDark; } ENDCG } FallBack "Diffuse" }
이번엔 range 형식으로 -1부터 1까지의 범위로 만든다. 밝아지는것과 어두워지는 기능이 둘다 필요하기 때문
그리고 변수를 선언해준뒤 방금 출력문에 밝기조절 변수를 더해주면 된다
예를들어 float3(1,0,1) 인 상태에서 -0.3이 들어간다면
rgb 전체값이 0.3만큼 빠져버리기 때문에 이렇게 밝기조절이 가능한것이다
또다시 제대로 작동하는것을 확인한다
'유니티 > 게임그래픽' 카테고리의 다른 글
UV - Time (2) 2024.02.20 UV (0) 2024.02.19 이미지 흑백으로 만들기, Lerp 함수 (0) 2024.02.19 텍스쳐 입력받기 (0) 2024.02.19 Shader 기초지식 & 구에 색상 집어넣기 (0) 2024.02.18