렌더링 기초는 앞 셰이더 포스팅에도 했지만 렌더링 파이프라인은 중요하기 때문에 한번 더 집고 넘어가겠습니다.

유니티 셰이더 파이프라인을 간단하게 보고 자세한건 따로 포스티하겠습니다.

대략적으론 3D 물체를 2D 화면까지 표현하는 과정인데

https://youtu.be/KnueAgpUL3Y

설명보단 영상이 좋을꺼 같아 준비했습니다. 이 포스팅은 위 영상을 토대로 갑니다.

설명은 1분부터 5분까지입니다.

이제 유니티에서 프로젝트를 생성해보겠습니다. 생성 전에 버전은 2019.3 버전 이상을 사용해야합니다.19.4버전을 사용하겠습니다. 템플릿은 Universal RP(Render Pipeline)을 클릭하고 생성합니다.

아래 파일을 삭제해줍니다.

Edit -> Project Settings -> Graphics를 보면 UniversalRP-HighQuality가 들어가있습니다. 클릭 시 Assets > Settings 파일에 있습니다. 여러 파일이 있습니다. 사양에 따른 설정 값 같습니다. 유니티에선 셰이더를 그래프 형식으로 보여주는 기능이 있습니다. 위는 원래 쓰던 코드형식

그리고 기존 프로젝트에서 렌더링파이프 프로젝트로 업그레이드 하는 방법입니다.

패키지 매니저를 열어 RP를 검색 후 Universal RP를 다운 받아줍니다. 화면에 RP가 여러종류가 있습니다. Light는 예전에 사용하던것, HD(High Definition)는 고성능 입니다. 정확히는 Universal RP의 노드를 몇가지 추가한 업그레이드 버전이라서 Universal RP의 노드를 다 알아야합니다.

설치를 다한 후 Edit -> Project Settings -> Graphics으로 가서 보면 None입니다. Create -> Randring -> Universal Rander Pipeline - Pipline Asset을 생성해줍니다. 그럼 두가지가 생성됩니다. 그중 짧은 Asset 파일을 끌어다가 None에 넣어줍니다.

기존 셰이더는 핑크색이 뜰텐데 Edit -> Universal Rander Pipeline -> Upgrade Project Materials to UniversalRP Materials(첫번째)를 클릭해줍니다. 이렇게 되면 기존 프로젝트도 업그레이드가 완료되었습니다.

이제 구를 생성하고 테스트를 해보면 머테리얼 셰이더의 기본값이 바낀걸 볼 수 있습니다.

아래 처럼 PBR(Physically Based Rendering) Graph 물리기반렌더링으로 머테리얼을 제작 가능하고 위에 2D Renderer를 열어보면 2가지가 있는데 위에껀 빛에 반응 밑에껀 빛에 반응하지 않는 셰이더를 생성하는겁니다.

2D에서 나와서 Unlit 빛에 반응하지 않고 PBR는 물리기반 현실 세계 VFX 파티클을 많이 만드는 시스템에서 사용 Sub 는 그래프를 묶을 수 있습니다. 이제 PBR Shader를 만들어보겠습니다.

만들면 아래와 같이 되는데 PBR Shader 오른 클릭 후 머테리얼을 생성하면 머테리얼을 직접 그래프 드래그 드롭 안해도 들어가있는 상태입니다. 그리고 이 머테리얼을 구에 넣어줍니다.

이제 만들어둔 PBR Shader을 더블 클릭하면 그래프가 뜹니다.

요기까지 기본 세팅하고 그래프를 여는걸 해봤습니다. 알고리즘 공부 후 이어서 해보겠습니다. 

Shadertoy 튜토리얼 한글번역

셰이더 토이 WebGL 기반, OpenGL 베이스로된 사이트입니다. 튜토리얼을 진행해보겠습니다.

빈화면

"main" 함수는 쉐이더 효과를 출력하기 위해서 매초 마다 수십회 호출합니다. 컴퓨터 시스템은 초당 60프레임(60FPS)를 출력하려고 노력합니다. 하지만 GLSL 스크립트가 계산이 빡세지면 이 숫자는 더 낮아질 수 있습니다.

