인프런 커뮤니티 질문&답변

TaengE님의 프로필 이미지

작성한 질문수

OpenGL 쉐이더 (2) shader 3D 그래픽스 - 프로그래머블 파이프라인, 기하학 기초, 삼각형 출력

21-8 layout 키워드

21-8 layout 키워드 : 레지스터 개수 파악

해결된 질문

24.02.16 11:20 작성

·

119

0

안녕하세요

1) layout으로 로케이션 위치의 값이 하드웨어 스펙과 일치해야할 것 같은데요, 하드웨어 스펙의 어떤 부분을 봐야하는지 궁금합니다

2) 로케이션을 지정해야하는 실무 케이스가 궁금합니다..! 어떤 식으로 사용하는지 궁금해서요!

 

감사합니다..!

 

답변 1

1

드립커피+한모금더님의 프로필 이미지

2024. 02. 16. 13:43

안녕하세요.

 

layout 을 적용하는 경우는 보통 attribute register 나 uniform register 인 경우가 많아서,

해당 register 의 갯수를 체크해 봐야 합니다.

최근의 그래픽 카드들은 보통 32개 정도는 기본으로 제공해서, 0 ~ 31 정도를 쓰면 안전한 편이고,

OpenGL 스펙에 따르면, 최소16개는 제공해야 합니다.

또, 필요하다면, 프로그램에서, glGet 함수에서, MAX_VERTEX_ATTRIBS 등으로,

실제 그래픽 카드의 attribute register 갯수를 실행 시간에 체크해서,

문제가 되면, 실행을 중단하거나 할 수 있습니다.

 

 

layout 키워드가 요구된 것은, 여러 명의 쉐이더 프로그래머들이 다양한 쉐이더 프로그램을 작성할 때,

의외로, 변수 명을 통일시키기가 어렵다는 점에서 시작합니다.

혼자 프로그램 짤 때야,

vertex shader 에서는 out vec4 tex; 으로 보내면,

fragment shader 에서는 in vec4 tex 으로 받아서, 이름을 통일 하겠다는 식으로 접근할 수 있는데,

대형 프로젝트로 갔더니, 워낙 다양한 사람들이 참여하고, 일부는 이미 작성한 코드를 그냥 써야 하는데,

매번 변수 이름을 맞추는 것도 한계가 있다 보니까,

아예, "0번 레지스터는 vec4 로 반드시 무슨 정보를 준다." 라는 식으로 통일 시키는 프로젝트 관리 방법론이 나왔고, 여기에 맞추도록 해 준 것입니다.

 

 

그리고.. 또하나..

layout 키워드가 나오게 되는 또하나의 배경은, shader program 의 소스 코드를 비공개로 하려는 시도 때문입니다.

강의 나온 스타일로 OpenGL 쉐이더 프로그램을 짜게 되면,

shader program 의 소스 코드가 파일 형태로 제공되거나, exe 파일 내에 문자열로 들어 있을 겁니다.

상업용 게임 개발자나, 다른 개발자들이 shader 프로그램 자체를 비공개로 하고 싶어하는 요구가 있어서,

컴파일 까지 끝난 binary 파일만 제공하면 되는 형태로 발전했고, (OpenGL version 4.1 이후)

이 경우에는 소스 코드를 전혀 제공하지 않아도 됩니다.

다만, 이렇게 되면, attribute register 몇 번이 어느 variable 하고 결합되었는지를 알아낼 방법이 없습니다.

(컴파일러가 심볼 테이블도 제거해 버릴 수 있기 때문에)

이 경우는 layout 키워드가 있어야, 특정 변수를 몇번 register에 강제 할당하고,

나중에 프로그램에서 몇번 register에 특정 데이터를 강제로 넣어주는 방법이 가능해 집니다.

layout 키워드가 도입된 것이 OpenGL version 4.1 이후로, binary 파일의 사용을 허용한 것과 같은 시기였다는 점에 주목해 보면... 이런 설명도 가능합니다. ~

 

TaengE님의 프로필 이미지
TaengE
질문자

2024. 02. 16. 13:54

안녕하세요..!

배경까지 세세하게 알려주셔서 감사합니다!!

강의 계속해서 잘 듣겠습니다!

 

TaengE님의 프로필 이미지

작성한 질문수

질문하기