코로나에서 회복되고 곧바로 성큼 다가온 조기 수료제 시험날...
잘 보았다고 할 수는 없지만, 공부한 만큼 했다고 생각이 들 정도로 보았다.
덕분에 그동안 내가 편식하듯이 특정 부분에만 더 집중해서 공부하고, 어떤 부분은 정말 부족하다는 것을 잘 알게 되어 좋은 경험이었다.
한편, 수업에서는 쉐이더에 대해 배웠다.
저번 파티클에 이어서 쉽지 않았던 부분이라서, 걱정이 앞섰지만.. 실제 적용된 모습들을 보면서 공부하니 생각보다 친근함을 느낄 수 있었다.
물론, 쉬웠던 것은 아니라서.. 회고록을 작성하는 김에 다시 한번 개념들을 정리하고자 한다.
Starters 9주차 스터디 - '알고리즘 스터디'
알고리즘 테스트 코드 리뷰
수요일 격리 해제가 되자마자 조기수료 알고리즘 테스트를 보았다.
사실.. 그동안 유니티 공부하기 바쁘다며, 너무 소홀히 하기도 했고, 스터디도 시작한 지 얼마 안 되어 코로나에 걸려서 딱히 실력이랄 게 없는 상태로 시험에 임했다.
그래서 오히려 테스트가 끝나고 크게 충격은 없었다.
다만, 열심히 해야할 필요는 느꼈다.
그리고, 바로 그날로 알고리즘 문제에 대한 코드 리뷰를 진행했다.
아래는 리뷰를 진행한 문제 중 하나를 가져왔다.
프로그래머스 - 모의고사
제출한 코드
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class Solution
{
public int[] solution(int[] answers)
{
List<int> result = new List<int>();
// 배열 담아두기 - 찍는 번호들 1, 2, 3
// students int[][]
int[] person1 = new int[] { 1, 2, 3, 4, 5 };
int[] person2 = new int[] { 2, 1, 2, 3, 2, 4, 2, 5 };
int[] person3 = new int[] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
int[][] student = new int[][] { person1, person2, person3 };
int[] correct = new int[3];
for (int idx = 0; idx < correct.Length; idx++)
{
for (int n = 0; n < answers.Length; n++)
{
int num = (n % student[idx].Length);
if (student[idx][num] == answers[n])
{
correct[idx]++;
}
}
}
foreach (int v in correct)
Console.WriteLine(v);
int maxValue = correct.Max();
for (int i = 0; i < correct.Length; i++)
{
if (maxValue == correct[i])
{
result.Add(i+1);
}
}
return result.ToArray();
}
}
시험을 찍는 세 사람이 문제가 주어졌을 때에 얼마나 맞추었을지를 확인해서 가장 많은 문제를 맞은 사람들을 출력하는 문제였다.
세 사람이 찍는 번호의 순서는 간단하게 이차원 배열로 저장하고, 새로운 배열로 세 사람이 맞은 문제 수를 저장하였다.
실제 문제의 답들이 입력되면, 이차원 배열을 돌면서, 각 사람의 답안과 해당 번호의 답이 일치하는 경우 해당 사람의 맞은 문제 수에 1을 추가하였다.
그렇게 세 사람이 맞힌 문제의 수가 배열로 모두 저장되면, .Max()를 통해 해당 배열의 최댓값을 뽑은 뒤 다시 반복문으로 해당 최댓값과 같은 수의 문제를 맞은 사람을 뽑아 리턴하였다.
말로는 쉬운 문제였으나, 주어진 답안을 순회하면서 각 사람 당 알맞는 번호와 매칭 하는 것(반복해서 답안을 작성하므로, % 연산자를 사용했다.)과 이차원 배열 등으로 답안들을 저장하고, 꺼내는 과정이 조금씩 헷갈렸었다.
https://school.programmers.co.kr/learn/courses/30/lessons/42840
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Starters 9주차 수업 - '쉐이더'
Standard Shader
유니티에서 material을 오브젝트에 넣을 때마다 우리는 쉐이더를 마주한다.
material의 최상단에서 쉐이더를 선택하는데.. 보통의 경우는 Standard 쉐이더를 사용하게 된다.
Standard 쉐이더는 기존 legacy 쉐이더들과 다르게 유니티 5에서 처음 등장했다.
PDR이라는 개념이 추가되어 물리적인 효과를 하나의 쉐이더로 구현할 수 있게 되면서 더 이상 정반사, 난반사, 환경광 등 여러 개의 쉐이더를 쓰고, 물리적인 값을 추가로 계산하는 일이 적어졌다.
예를 들면 Albedo라는 속성은 물체의 색을 지정하는 속성이다.
이전의 쉐이더는 난반사에 대한 빛의 색을 지정할 뿐 물체의 색을 넣을 수가 없었다.
하지만, Standard 쉐이더에서 그게 가능해진 이유가 바로, 빛을 포함한 여러 물리현상을 다루기 때문에 물체의 색을 미리 지정하고, 해당 물리 계산에 따라 처리가 가능해졌기 때문이다.
아무래도 가장 많이 사용하게 될 쉐이더인 만큼 속성에 대해 꼼꼼하게 강의를 하셨다.
↘︎ UV
: 텍스쳐 등을 매핑하는 기술을 정하는 속성
↘︎ Metalic
: 금속 재질의 정도를 결정하는 속성으로 0일 수록 비금속, 1일 수록 금속 재질을 띤다.
↘︎ Smoothness
: 스펙츌러 효과 즉, 반사에 대한 속성으로, 빛을 얼마나 반사할지를 설정한다. Metalic이 1인 물체에 Smoothness를 1로 하면, 거울처럼 근처 오브젝트가 비치게 된다.
↘︎ Rendering Mode
Opaque : 투명한 부분이 없이 모두 표현함
CutOut : 알파 값에 대한 threashord를 정해주는 모드로 알파 값이 설정값 이상이면, 무조건 알파 값을 1로 먹임
Fade : 서서히 알파값을 적용시킴
Transparent : 부모의 속성을 따름
↘︎ Normal map
: 입체값을 주기 위해 rgb로 된 텍스쳐를 사용해서 각 부분의 반사각을 정해주는 속성으로 세기를 0~1로 조절할 수도 있음
...
<참고 자료>
쉐이더 만들기
Shader "Udemy/unlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Colour ("Colour", Color) = (1, 1, 1, 1)
_DisolveTexture ("Disolve", 2D) = "white" {}
_DissolveCutoff ("DissolveCutoff", Range(0, 1)) = 1
}
SubShader
{
Tags { "RenderType"="Transparent" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata // struct 이름은 바꿔도 상관은 없음
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
half4 _Colour;
sampler2D _DisolveTexture;
float4 _DissolveCutoff;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = v.uv + _SinTime;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 c1 = tex2D(_MainTex, i.uv);
fixed4 c2 = tex2D(_DisolveTexture, i.uv);
c2.rb = 0;
return c1 - lerp(c1,c2,saturate(sign(1 - c2.g))) * (1 - _Colour);
}
ENDCG
}
}
}
쉐이더는 CG라는 새로운 언어로 작성된다.
쉐이더를 작성하여 저장하면, 해당 쉐이더를 지닌 프로젝트에서 material의 쉐이더를 선택할 때에 해당 쉐이더를 선택할 수 있게 된다.
Property에서는 실제로 프로퍼티에서 조절할 속성들을 선언한다.
2D는 텍스쳐를 넣게 해 주고, Color는 컬러 벡터 값 그리고, Range는 최솟값과 최댓값 사이의 값을 선택할 수 있도록 해준다.
Pass 아래 부분에는 방금 선언한 프로퍼티와 연결되는 변수들을 선언해야 한다.
텍스쳐는 Sampler2D로, 컬러 값과 같은 벡터 값은 float4 혹은 half4 타입으로 선언하게 된다.
vert는 입력 데이터인 appdata 구조체에서 vertex와 uv를 가지고 와서 uv의 이동 등의 물리적인 효과를 처리하는 역할을 한다.
예를 들면, o.uv = v.uv + _SinTime;을 하면, Sin 함수에 의해서 계속 반복되는 시간 값을 uv에 더해서 텍스쳐가 물체에 입혀질 때에 텍스쳐가 움직이는 효과를 만들어준다.
frag는 컬러 값을 변동하는 역할을 한다.
해당 코드에서는 마스크 효과로 사용할 텍스쳐의 값을 sign 함수로 -1 아니면, 1의 극단적인 값으로 만든 뒤에 다시 saturate 함수의 선형적인 값으로 가져오게 된다.
그렇게 되면, 마스크 텍스쳐인 c2의 g값(rgb 중)이 입혀진 곳은 1 아예 없는 곳은 0으로 되어 원래 색 값에서 빠지게 되고, 마스킹 효과를 주게 된다. (코드 뒤에 color를 이용해서 투명해지는 것 대신에 선택한 컬러로 입히게 하였다.)
유데미 코리아 바로가기 :
Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea
유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.
www.udemykorea.com
💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
'Starters 부트캠프 > B - log' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 11주차 학습 일지 (0) | 2022.09.04 |
---|---|
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 10주차 학습 일지 (0) | 2022.08.28 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 8주차 학습 일지 (0) | 2022.08.14 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 7주차 학습 일지 (0) | 2022.08.07 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 6주차 학습 일지 (2) | 2022.07.30 |