(FPS는 화면 아래쪽 정보바에 표시됩니다.)

균일 색상

frageColor는 쉐이더의 출력입니다. 이 값은 화면에 보여지는 이미지를 결정합니다.이 쉐이더는 이 값을 노란색으로 지정합니다. vec4( r, g ,b , a); 값입니다. 뒤에 값에 넣는거에 따른 색이 바낍니다.

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    fragColor = vec4(1.0, 1.0, 0.0 ,1.0);
}

GLSL 벡터들

"fragColor" 는 vec4 객체에 할당되어야 합니다. 0~1 사이 실수 값이 담긴 4개 짜리 배열 입니다. 앞에 3 개의 숫자는 색상을 지정 하고 4번째 숫자는 불투명도(opactiy) 를 지정 합니다. (당장은 4 번째 투명도 값은 아무런 효과도 없습니다.)

하나의 vec2 객체는 4개의 float 을 인자로 받아 생성되거나 아래처럼, vec3 와 float. 2개의 인자를 생성자 인자로 받아 생성됩니다.

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	// Here we are seperating the color and transparency parts
	// of the vec4 that represents the pixels.
	vec3 color = vec3(0.0, 1.0, 1.0);
	float alpha = 1.0;
	
	vec4 pixel = vec4(color, alpha);
	fragColor = pixel;
}

현재 셰이더 토이보단 유니티 셰이더쪽을 익히는게 좋을꺼같아서 유니티 셰이더를 앞으로 연재하겠습니다.

어제 학원 수료가 끝나고 알고리즘의 부족함과 셰이더가 재밌어서 하루 할당량을 정해서 공부 해나갈 생각입니다.

알고리즘 문제, 셰이더 코드 하나, 일단 이렇게 해볼 생각입니다. 좀 더 할수도 있습니다.

일단 알고리즘을 하기 전 유니티 C#을 쓰다보니 와서 C++을 이용한 문제를 풀어볼 생각입니다.

기초 100제에서 하루 20문제로 손 좀 풀고 백준에서 단계별로 학습해볼 생각입니다.

모든 문제는 C++로 풀이하였습니다.

2557번 Hello World

#include <stdio.h>
using namespace std;

int main() {
    printf("Hello World!");
    return 0;
}

10718번 We Love Kriii

printf("강한친구 대한육군\n강한친구 대한육군");

10171번 고양이

printf("\\    /\\\n");
printf(" )  ( ')\n");
printf("(  /  )\n");
printf(" \\(__)|");

위 문제는 \(백 슬래쉬)를 출력을 하는 방법을 알려주는거라서 재미로 맞춰도 좋지만 시간을 뻇기지 않기 위해 복사를 추천합니다.

10172번 개

printf("|\\_/|\n");
printf("|q p|   /}\n");
printf("( 0 )\"\"\"\\\n");
printf("|\"^\"`    |\n");
printf("||_/=\\\\__|");

이건 " 출력 \(백 슬래쉬) 출력을 중점을 두고 있습니다. 띄우기 몇칸인지 출력문에서 복사해서 사용하는걸 추천합니다.

1000번 A+B

 int a;
 int b;
 scanf("%d %d", &a,&b);
 printf("%d", a+b);

1001번 A-B

int a;
int b;
scanf("%d %d", &a,&b);
printf("%d", a-b);

10998번 AxB

int a;
int b;
scanf("%d %d", &a,&b);
printf("%d", a*b);

10869번 사칙연산

 int a;
 int b;
 scanf("%d %d", &a,&b);
 printf("%d\n%d\n%d\n%d\n%d\n", a+b,a-b,a*b,a/b,a%b);

10430번 나머지

int a,b,c;
scanf("%d %d %d", &a,&b,&c);
printf("%d\n%d\n%d\n%d\n", (a+b)%c, ((a%c)+(b%c))%c, (a*b)%c, ((a%c)*(b%c))%c);

2588번 곱셈

int a,b;
scanf("%d %d", &a,&b);

printf("%d\n", a * (b % 10));
printf("%d\n", a * ((b % 100) / 10));
printf("%d\n", a * (b / 100));
printf("%d", a * b);

출력 단계 완료했습니다.

