목록OpenGL (29)
게임공장
Geometry Shader 고급 OpenGL/Geometry Shader Vertex shader와 fragment shader 사이에 geometry shader라고 불리는 선택적인 shader 단계가 존재합니다. Geometry shader는 입력으로 예를 들어 점이나 삼각형같은 하나의 기본 도형을 이루는 vertex들의 모음을 받습니다. 이 geometry shader는 이 vertex들을 다음 shader 단계에 이들을 보내기 전에 적절한 형태로 변환시킬 수 있습니다. 하지만 geometry shader가 만드는 흥미로운 점은 vertex들을 원래 주어진 vertex들보다 더 많은 vertex들을 생성하는 완전히 다른 기본 타입 도형으로 변환시킬 수 있다는 점입니다. Geometry shader..
고급 GLSL 고급 OpenGL/고급 GLSL 이번 강좌는 여러분의 scene에 대한 시각적 효과를 증대시킬 아주 멋진 기능을 소개하지는 않을 것입니다. 이 강좌는 GLSL의 흥미로운 부분을 소개할 것이고 앞으로 도움이 될만한 멋진 트릭들도 소개할 것입니다. 기본적으로 OpenGL 응용 프로그램을 만들 때 알면 좋은 기능과 여러분의 삶을 쉽게 만들어 줄 기능들입니다. 우리는 흥미로운 내장 변수들과 shader의 입력과 출력을 구성하는 새로운 방법, uniform buffer objects라고 불리는 아주 유용한 도구를 다룰 것입니다. GLSL의 내장 변수 Shader는 혀재 shader 밖의 다른 소스의 데이터가 필요한 경우 데이터를 전달해야 합니다. 우리는 이를 vertex attributes, uni..
고급 Data 고급 OpenGL/고급 Data 우리는 OpenGL에서 데이터를 저장하기 위해 광범위하게 buffer들을 사용해왔습니다. buffer들을 다루는 좀 더 흥미로운 방법과 texture들을 통해 shader에 많은 양의 data를 전달하는 흥미로운 방법이 존재합니다. 이 강좌에서 좀 더 흥미로운 buffer 함수들과 많은 양의 데이터를 저장하기 위해 텍스처 객체를 사용하는 방법을 다룰 것입니다. OpenGL에서의 buffer는 특정 메모리를 관리하는 것 그 이상 이하도 아닙니다. 특정 buffer target에 바인딩하여 의미를 부여해줍니다. GL_ARRAY_BUFFER에 바인딩하면 이 buffer는 vertex array buffer인 것입니다. 하지만 이 동일한 버퍼를 GL_ELEMENT_..
Cubemaps 고급 OpenGL/Cubemaps 지금까지 우리는 2D 텍스처들을 사용해왔었습니다. 하지만 우리가 아직 다루어보지 못한 많은 텍스처 유형이 존재합니다. 이번 강좌에서 다룰 텍스처 유형은 여러 텍스처들을 하나의 텍스처로 매핑한 텍스처입니다. 이를 cubemaps라고 부릅니다. Cubemap은 기본적으로 큐브의 각 면을 형성하는 2D 텍스처들을 포함하고 있는 텍스처입니다. 이러한 큐브의 중점이 무엇인지 궁금할 것입니다. 그냥 6개의 텍스처를 사용하면 되지 왜 6개의 텍스처를 하나의 텍스처로 만들어 사용하는 것일까요? Cubemap은 유용한 특성을 가지고 있습니다. 방향 벡터를 사용하여 인덱싱/샘플링될 수 있는 점입니다. 중앙에 위치해 있는 방향벡터의 원점과 1x1x1의 단위 큐브를 가지고 있..
Framebuffers 고급 OpenGL/Framebuffers 지금까지 우리는 여러가지 유형의 스크린 버퍼들을 사용해왔습니다. 컬러 값들을 작성하는 color buffer, 깊이 정보를 작성하기 위한 depth buffer, 마지막으로 특정한 조건에 의해 해당 fragment들을 폐기하는 stencil buffer가 있었습니다. 이러한 버퍼들을 결합한 것을 framebuffer라고 부르고 이는 메모리의 어딘가에 저장됩니다. OpenGL은 우리만의 framebuffer들을 자유롭게 정의할 수 있도록 해주고 따라서 우리는 우리가 직접 컬러를 정의할 수 있고 추가적으로 depth, stencil buffer도 정의할 수 있습니다. 지금까지 우리가 수행했던 렌더링 작업들은 모두 기본 framebuffer에 있..
Face culling 고급 OpenGL/Face-culling 마음속으로 3D 큐브를 상상해보고 어느 방향에서나 볼 수 있는 최대 면들의 갯수를 세보세요. 여러분은 아마도 최댓값은 3이라고 생각할 수 있을것입니다. 여러분은 어떠한 위치나 방향에서든 큐브를 볼 수 있습니다. 하지만 여러분은 3개보다 많은 면들을 절대 볼 수 없습니다. 그러면 왜 우리는 우리가 볼 수 없는 다른 3개의 면을 그리기 위해 노력을 낭비하는 것일까요? 이들을 어떠한 방법으로 폐기한다면 fragment shader의 노력을 50%이상 줄일 수 있습니다! 50%가 아니라 50% 이상이라고 했습니다. 특정 각도에서는 오직 2개나 1개의 면만 볼 수 있기 때문입니다. 이 경우에는 50% 이상 절약할 수 있습니다. 이는 훌륭한 생각입니다..
Blending 고급 OpenGL/Blending OpenGL에서 Blending이란 흔히 투명한 오브젝트를 구현하는 기술로 알려져있습니다. 투명은 하나의 단색 컬러 가지고 있는 것이 아니라 오브젝트 자체가 가지고 있는 컬러와 뒤에 있는 다른 오브젝트의 컬러를 여러 비율로 혼합하는 것을 말합니다. 색이 있는 유리창은 투명한 오브젝트입니다. 이 유리는 자기 본연의 컬러를 가지고 있지만 최종 컬러는 유리 뒤에 있는 모든 오브젝트들의 컬러도 포함하고 있습니다. 우리는 여러 오브젝트들의 여러가지 컬러들을 하나의 컬러로 blend(섞다)하기 때문에 이를 blending이라고 부릅니다. 따라서 투명도는 다음과 같은 결과를 보여줍니다. 투명한 오브젝트들은 완전히 투명(모든 컬러들이 통과)하거나 불완전하게 투명(컬러들..
Stencil testing 고급 OpenGL/Stencil-testing Fragment shader가 fragment를 처리하고 나면 depth test와 비슷한 stencil test라고 불리는 것이 수행됩니다. fragment가 폐기될지 안될지 테스트하는 것입니다. 그런 후 남아있는 fragment는 dpeth test로 보내져 폐기될지 안될지를 또 한번 테스트됩니다. 이 stencil test는 지금까지의 buffer와는 다른 stencil buffer라고 불리는 buffer를 기반으로 수행됩니다. 이 buffer는 흥미로운 효과를 내기위해 렌더링 동안에 수정할 수 있습니다. Stencil buffer는 (일반적으로) 8 비트의 stencil value를 가지고 있고 이 값은 pixel/frag..
Depth testing 고급 OpenGL/Depth-testing 좌표 시스템 강좌에서 3D 컨테이너를 렌더링해보았고 depth buffer를 사용하여 뒤에있는 면들이 앞에 그려지지 않도록 하였습니다. 이번 강좌에서는 depth values에 대해서 좀 더 자세히 다루어 depth buffer를 더욱 강력하게 만들것이고 실제로 특정 fragment가 다른 fragment들의 뒤에 있는지 판별하는 방법에 대해서 다룰 것입니다. depth-buffer는 color buffer(모든 fragment의 최종 출력 컬러를 저장하는 버퍼)와 마찬가지로 버퍼의 한 종류이며 fragment의 정보를 저장하고 (일반적으로) color buffer와 동일한 크기를 가지고 있습니다. depth buffer는 윈도우 시스템..
Model 모델 불러오기/Model 이제 Assimp로 노가다를 할 시간입니다. 그리고 실제 로딩, 변환 코드를 생성할 것입니다. 이 강좌의 목표는 전체적인 모델(여러 mesh들을 가지고 있는)을 나타내는 또 다른 클래스를 생성하는 것입니다. 나무로 된 발코니, 타워, 수영장을 가지고 있는 집은 여전히 하나의 모델로 로드될 수 있습니다. 우리는 Assimp를 통해 모델을 로드하고 이 것을 이전 강좌에서 생성한 여러 Mesh 객체들로 변환할 것입니다. 더이상 고민하지 않고 여러분에게 Model 클래스의 구조를 보여드리도록 하겠습니다. class Model { public: /* 함수 */ Model(char *path) { loadModel(path); } void Draw(Shader shader); p..