OpenGL Study (23) 썸네일형 리스트형 OpenGL "Advanced GLSL" [GLSL'S BUILT-IN VARIABLES] 1. Before - Shader는 매우 파이프라인 방식이므로, 지금의 shader 외부의 다른 소스에서 데이터가 필요한 경우 데이터를 전달해야한다 : vertex attribute, uniform, sampler를 통해 이 작업을 하는 법을 배웠다 - GLSL에는 gl_ 접두사가 붙은 몇 가지 추가 내장 변수가 있어, 데이터를 수집하거나 작성할 수 있는 추가 수단을 제공한다 : 지금까지 공부해오면서 vertex shader의 output vector인 gl_Position과 fragment shader의 gl_FrageCoord를 봤었다 - 이번 장에서는 몇 가지의 내장 입출력 변수를 다루고 이것이 주는 이점에 대해 알아볼 것이다 2. Vertex Sh.. OpenGL "Advanced Data" [ADVANCED DATA] 1. Buffer - OpenGL에서의 buffer는 특정 메모리를 관리하는 것 그 이상 그 이하도 아니다 - 특정 buffer target에 바인딩하여 의미를 부여해준다 : GL_ARRAY_BUFFER에 바인딩하면 이 buffer는 vertex array buffer가 된다 (동일한 buffer를 GL_ELEMENT_ARRAY_BUFFER에 바인딩 할 수도 있다) - OpenGL은 내부적으로 target에 대해 buffer를 저장하고 이 buffer들을 따로 처리한다 - 지금까지는 메모리를 할당해주고 그 메모리에 데이터를 삽입해주는 glBufferData 함수를 사용하여 buffer 객체에 의해 관리되는 메모리를 채워왔다 : 만약 이 함수의 data parameter에 NU.. OpenGL "Cubemaps" [CUBEMAPS] 1. Cubemaps - 여러 texture들을 하나의 texture로 매핑한, 기본적으로 cube의 각 면을 형성하는 2D texture들을 포함하고 있는 texture - cubemap을 사용하면 방향 vector를 사용하여 인덱싱/샘플링될 수 있다 - cubemap으로부터 texture를 샘플링하는 것은 좌측의 그림처럼 보인다 : 주황색 vector는 방향 vector로, 이것의 크기는 상관없다 : 방향 vector의 방향만 제공된다면 OpenGL이 방향과 맞닿는 해당 texel을 얻고, 적절히 샘플링된 texture 값을 return 한다 - 이러한 cubemap을 첨부한 큐브 도형을 가지고 있다면 이 cubemap을 샘플링하는 방향 vector는 cube의 보간된 vertex.. OpenGL "FrameBuffers" [FRAMEBUFFERS] 1. Before - framebuffer : color buffer, depth buffer, stencil buffer와 같은 buffer들을 결합한 buffer로, 메모리의 어딘가에 저장된다 - 기본 framebuffer는 window 창을 생성할 때 GLFW에서 자동적으로 생성한다 2. Creating a Framebuffer unsigned int fbo; glGenFramebuffers(1, &fbo); - glGenFramebuffers 함수를 사용하여 framebuffer 객체 FBO를 생성할 수 있다 glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glBindFramebuffer 함수를 사용하여 framebuffer를 바인딩한다 - G.. OpenGL "Face Culling" [FACE CULLING] 1. Before - face culling : 모든 면을 확인하여 viewer의 관점에서 front facing한 면은 렌더링하고 back facing한 면은 폐기하여 fragment shader의 호출을 줄이는 기능 - OpenGL에게 현재 사용 중인 면들이 실제로 앞쪽 면인지 뒤쪽 면인지를 알려주어야한다 : OpenGL은 vertex data의 winding 순서를 분석한다 2. Winding Order - 삼각형 vertex들을 정의할 때 시계 방향 또는 반시계 방향으로 특정 순서를 정의한다 : 각 삼각형은 3개의 vertex를 가지고 있고, 우리는 이 3개의 vertex들을 삼각형의 중앙을 바라보았을 때의 winding 순서로 지정한다 float vertices[] =.. OpenGL "Blending" [BEFORE BLENDING] - OpenGL에서 Blending이란 흔히 투명한 object를 구현하는 기술로 알려져있다 - 투명 : 하나의 컬러를 가지고 있는 것이 아니라 object 자체가 가지고 있는 컬러와 뒤에 있는 다른 object의 컬러를 여러 비율로 혼합하는 것 - 투명한 object들은 완전히 투명하여 모든 컬러들이 통과하거나 불완전하게 투명하여 컬러들이 본연의 컬러 일부를 가지고 통과할 수도 있다 - object의 투명도는 alpha 값으로 정의된다 (color vector의 4번째 요소) : alpha값이 0.0이면 완전 투명, 1.0이면 불투명, 0.5면 object가 본연의 컬러 50% 뒤에 있는 object의 컬러 50%으로 혼합되어 출력된다 - 지금까지 사용한 texture들.. OpenGL "Stencil testing" [STENCIL TESTING] 1. Stencil test - stencil test : fragment가 폐기될 지 안될 지 테스트 하는 것 : fragment shader가 fragment를 처리하고 나면 stencil test이 실행된다 : stencil test 이후 남아있는 fragment는 depth test로 보내져 폐기될 지 안될 지 재차 테스트한다 - stencil test는 지금까지 사용한 buffer와는 다른 stencil buffer를 기반으로 수행된다 : stencil buffer는 렌더링 동안에 수정할 수 있다 2. Stencil Buffer - stencil buffer는 일반적으로 8bit의 stencil value를 가지고 있고, 이 값은 pixel/fragment마다 2.. OpenGL "Depth Testing" [DEPTH TESTING] 1. Before (Depth-test) - depth-buffer : color buffer와 마찬가지로 버퍼의 한 종류로, fragment의 정보를 저장하고 일반적으로 color buffer와 동일한 크기를 가지고 있다 : window system에 의해서 자동적으로 생성되고 depth value들을 float형의 16, 24, 32 bit로 저장한다 (대부분 24bit를 사용한다) - depth testing을 사용할 수 있게 설정하면 OpenGL은 depth buffer의 내용에 따라 fragment의 깊이 값을 테스트한다 : 테스트가 통과되면 해당 depth buffer는 새로운 depth value로 수정된다 : 테스트가 실패하면 해당 fragment는 폐기된다 -.. 이전 1 2 3 다음