1008번 A/B 빼먹게 있어 추가했습니다.

   double a;
   double b;
   scanf("%lf %lf", &a,&b);
   printf("%.13lf\n", a/b);

 

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

C++ 백준 while문  (0) 2021.06.10
Day5 C# 백준 if문  (0) 2021.06.02
[알고리즘] C# ArrayList와 LinkedList  (0) 2021.05.15
[알고리즘] C# 배열 재정리  (0) 2021.05.15
[알고리즘] 자료구조?  (0) 2021.05.15

조건

조건 파악을 무엇보다 빠르게 하는게 중요합니다. 이게 속도면에서 많이 차이날듯합니다.

using System;
using System.Collections.Generic;

public class Solution {
    public int solution(int n, int[] lost, int[] reserve) 
    {
        int answer = 0;
        List<int> Reservelist = new List<int>(reserve);
        List<int> LostList = new List<int>(lost);
        List<int> removelist = new List<int>();

        // 여벌체육복이 있지만 도난당한 학생 리스트 작성
        foreach(var val in Reservelist)
        {
            foreach(var val2 in LostList)
            {
                if(val == val2) 
                {
                    removelist.Add(val);
                    break;
               }
            }
        }
        foreach(var val in removelist)
        {
            // 여벌있던 학생은 도난 당한 사람 명단에선 삭제
            LostList.Remove(val);
            // 여벌이 있는 사람 리스트에서도 삭제
            Reservelist.Remove(val);
        }
        // 없는 사람만큼 돌려야함.
        for (int i = 0; i < LostList.Count; i++)
        {
            // 체격 차이 조건을 변수 선언
            int a = LostList[i];
            int b = LostList[i] + 1;
            int c = LostList[i] - 1;

            // 여벌 한벌을 조건으로 걸고 체격 차이 조건으로 검사
            foreach(var val in Reservelist)
            {
                // 체격 +1 or -1 or 같은 사람 검사
                if (val == a || val == b || val == c)
                {
                    // 체격 조건 통과 시 여벌옷을 줌
                    // 여벌을 줬으니 삭제
                    Reservelist.Remove(val);
                    // 빌려줘서 체육이 가능한 인원 ++
                    answer++;
                    break;
                }
            }

        }
        // for문으로 체육복 다 빌려준 상태
        // 체육 수업을 들을 수 있는 학생의 최댓값
        // 잃어버린 사람에서 빌린 사람 수 빼고
        // 최종적으로 못 빌린 사람과 전체 학생 수를 뺌
        return n - (LostList.Count - answer);
    }
}

하면서 느낀게 뚜렷한 숫자가 안보이면 먼가 자주 막힘 유니티에서 그래서 Log를 좋아했습니다. 이런 테스트는 머리속으로 숫자를 생각하면서 하면 좋을것 같습니다.

다른 풀이

using System;

public class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        for (int i = 0; i < lost.Length; i++)
            {
            	// 인덱스 값 두번 돌림
                for (int j = 0; j < reserve.Length; j++)
                {
                // 잃어버린 사람[i] == 여벌 있는사람 [j]
                    if (lost[i] == reserve[j])
                    {
                	// 여벌있지만 잃어버린 사람 수 (체육 할 수 있는 사람)
                        answer++;
                        lost[i] = 100;
                        reserve[j] = 200;
                        break;
                    }
                }
            }

        for (int i = 0; i < lost.Length; i++)
            {
            	// 다시 위와 같은 조건으로 돌려줌
                for (int j = 0; j < reserve.Length; j++)
                {
                	// 나머지 값으로 차이 값과 같은지 비교
                	// 잃어버린 사람 [i] - 여벌 [j] == -1 || 
                    // 잃어버린 사람 [i] - 여벌 [j] == 1 
                    if (((lost[i] - reserve[j]) == -1) || ((lost[i] - reserve[j]) == 1))
                    {
                    	// 오차범위 계산한 인원 수 (체육 할 수 있는 사람)
                        answer++;
                        lost[i] = 100;
                        reserve[j] = 200;
                        break;
                    }
                }
            }
        answer += n - lost.Length;
            return answer;
    }
}

 

