그래픽스

    [DX11] 튜토리얼 2 - 삼각형 렌더링

    우선적으로 봐야할게 ID3D11DeviceContext*에 대한 포인터 변수다 / 디바이스 컨텍스트란? 디스플레이 또는 프린터와 같은 디바이스의 그리기 특성에 대한 정보를 포함하는 Windows 데이터 구조다. 모든 그리기 호출은 선, 도형 및 텍스트를 그리기 위해 Windows API를 캡슐화하는 디바이스 컨텍스트 개체를 통해 수행된다. ID3D11DeviceContext* g_pImmediateContext = NULL; 아래는 InitDevice 함수에 해당하는 내 / 렌더 타겟 뷰 개념 참조 // 하나 이상의 렌더링 대상을 원자성으로 바인딩하고 깊이 스텐실 버퍼를 // 출력-병합 단계에 바인딩합니다. g_pImmediateContext->OMSetRenderTargets( 1, &g_pRender..

    DirectX 렌더 대상 뷰 (RTV) 생성

    Direct3D는 자원 자체를 직접 파이프라인의 단계에 묶지 않는다. 대신 반드시 자원에 대한 뷰(서술자)를 생성해서 그 뷰를 파이프라인 단계에 묶어야 한다. 특히 후면 버퍼를 파이프라인의 출력 병합기(Output Merger) 단계에 묶으려면(그래야 Direct3D가 장면을 후면 버퍼에 렌더링 할 수 있다.) 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 한다. 우선 할 일은 교환 사슬에 저장되어 있는 버퍼 자원을 얻는 것인데, 이를 위해 다음과 같은 메서드를 사용한다. HRESULT IDXGISwapChain::GetBuffer( UINT Buffer, REFIID riid, void **ppSurface ); 1. Buffer: 얻고자 하는 특정 후면 버퍼를 식별하는 색인(교환 사슬에 버퍼가 여러 개 ..

    [DX11 물방울책] 챕터 7 - 광원

    7.0 개념 왼쪽 동그라미는 광원이 꺼져있어서 2D처럼 보인다 그에 반해 오른쪽 동그라미는 광원과 그림자가 추가되었기 때문에 3D처럼 인식된다. 이 모델에선 광원이 다양한 색상을 비추기 위해 rgb 색상 중 임의의 밝기로 조절할 수 있다. 빛이 어떠한 물체와 충돌 시 그 빛은 흡수 후 반사 되고 그렇게 소멸된다. 로컬 광원은 밝기의 중점이 물체에 있고, 각기 다른 밝기를 가지고있고 다른 물체와 독립적이다. 글로벌 광원은 각 물체의 밝기를 고려할 뿐만 아니라 전체 씬의 존재하는 오브젝트의 반사되는 빛 또한 고려한다. 상대적으로 비용이 매우 비싸며 이를 보완하기 위해 계속해서 연구 중에 있다. 7.2 단일 벡터 면이라는건 하나의 물체가 바라보고 있는 방향을 뜻한다. 표면이라는건 땅으로부터 바라보고 있는 방향..

    Ambient and Diffuse Lighting / 환경 및 반사되는 광원

    보통은 물체마다 '고유한'색이 있다고 생각한다. 하지만 엄밀히 물체는 광원으로부터 빛을 반사할 뿐이고 그 반사된 빛이 적색계열에 민감한 L형, 녹색계열에 민감한 M형, 청색계열에 민감한 S형 원추세포들의 반응에 따라 색을 구분한다. 그래서 광원의 세기, 색 등에 따라 물체의 색은 달라질수있다. 컴퓨터에서도 원추세포들처럼 R, G, B값들의 조합에 따라 색을 표현한다. 빛을 컴퓨터상에서 표현할때 주로 rasterization과 ray tracing방식을 쓴다. ray tracing방식은 계산비용이 커서 게임과 같은 실시간 렌더링에서는 쓰지 않는다. (하드웨어의 발전으로 요새는 차차 쓰인다고 한다.) 그래서 rasterization방식을 이용하여 빛을 그리고 색을 표현해볼 것이다. 빛의 종류 빛은 크게 3가..

    드로우 콜과 배칭 개념 간단 정리

    1. CPU와 GPU의 상호작용 CPU에서 GPU에 명령하기 일반적으로 CPU에서 렌더링, 상태 변경 등의 명령을 GPU에 전달한다. 그런데 GPU가 바쁘게 작업하는 도중이라면, CPU는 GPU의 작업이 끝나기를 하염없이 기다리게 될 수 있다. 따라서 커맨드 패턴(Command Pattern)과 메시지 큐(Message Queue)에 의한 비동기 방식을 활용한다. CPU에서 GPU에 전달할 명령(Command)을 임시 공간에 담아 두고, GPU가 여유 될 때 명령을 하나씩 꺼내어 처리한다. Command Buffer(커맨드 버퍼) CPU의 각 스레드에서는 GPU에 전달할 렌더링 관련 명령을 모듈화하여 커맨드 버퍼에 차곡차곡 쌓아 임시로 저장한다. 그리고 GPU의 공유 커맨드 큐에 전송한 뒤, GPU를 기..

    [DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스

    6.1 버텍스와 인풋 레이아웃 사용자 정의 버텍스 포멧을 생성하기 위해선 데이터들을 들고있을 구조체를 먼저 생성해야 한다. 다음은 두 개의 다른 버텍스에 대한 구조체이며 하나는 위치와 색상 그리고 하나는 텍스처의 위치,노멀 그리고 피벗 축을 가지고 있다. struct Vertex1 { XMFLOAT3 Pos; XMFLOAT4 Color; }; struct Vertex2 { XMFLOAT3 Pos; XMFLOAT3 Normal; XMFLOAT2 Tex0; XMFLOAT2 Tex1; }; 정의한 후 Direct3D에게 정보를 넘겨줘야 한다 그래야 의도와 맞게 출력을 해주기 때문이다. ID3D11InputLayout 형태로 보내진다, 이러한 형태는 D3D11_INPUT_ELEMENT_DESC 구조체형인 배열이..

    Vulkan 그래픽스 파이프라인

    그래픽스 렌더링 파이프라인(Graphics rendering pipeline)이라 부르는 과정은 3차원으로 만들어진 모델을 2차원에 투영하는 렌더링 과정의 프로세스를 자세하게 표현한 것이다. 컴퓨터에 데이터로 존재하는 3D 리소스가 모니터에 출력되는 과정이 렌더링 파이프라인을 따르게 된다. 위의 과정에 따라 화면에 도형을 표시할 수 있으며, 주황색 박스로 된 과정이 조작 가능한(Programmable) 단계이다. · Input Assembler Vertex Specfication라고도 불리는 Input Assembler 단계는 CPU로부터 렌더링을 수행할 도형의 정점 정보를 정점 버퍼에 담아 전달 받는다. 국내에서는 Input Assembler가 더 익숙한 표현이라 편의상 해당 명칭으로 부르겠다. GPU..

    그래픽스 파이프라인 (게임 엔진 관점)

    3D 그래픽을 사용하는 게임들이 포함하고 있는 모듈들. - 사용자 입력(User Input) - 자원 관리(Resource Management) - 그래픽 로딩과 렌더링(Loading and Rendering Graphics) - 스크립트 해석과 실행(Interpreting and Executing Scripts) - 음향 처리(Playing Sound Effects) - 인공 지능(Artificial Intelligence) 위의 소스 코드 모듈은 집합적으로 게임 엔진(Game Engine)을 구성한다. 게임 엔진의 구성 객체의 표현과 렌더링 렌더링(Rendering)이란 3D 게임 세계의 객체들을 컴퓨터의 화면(2D)으로 그리는 것, 또는 그리는 과정이다. 메시(Mesh)는 게임 공간 또는 게임 세계..

    셰이더란? (Shader)

    렌더링 파이프라인 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 조작할 수 있는 프로그래밍 언어이다. 렌더링 파이프라인은 크게 Fixed Pipeline과 Programmable Pipeline이 존재하는에 이중에 Shader가 반영화된 파이프라인이 Programmable Pipeline이다. 렌더링 파이프라인의 최종 목표는 컴퓨터 데이터를 모니터의 픽셀까지 뽑아내기 위한 것이다. 해당 파이프라인 안에서 데이터를 조작 할 수 있다. Shader는 크게 두 가지가 존재한다. Vertex Shader : 버텍스 파이프 라인에서 동작하는 쉐이더 Pixel Shader : 픽셀 파이프 라인에서 동작하는 쉐이더 셰이더 렌더링 파이프라인을 조종할 수 있는 프로그래밍 언어이다. 버텍스 쉐이더의 ..

    래스터화(Rasterization)

    렌더링 파이프라인의 2단계인 래스터화는 1단계인 정점 처리의 출력을 입력으로 받는다. 정점 처리 단계는 모델링으로부터 얻어진 폴리곤 메쉬의 각 정점들에 여러 변환을 적용하여 클립 공간으로 이동시켰다. 이러한 정점들이 래스터화의 입력으로 들어온다. 래스터화 단계에선 각 정점들을 정점, 선분, 삼각형(폴리곤) 단위로 처리하는데, 보통 삼각형 단위로 처리한다. 그리고 이러한 단위를 프리미티브(primitive)라 한다. 이렇게 조립되는 각 삼각형들은 최종적으로 우리가 보는 2차원 평면에 그려지게 될텐데, 우리가 보는 화면은 픽셀(pixel)로 구성이 된다. 따라서 삼각형들을 픽셀로 채워야 하는데, 해당 단계에선 우선 일종의 예비 픽셀인 프래그먼트(fragment)로 채우게 된다. 프래그먼트를 생성할 땐 각 정..