shader = GPU에서 동작하는 작은 프로그램

 

#GLSL

- 그래픽과 함께 쓰일 수 있도록 만들어짐

- vector/matrix 조작에 유용

 

버전 선언, 입출력 변수, main함수

 

각각의 입력 변수는 vertex attribute라고 함. (vertex attribute를 선언할 수 있는 최대 개수는 정해져 있음)

 

#Types

사용할 변수의 유형을 지정하는 데이터 타입 존재

(기본적인 타입 + 두 가지의 컨테이너 타입(vector, matrices))

#Vectors(n은 갯수를 의미)

vecn: n개의 float 타입 요소를 가지는  vector - 대부분 이걸 사용

bvecn: n개의 boolean타입 요소를 가지는 vector

ivecn: n개의 integer타입 요소를 가지는 vector

uvecn: n개의 unsigned integer요소를 가지는 vector

dvecn: n개의 double 타입 요소를 가지는 vector

 

GLSL 컬러 = rgba 

GLSL 텍스처 좌표 = stpq

 

- swizzling : 벡터 데이터 타입

 

'공부일지 > OpenGL' 카테고리의 다른 글

OpenGL - 2 (triangle)  (0) 2020.03.06
OpenGL -1 (window생성)  (0) 2020.03.05
openGL  (0) 2020.02.19

OpenGL -> 3D 공간에 존재

 

화면/윈도우 창 -> 2차원 픽셀 배열

 

==> 모든 3D 좌표를 화면에 맞게 2D 픽셀로 변환하는 작업이 큰 부분 차지

 

"그래픽 파이프라인(graphics pipeline)" = 3D좌표를 2D 좌표로 변환하는 작업

1. 3D 좌표를 2D  좌표로 변환

2. 2D 좌표를 실제 색이 들어간 픽셀로 변환

 - 2D 좌표 = 2D 공간에 있는 한 점의 위치를 매우 정확하게 나타냄

 - 2D 픽셀 = 화면이나 윈도우 창의 해상도에 의해 제한되는 한 점의 근사치

 

< 그래픽 파이프라인 >

입력 = 3D 좌표 

-> 입력을 화면에 색이 입혀진 2D 픽셀로 변환

 

여러 단계로 나뉘며 각 단계는 그 전 단게의 결과를 입력으로 받게 된다. 모든 단계는 특정한 기능을 갖고 있으며 쉽게 병렬로 실행될 수 있다.

 

 gpu위에 작은 프로그램들을 실행시킴(작은 프로그램 = shaders)

 

shaders는  OpenGL Shading Language(GLSL)로 작성됨

 

vertex data[] -> vertex shader -> shape assembly -> geometry shader -> rasterization -> fragment shader -> tests and blending

 

vertex data -> 정점 데이터(정점들의 집합), 기본적으로 정점은 3D좌표에 대한 데이터의 집합, 이 정점의 데이터는 정점 속성(vertex attributes)을 사용하여 나타낸다,.

 

간단하게, 각 정점은 3D 위치와 컬러 값을 가진다고 가정

 

★vertex shader -> 하나의 정점을 입력으로 받음, 주 목적은 3D좌표를 다른 3D좌표로 변환하는 것, VERTEX 속성에 대한 기본적인 처리를 할 수 있음

 

primitive assembly -> primitive를 구성하고 primitive 도형의 모든 점들을 조립하는 vertex 쉐이더로부터 입력 값으로 모든 정점들을 받음, 결과값은 geometry shader로 전달됨.

 

geometry shader -> 입력값으로 정점들의 집합을 받는다, 이 정점들의 집합은 primitive를 구성하고 새로운 정점을 방출하여 새로운 primitive를 형성 ,  다른 도형으로 변환될 수 있는 정점들

 

rasterization -> 결과 pirmitive를 최종화면의 적절한 픽셀과 mapping. 그 결과로 fragment shader에서 사용할 fragment가 나옴, fragment shader실행 전에 clipping이 수행 됨

 

