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://www.youtube.com/watch?v=XN1Ehh-YwlY

 

SLAM -  33mm초 내로 goduigka
자율주행차/드론 – 어디에 있나, 도로와 인도의 경계(mapping)
로봇비전 – 인천 안내로봇
가상/증강현실
- 가벼운 알고리즘 – 무조건 실시간이어야함
- 알고리즘의 성능
- 알고리즘의 robustness
- 하드웨어
Slam은 왓던 경로 수정 가능
<혼동되는 기술>
SFM - slam보다 느리지만 좋은 성능(싥시간x)
Visual Odometry – VO+loop closure = slam/ slam의 써브셋?, 이전프레임에 비해 지금의 나는 어디에 있나
Path Planning – 최단거리를 구해내는 기술, 사용되는 지도가 slam을 통해 만들어낼 수 있다. (slam != path planning)
Slam은 point cloud 형태, 그 사이의 공간 유무를 알 수 없음.
slam에서의 mapping부분을 좀 더
Photogrammetry – 측량, 측정/3d가 아니어도 할 수 있음/
Image stitching

- Visual slam(monocular slam/stereo, rgb-d slam)
- Visual-inertial slam: IMU 센서
- Lidar slam/GPS: 자율주행, 2d lidar는 실내에서(10~20만원)
- Sensor Fusion/ INS: 카메라 + lidar 등 섞어서 좋은 성능내게 


C++사용하기(최적화에 좋음)
1. The cherno 채널 2. 홍정모의 따라하며 배우는 C++


ROS
한계: 보안 때문에 산업에서는ㅅ ㅏ용불가
필수는아님

OS: Ubuntu/linux

선형대수/베이즈확률론/최소자승법문제+최적화/영어

선형대수 = 공간에 대한 이해(이상엽 MATH)
베이즈 확률론 = (칼만필터) 상태(위치)추정(센서리딩) +  SENSOR FUSION
최소자승법 + 최적화 – 최신 SLAM 이해(UDACITY – ROBOTICS SPECIAL??)

컴퓨터비전지식

Deep slam
- 최신분야
- 2d3d object detection & segmentation
- Image retrieval(loop closure)
- 6dof pose localization & estimation
- Cv representation learning(depth estimation, tracking..)
- Optimization for real-time performance
- - inference optimization
- - hardware optimization
- Simd – 특정 하드웨어 안에 로직으 ㅣ형태를 따라 더 빨리 연산


Cpu 클럭수 높고 쓰레드 많은 피씨
Feature based slam  - only cpu
Direct method  - some cpu, many gpu

모바일 환경
- Ios가 더 최적화가 더 잘되어 있음

웹캠은 추천 x(exposure, iso, shutter speed등이 조절 되면 괜찮)
머신비전카메라 추(lds, Edmund optics, allied vision)

1. Feature based(sparse하게 뽑아냄)
2. Direct based(some cpu, many gpu) – 


아직은 기존의 slam이 deep slam보다 좋음
1) Cpu -> gpu memcpy의 비효율성
2) 딥러닝으 ㄹ이용한 direct pose regression은 interpolated image retrieval정도밖에


Depth는 pitch 에 예민
Deep slam은 아직 연구가 많이 안 됨
딥러닝과 슬램을 둘 다 하는 사람은 많이 x
Deep slam이 취직에..

증강현실은 v-slam의 가장 frontier 산업
자율주행에서는 decision making이 젱리 중요
자율주행은 정확한 localization 필요x, 어느정도의 uncertainty에도 미리 대응 가능하다면 ㄱㅊ
증강현실은 정확한 localization을 필요로 함, update도 빨라야 함, 
Low consumption
Gpu를 쓸 수 없다.  증강현실은 실시간으로 모델을 띄워줘야함. 모델링을 할 때 gpu써야 함.  어플자체를 만들 수 없음.
Collaborative slam

#2
2d image -> algorithm  위치정보
양안) 2d  depth -0-> algorithm  위치
Structured light pattern

Digital image
== 3차원 공간의 정볼,ㄹ 2d로
공간에서 반사되어서 오는 빛을 측정
- 카메라 != 사진찍는도구
- 카메라== 빛을 측정하는 센서/시스템
- 빛  필터  photodiode(빛 신호를 전기로)  전류/전압  ADC(digital signal)
Volt엿던 시그널이 디지털 신호가 됨
어둠 = 0, 밝음 = 255
컬러카메라 – bayer pattern을 통해 컬러 이미지 획득 가능
자연광에서 핑크는 불가
핑크는 빨강과 파랑의 조합, 두 공간상의 차이가 별로 나지 않아 섞어서 보게 됨
Michael brown 요크대학교
Unsigned byte array(uchar array)
카메라마다 뜻하는 rgb값이 다름(raw signal -> color space mapping을 회사마다 다르게 갖고 있음
slam에서는 biological vision을 신경x
 Silicon-based visionㅇ,로
Dead pixel – 작동하지 않는 pixel, fovea -optical nerve가 지나가는 지점(보이지 않음)
이미 silicon based가 더 좋음, 하지만 processor가 딸림

Silicon based 중 어떤걸 써야하는가
- Rgb/mono/multi modal
- 학생) 편광(빛반사가 없는 슬램)/적외선/멀티/하이퍼스펙트럴/이벤트./라이트필드


사실 slam은 흑백에 적합. 하지만 많은 하드웨어가 이미rgb기반인 경우가 많음
rgb단점: interpolated signal  실제 signal과 다름(해상도가 낮아짐), resolution이 작아짐
- Loss of resolution
- Loss of brightness(실제 빛의 양이 담기지 않음. 해당 색만 통과되므로)
- More computation’

흑백 카메라는 모든 픽셀에서 모든 파장의 빛을 받음
- 필터가 덜 들어가니 자연스럽게 더 밝음
- Resolution loss도 없음


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

SLAM 내가 모르는 keyword 정리  (0) 2020.02.21

+ Recent posts