ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 포인터
  • 프로그래머스
  • 오블완
  • 알고리즘
  • 언리얼
  • 문자열
  • c#
  • 클래스
  • C
  • 함수
  • Unity
  • 파이썬
  • 그래픽스
  • 백준
  • 배열
  • C++
  • 티스토리챌린지
  • 유니티
  • string
  • SQL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

그래픽스/DirectX

[Direct X] Constant Buffer(상수 버퍼) 란?

2023. 7. 14. 12:52

상수 버퍼(Constant buffer)는 정점 및 픽셀 셰이더에서 사용될 상수를 모아 놓은 버퍼이다.

 

상수 버퍼 사용을 위해 cpp 코드 영역에 상수 버퍼 타입의 구조체를 정의하고 셰이더에도 동일한 포맷으로 상수 버퍼 구조체를 정의. 그리고 시스템 메모리에서 구조체 변수 생성 및 값 설정 후 정점 혹은 픽셀 셰이더에 Set 시킨다.

 

값 설정 및 set은 보통 매 프레임 실행되는 Render() 함수에 적용한다. 그러면 이 Set 시킨 데이터를 설정한 셰이더에서 사용할 수 있다.

 

상수 버퍼를 사용하는 이유?

셰이더에서 매번 사용되는 상수, 하지만 cpp 파일에서 전달해주어야 한다고 가정할 때, 개별적으로 하나하나 값을 전달해 주는 것은 대역폭(bandwidth)이 크고 부담이 많이 된다고 한다. 따라서 하나의 구조체로 묶어 보내도록 하기 위해 constant buffer라는 개념을 사용한다고 한다.

 

그렇다고 하나의 상수 버퍼 구조체에 모든 데이터를 몰아 넣는 것이 아니라, 업데이트 주기에 따라 상수 버퍼를 구성하는 것이 좋다고 한다. 예를 들어 절대 변경되지 않는 고정 데이터, 무엇이 변하면 따라서 변하는 데이터, 매 프레임마다 항상 변하는 데이터와 같은 방식으로 나누는 것이 효율적이라 한다.

 

읽어보면 이해가 되는 말이다. 변하지 않는 데이터가 포함된 구조체를 매 프레임마다 업데이트하면 그 변하지 않는 데이터까지 셰이더에 매번 보내야 하기 때문이다. 

 

상수 버퍼는 업데이트 및 전송이 빈번하기 때문에 처리하기에 효율적인 메모리 정렬이 되어 있어야 한다. 따라서 상수 버퍼를 구성하는 구조체는 16바이트 정렬되어 있어야 한다. 따라서 전체 크기는 16의 배수가 되며, 최대 4096 x 16바이트 가질 수 있다.

 

출처 : [Direct X] Constant Buffer(상수 버퍼) 란? (tistory.com)

저작자표시 (새창열림)

'그래픽스 > DirectX' 카테고리의 다른 글

DirectX 12 멀티 스레드 렌더링 (Multi-Thread Rendering)  (0) 2023.08.13
[DX11] 튜토리얼 4 - 3D 공간  (0) 2023.07.14
DirectX와 HLSL간의 행렬 순서와 연산  (0) 2023.07.14
[DX11] 튜토리얼 2 - 삼각형 렌더링  (0) 2023.07.12
DirectX 렌더 대상 뷰 (RTV) 생성  (0) 2023.07.12
    '그래픽스/DirectX' 카테고리의 다른 글
    • DirectX 12 멀티 스레드 렌더링 (Multi-Thread Rendering)
    • [DX11] 튜토리얼 4 - 3D 공간
    • DirectX와 HLSL간의 행렬 순서와 연산
    • [DX11] 튜토리얼 2 - 삼각형 렌더링
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바