참고 자료 - ArrayList와 LinkedList란 무엇인가? (tistory.com)

 

ArrayList(선형리스트) 

개념

선형 리스트는 배열과 같이 연속되는 기억장소에 저장되는 리스트를 말한다.

연접 리스트(Dense List) 또는 축차 구조(Sequential Structure)라고도 한다.

차이

배열은 고정된 크기의 연속된 배열요소들의 집합이므로 배열을 초기화 할 때 총 배열 요소의 수를 미리 지정해야 한다. 하지만 경우에 따라 배열요소가 몇 개나 필요한 지 미리 알 수 없는 경우가 있으며, 중간에 필요에 따라 배열을 확장해야 하는 경우도 있다..NET에는 이러한 동적 배열을 지원하는 클래스로 ArrayList와 List<T>이 있다. 이들 동적 배열 클래스들은 배열 확장이 필요한 경우, 내부적으로 배열 크기가 2배인 새로운 배열을 생성하고 모든 기존 배열 요소들을 새로운 배열에 복사한 후 기존 배열을 해제한다.

 

선형리스트의 특징

1. 가장 간단한 자료구조이다.

2. 접근속도가 빠르다.

3. 중간에 자료를 삽입하기 위해서는 연속된 빈 공간이 있어야 한다.

4. 기억장소를 연속적으로 배정받기 때문에 기억장소 이용 효율은 밀도가 1로서 가장 좋다.

5. 자료의 개수가 n개일 때 삽입 시의 평균 이동 횟수는 (n+1)/2이고, 삭제 시에는 (n-1)/2이다.

6. 삽입, 삭제 시 자료의 이동이 필요하기 때문에 작업이 번거롭다.

 

 

LinkedList(연결리스트) 

개념

링크드 리스트 (Linked List, 연결 리스트)는 데이타를 포함하는 노드들을 연결하여 컬렉션을 만든 자료 구조로서 각 노드는 데이타와 다음/이전 링크 포인터를 갖게 된다.단일 연결 리스트(Singly Linked List)는 노드를 다음 링크로만 연결한 리스트이고 이중 연결 리스트는 각 노드를 다음 링크와 이전 링크 모두 연결한 리스트이다. 만약 링크를 순환해서 마지막 노드의 다음 링크가 처음 노드를 가리키게 했을 경우 이를 순환 연결 리스트 (Circular Linked List)라 부른다.

차이

연결 리스트는 자료들을 반드시 연속적으로 배열시키지는 않고 임의의 기억공간에 기억시키되, 자료 항목의 순서에 따라 노드의 포인터 부분을 이용하여 서로 연결시킨 자료 구조이다.

 

연결 리스트의 특징

1. 노드의 삽입, 삭제 작업이 용이하다.

2. 기억공간이 연속적으로 놓여 있지 않아도 저장이 가능하다.

3. 연결을 위한 링크(포인터) 부분이 필요하기 때문에 순차 리스트에 비해 기억공간 이용 효율이 좋지 않다.

4. 연결을 위한 포인터를 찾는 시간이 필요하기 때문에 접근 속도가 느리다.

5. 중간 노드 연결이 끊어지면 그 다음 노드를 찾기 힘들다.

6. 희소 행렬 을 링크드 리스트로 표현하면 기억장소가 절약된다.

7. 트리를 표현할 때 가장 적합한 자료 구조이다.

 

연결리스트의 종류

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

C++ 백준 while문  (0) 2021.06.10
Day5 C# 백준 if문  (0) 2021.06.02
Day1 백준 입출력과 사칙연산  (0) 2021.05.25
[알고리즘] C# 배열 재정리  (0) 2021.05.15
[알고리즘] 자료구조?  (0) 2021.05.15

C# 배열(Array)

자료형[] 배열명 = new 자료형[크기];

int[] arr = net int[i] {4, 9, ...}

첨자값(index, 인덱스)은 항상 0부터 시작한다.

출력 방법

Console.WriteLine("arr[0] = {0}", arr[0]);

여러 배열 선언 방법

int[] arr = {4,9,19,2}; / int[] arr = new int[]{4,5,1,23,12};