clipping -> 성능 증가를 위해 사용, 뷰 밖에 있는 모든 fragment 버림

fragment -> 하나의 픽셀을 렌더링하기위해 필요한 모든 데이터

 

fragment shader -> 주 목적은 픽셀의 최종 컬러를 결정, 일반적으로 OpenGL의 모든 고급효과들이 발생하느 단계. fragment shader는 3D scene에 대한 데이터를 갖고 있음(해당 데이터는 최종 칙셀 컬러(광원, 그림자, 빛의 색 등)를 계산하기 위해 사용될 수)

 

alpha test & blending -> fragment의  depth(stencil) value를 체크, 최종 fragment가 다른 obj보다 앞/뒤에 있는지 확인하고 다른 obj보다 뒤에 있는 fragment는 버린다. 이 단계에서 alpha값(obj의 투명도)을 확인하고 그에 맞추어 다른 obj와 blend한다.

 

-> 그래서 fragment shader에서 픽셀 컬러가 계산되었더라도 최종 픽셀 컬러는 여러 개의 삼각형을 렌더링할 때 완전다른 색이 될 수 있음

 

※ vertex shader와 fragment shader는 직접 작성해야함 (gpu에 디폴트가 존재x)


#입력

vertex data -> (x, y, z) 3D 좌표

* 3D 좌표가 모든 3개의 축(x, y, z)에서 값이 모두 -1.0 과 1.0 사이에 있어야 한다.

(normalized device coordinates, 위 범위 밖은 보이지 않음)

 

#vertex buffer objects(VBO)를 통해 메모리 관리

-> VBO - 많은 양의 정점들을 GPU 메모리 상에 저장할 수 잇음. 이러한 버퍼객체를 사용하면 한 번에 정점 데이터를 보내지 않아도 대량의 데이터를 한꺼번에 그래픽 카드로 전송할 수 ㅇ있음, gpu에 메모리가 할당되기만 하면 vertex shader는 빠르게 정점들에 접근할 수 있음

 

 

glGenBuffers = 버퍼 ID생성

glBindBuffer = (버퍼 유형, obj), 버퍼 유형이 다른 여러가지 버퍼를 바인딩

 

바인딩 시점부터 호출하는 모든 버퍼는 현재 바인딩 된 버퍼를 사용하게 됨

glBufferData = (복사하여 넣을 버퍼 유형, 버퍼에 저장할 데이터 크기(바이트 단위), 우리가 보낼 실제 데이터, 그래픽 카드가 주어진 데이터를 관리하는 방법),  미리 정의된 정점 데이터를 버퍼 메모리에 복사, 사용자가 정의한 데이터를 현재 바인딩 된 버퍼에 복사하는 기능

 

#정점 속성 연결(Linking Vertex Attributes)

vertex shader는 모든 입력들을 정점 속성의 형식으로 지정할 수 있도록 해준다. 어떤 정점 속성과 맞는지 직접 지정해야 한다. -> 렌더링 하기 전에 OpenGL이 정점 데이터를 어떻게 해석해야하는지를 우리가 지정해준다는 의미

glVertexAttributePointer = (vertex 속성, 속성의 크기, 데이터의 타입, 데이터를 정규화할 것인지 지정, stride(공백), 버퍼에서 시작하는 위치의 offset)

 

#Vertex Array Object (VAO)

VBO와 같이 바인딩 될 수 잇으며 그 이후의 vertex 속성 호출은 VAO내에 저장된다.

vertex 속성 포인터 구성할 때 오직 한 번만 호출하면되고, obj를 그릴때마다 해당 VAO를 바인당 하면 됨

-> 서로 다른 vertex 데이터와 속성들을 다른 VAO를 바인딩함으로써 손쉽게 교체할 수 있다.

설정한 모든 상태는 VAO 내부에 저장 된다.

 

#Element Buffer Objects(EBO)

VBO와 같은 버퍼

OpenGL이 어떠한 정점들을 그려야 할 지 결정할 수 있는 인덱스들을 저장(index drawing)

고유한 정점들 지정하고 사각형을 그릴 정점들의 인덱스 지정

 

삼각형 두 개를 합쳐 사각형을 만들 때 겹치는 정점 위치는 저장하지 않아도 된다.

 

 

'공부일지 > OpenGL' 카테고리의 다른 글

OpenGL - 3 (Shaders)  (0) 2020.03.07
OpenGL -1 (window생성)  (0) 2020.03.05
openGL  (0) 2020.02.19

glfw 설치 후 

다른 디렉터리에다가 include와 lib폴더 생성

include에는 GLFW폴더가 포함되게 저장하면 되고 lib폴더에는 glfw3.lib을 포함하게 하면 된다.

 

이후 visual studio 속서에서 라이브러리랑 인클루드 경로 지정해주고 링커에다가 glfw3.lib, opengl32.lib 써주면 됨.

 

GLAD파일 저장( C++, API->OpenGL 3.3이상, Core, Generate a loader option 선택) https://glad.dav1d.de/

 

선언 시에 glfw보다 GLAD를 먼저 선언할 것.

 

<기본 골격>

1. glfw 초기화 및 window 설정

2. window생성

3. glad 초기화(glad.c파일 포함시키는 거 잊지 말기)

4. render loop 실행

5. tkdydehls apahfl tkrwp

 

 

glfwInit = 초기화

glfwWindowHint = (설정하고자 하는 옵션, 옵션의 값)

glfwCreateWindow = (너비, 높이, 창 이름, NULL, NULL) / 함수의 리턴 값은 GLFWwindow객체

glfwMakeContextCurrent(위 obj) = 현재 스레드의 주 컨텍스트로 지정

 

glad 초기화

 

glViewport(윈도우 왼쪽 아래 모서리 위치(2), 렌더링 윈도우의 너비, 높이) : glfw 자체에서 가져옴

창 크기 변경 가능(콜백 함수 호출로)

 

glfwWindowShouldClose: 루프 시작될 때마다 glfw가 종료하도록 지시되었는지 확인, 맞다면 true반환, 루프 중지

glfwPollEvents: 이벤트(키 입력, 마우스 이동)가 발생하였는지 확인하고 윈도우 상태 업데이트, 정해진 함수(콜백 함수를 통해 등록할 수 잇ㅇ는) 호출

glfwSwapBuffers: 컬러 버퍼를 교체. 컬러 버퍼는 반복하는 동안 이미지 그리고 화면에 출력하는 기능을 한다.

 

glfwTerminate: 렌더링 루프 종료되자마자 할당되었던 모든 자원 정리/삭제

 

Engine --> 중지하라는 메시지를 받기전까지 계속해서 이미지/사용자입력 처리하도록 하게 함 == render loop

 

 

 

 

'공부일지 > OpenGL' 카테고리의 다른 글

OpenGL - 3 (Shaders)  (0) 2020.03.07
OpenGL - 2 (triangle)  (0) 2020.03.06
openGL  (0) 2020.02.19

https://learnopengl.com/

 

teaching platform for the graphics API = OpenGL

 

An object in OpenGL is a collection of options that represents a subset of OpenGL's state.

 

id로 저장 -> id를 이용, obj를 target location of the context에 bind -> window option 설정, un bind the object by setting the current object id of the window target to 0

 

The options we set are stored in the object referenced by objectId and restored as soon as we bind the object back to GL_WINDOW_TARGET

 

1개의 object보다 많이 정의할 수 있음

 

https://learnopengl.com/Getting-started/Creating-a-window

GLFW 소스코드 다운 -> cmake configure/generate -> build glfw.sln

 

'공부일지 > OpenGL' 카테고리의 다른 글

OpenGL - 3 (Shaders)  (0) 2020.03.07
OpenGL - 2 (triangle)  (0) 2020.03.06
OpenGL -1 (window생성)  (0) 2020.03.05

+ Recent posts