System.Array (using System) 선언 시 Array만 적으니 다른 코드 공부 시 혼란 주의, 아래는 Array 함수 일부만 정리했습니다.

 

get 함수

Rank(차원 수,길이를 가져옵니다. 1차원은 1 2차원은 2를 반환), Length(배열 길이)

 

set 함수

==========================

복사 관련 함수 정리

a[0] = b[0] 식으로 코드를 작성하게 되면 참조값만 복사가 이루어진다고 한다. * 참조 : 객체의 실제 위치를 가리키는 포인터

 

Clone() Shallow Copy (얕은 복사)

Shallow Copy는 배열요소의 값을 그대로 복사하는 방식 Value Type(변수)이면 실제 값이 그대로 복사되어 아무 문제가 없으나 Reference Type(참조)의 값인 경우 레퍼런스만 복사하기 때문에, 동일한 Reference Type(참조)객체를 가리키는 포인터만 복사하는 효과가 있다. (단순 지정한 값을 복사 (참조값일 시 참조값만 복사)

배열B = (자료형[])배열A.Clone();  // 배열 A를 배열 B에 통째로 복사

 

CopyTo() Deep Copy(깊은 복사) // 인스턴스 메서드

Deep Copy는 Reference Type(참조)객체에 대해 실제 새로운 Reference(참조)객체를 생성하고 내용까지 전부 복사하기 때문에 완변한 복제본으로 볼 수 있다. (참조 값 주소를 찾아 안에 내용까지 복사)

Array.Copy(배열A, 배열B, 2)  // 배열 A의 값을 배열 B로 0번재부터 2개 복사 (정적메서드)

Array.Copy(배열A, 0, 배열B, 2, 3)  // 배열 A의 0번째 값부터 3개를 배열 B, 2번째부터 복사

==========================

ForEach 지정한 배열의 각 요소에서 지정한 동작을 수행합니다.

Array.ForEach<데이터타입>(동작을 수행할 배열, new Action<데이터타입>(액션);

===

다차원 배열

자료형[,] 배열명 = new 자료형 [행, 열]; // 기본 형태 - 자료형 [,] 에 ,가 두개 일 시 3차원 배열이 되는겁니다.

int [,] arr2 = new int[2,3]
{
{2, 3, 4} ,
{3, 6, 7}
};

보기 좋게 작성해봤습니다. 제가 주로 사용하는 형식입니다. 

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

C++ 백준 while문  (0) 2021.06.10
Day5 C# 백준 if문  (0) 2021.06.02
Day1 백준 입출력과 사칙연산  (0) 2021.05.25
[알고리즘] C# ArrayList와 LinkedList  (0) 2021.05.15
[알고리즘] 자료구조?  (0) 2021.05.15

프로그래밍 언어를 다루는 사람이라면 배워야하고 필수적인 것입니다.

그래서 이번엔 자세히 공부해볼 생각입니다. 그럼 실전에 들어가기 앞서 이론적인 부분을 공부하고 들어가는게 좋은것 같습니다.

들어가기 앞서 자료구조가 무엇인지 알고리즘이 무엇인지 확실히 잡고 가겠습니다.

참고 영상 링크

본 사람은 봤겠지만 정리 잘해주셨고 자료구조, 알고리즘에 기본적인 베이스를 깔아줍니다.

본 내용 토대로 게임에 접목시켜 이해 해보도록 하겠습니다.

일단 자료 구조 먼저입니다.

자료구조 - 서비스나 어플리케이션을 메모리에 어떻게 구조적으로 잘 정리해서 담아두고 관리하고 최종적으로 가장 효율적인 방식으로 필요한 데이터에 빠르게 접근 하고 필요한 접근, 수정, 삽입, 삭제 할 수 있도록 도와줍니다.

현재 지식으로 정리하자면 게임 내부에서 메모리를 구조적으로 정리, 관리하여 가장 효율적인 방식으로 필요한 데이터(DB)를 빠르게 접근하고 수정 삽입 삭제가 가능 하도록 도와줍니다. 

자료 구조 그래프

이미지 출처 : [Algorithm] 자료구조란 무엇인가? (tistory.com)

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

C++ 백준 while문  (0) 2021.06.10
Day5 C# 백준 if문  (0) 2021.06.02
Day1 백준 입출력과 사칙연산  (0) 2021.05.25
[알고리즘] C# ArrayList와 LinkedList  (0) 2021.05.15
[알고리즘] C# 배열 재정리  (0) 2021.05.15

Enemy를 코드를 정리하여 다시 만들어볼 생각입니다. 중간 링크는 공부 자료입니다. 간단 설명으로 부족한 부분을 채우고 필요할때 보기 위함입니다.

들어가기 전

생각하고 가야할껄 한번 되새기고 작성 중에도 가끔 보게 적어놓도록 하겠습니다.

KISS  - Keep It Simple, Stupid : 간결하게 만들어야 그걸로 복잡한걸 만들 수 있다. (한가지 기능(함수), 한가지 책임(클래스), UI는 UI만)

HCL - High Cohesion Louse Coupling : 높은 응집도(Cohesion), 낮은 결합도 (단어 설명

간단하게 설명하면 비슷한것들 끼리 뭉쳐야하고 서로의 의존도는 낮아야 합니다.(오해 할 수 있으니 단어 설명을 보는걸 추천드립니다.)

DRY - Don't Repeat Yourself : 복붙하지말고 반복하지마세요 (함수화, 복붙 금지)

YAGNI - You aren't gonna need it : 필요하다고 간주할 때까지 기능을 추가히자 않는것이 좋다.

리팩토링에 필요한 자료를 정리하며 공부했습니다.

 

GRASP - General, Responsibility, Assignment, Software, Pattern (디자인패턴)

 

원칙 같은걸 배우고 사용하는건 자신을 위한것도 있지만 협업을 할때 좋기때문입니다. 상속을 사용하는 이유에 대해 의문이 참 많았습니다. 왜 이걸 상속받아서 재정의 해서 사용해야하나, 그걸 질문하니 협업을 위해서 라고 하니 먼가 띵하고 꽂혔습니다. 이부분을 머리에 가지고 아래를 공부하면 좋을꺼 같습니다.

=== 일기장이라서 일기 형식으로 느낀점 적어놨습니다 스킵해도됩니다.  ===

자료 조사하던중 의문이 생기는 부분인 리스코프 치환과 상속을 사용할때 예시가 만족스럽지 못해서 예시를 만들어서 가져갔습니다. 적을 만들꺼니 적을 기준으로 예를 들었습니다. 부모 클래스 Enemy와 자식 클래스 Melee Enemy ,Ranger Enemy가 있다고 과정하고 보통 예시는 Move()라는 함수를 만들어서 Enemy 부모 클래스에 만들고 Melee Enemy 클래스에 보통 상속해줘서 재정의 후 사용합니다. 요기서 의문점이 들었습니다. 어짜피 Move라는 이동 함수는 Melee든 Ranger든 같은데 Enemy 부모 클래스에서 Move를 다 만들어서 주면 좋지 않나요? 라고 선생님에게 물어봤습니다. 거기서 위와 같은 답을 얻었습니다. 전에 수업을 하면서 들은 말이 생각나네요 이해 안가도 대략적인 느낌을 알고 넘어가도된다. 이번 질문을 하며 수업때도 들었지만 까먹었던 말이 처음에 배운거라도 다시 보면 다르다라고 했던것도 생각나구요. 이래서 질문을 많이 해야하는것 같습니다. 경력이 있는 분들에게서 배운걸 흡수할려면 자신이 궁금하고 어느정도 지식을 습득한 후에 물어보면 새로운게 보이는거 같습니다.

==================================================

SOLID

단일 책임 원칙 (Single Responsibility Principle) - 특정 클래스마다 하는 일을 확실히 해야합니다.

 

아래 참고 기본 자료 : 조정훈, 게임 프로그래머를 위한 클래스 설계.

굵은 글씨로 링크 달아논것도 같이 봐야합니다.

개방 폐쇄 원칙 (Open Closed Principle) OCP -  모듈의 수정 없이 기능 확장 가능, 인터페이스는 임의로 변경할수 없다

확장은 새 클래스로 구현, 변경은 오류 수정 할때만 객체는 부모 객체를 대체가능해야 합니다.

 

리스노프 치환 원칙 (LSP) - 이름만 봐도 복잡합니다. 위 자료와 링크 자료가 다르므로 링크된 자료를 보는걸 추천합니다.

 

인터페이스 격리 원칙 (Interface Segregation Principle) ISP - 인터페이스는 서로 격리되어야 한다. 객체는 사용하지 않는 인터페이스의 영향을 받아서는 안된다. 필요 인터페이스만 사용 가능해야한다. (미사용 인터페이스는 구현하지 않는다)

 

의존성 역전 원칙 (Dependency Inversion Principle) - 상위 객체는 하위 객체를 몰라야한다. 의존성 순환이 벌어지면 안된다.

 

일단 위 자료를 토대로 리팩토링을 위한 규칙을 짜볼 생각입니다. 

이제부터 렌더링 파이프라인 (Rendering Pipeline) 설명입니다.

DirectX 그래픽스 파이프라인 순서 및 기본 설명과 기본 지식 블로그의 자료로 정리했습니다.

그래픽스 파이프라인(Graphics Pipeline) 과정

랜더링 파이프라인 (Rendering Pipeline) 과정

 

 

그래픽스 파이프 라인과 랜더링 파이프 라인을 합쳐놓은 그림

바로 위 그림 출처 : [3D] 그래픽스 파이프 라인 (tistory.com)

그림은 완벽히 이해 후 다시 만들어서 수정할 예정

알아 보던 중 헷갈리게 두개의 그래프가 나왔습니다. 차이는 그래픽스 파이프라인은 렌더링 파이프라인 속에 포함 되어있으며 같다라고도 볼 수 있습니다.

유니티 파이프라인 간략 설명(reto0) 2/3

유니티 파이프라인 간략 설명(reto0) 3/3

 

자세한 설명 

1. 3D 모델 구축 ( 로컬 스페이스 )

- 3D 모델을 만들어서 '로컬 좌표계'에 띄우는 단계를 말한다 (CPU 담당)

그래픽스 파이프라인 3D 모델구축 (로컬 스페이스) 자료

 

2. 가상 공간의 배치 ( 월드 스페이스 )

- 구축한 모델을 월드 좌표계롤 욺겨 하나의 장면을 구성하는 것(CPU 담당)

 

후에 자세한 설명은 포폴 마무리 후 좀 더 알아보겠습니다.

현재 json을 구름 IDE의 클라우드 서버에 쏴줘야하는데 난관에 봉착했다.

로컬 디스크에서 연결하는 방법은 많으나 클라우드로 쏴주는건 찾기가 힘들고 부분 이해가 힘들어서

구름 IDE에 질문을 하였고 운영자분이 친절히 답변해줬다.

"json 파일만 넘겨주는 방식이라면 REST API 서버를 띄우고 curl를 사용해서 전송하는 게 좋을 거 같습니다."

이게 답변 내용이다. 요기서 REST API를 이용하면 된다는 힌트를 얻었고 REST API를 조금 정리하고 가자고 생각한다.

몇개 찾아봤고 자세한건 링크 해놓겠다.

조금 읽어보는것도 괜찮을꺼 같다. 집가는 길에 읽어봤는데 제대로 이해할려면 좀 걸릴꺼같다.

REST API 제대로 알고 사용하기 : NHN Cloud Meetup (toast.com)

 그래서 간단히 이해하고 넘어갈려한다. 아래는 REST API가 하는 일이다.

  • GET: 서버 자원 가져오기
  • POST: 서버에 자원 등록
  • PUT: 서버 자원 치환
  • PATCH: 서버 자원 일부 치환
  • DELETE: 서버 자원 삭제

사용하는데 이렇게만 알고 있어도 될것같다. 보면서 할 예제는 아래 링크에 있다.

노알못 Node.js 정리: 초간단 RESTful API 서버 만들기 - ING-YEO

일단 Express 서버 프로젝트 생성해야한다.

도스창

Express 서버 설치

npm i -g express-generator

 

express 풀더 이름 --view=png

 

cd 프로젝트 풀더 이름 -> npm i

기약없는 연기

+ Recent posts