2017-12-27 12 views
0

균일하지 헌장 우리는 일반적으로 값이 ( 읽기) 자신이 선택한 쉐이더 또는 자원 정의에 왜 GLSL에서/VK를 변경하지 않는 것을 의미하는 C++에 const를를 사용 단어 균일화? 일관성과 쉐이더 정의에 그 아마 균일 한 키워드 단서를 제공 옆에 아마 가능한 하드웨어에 근접 공유로 그 자원을 연결하는 컴파일러에 C/C++VULKAN 쉐이더 및 자원 : 왜 자원

에서 빌린 키워드를 사용 Wodn`t 메모리 또는 레지스터? 확실하지 않습니다.

아마도 VkSpec에서 언급 한 이유 일 것입니다. 우리는 이러한 리소스 유형에 필요한 데이터가 적다는 것을 알고 있습니다. 예를 들어 대한처럼 : 우주 constants..etc의 값

가 누락 난`무엇이든, 또는 사망 역사의 일부 비트인가?

답변

2

C++의 GPU 프로그래밍 및 const의 유니폼은 다른 것에 집중되어 있습니다.

C++ const는 변수가 변경되지 않도록 문서화하며 일부 컴파일러 적용을 사용합니다. 따라서 유형 시스템을 사용하여 명확성을 향상시키고 대규모 프로젝트 소프트웨어 엔지니어링에 중요한 의도 된 용도를 적용하는 방법에 대해 자세히 설명합니다. const_cast 또는 다른 트릭을 사용하여 여전히 주위를 둘러 볼 수 있으며 컴파일러는 사용자가 그렇지 않은 것으로 추측 할 수 없으므로 엄격하게 적용되지 않습니다.

유니폼에 대한 중요한 점은 유니폼이 중요하다는 것입니다. 의미는 그리기 호출 내에서 읽을 때마다 동일한 값을가집니다. 단일 그리기 호출에서이 값을 수백에서 수백만 개까지 읽으므로 캐시 할 수 있으며 셰이더가 실행되기 전에 캐시에 하나만 복사하거나 레지스터 (또는 캐시)에 미리로드 할 수 있습니다 비 응집성 캐시에 캐시 될 수 있으며, 단일 판독 결과가 코어의 모든 SIMD 레인을 통해 브로드 캐스팅 될 수 있다는 점 등이 포함됩니다.이 작업을 수행하려면 내용을 변경할 수 없다는 사실을 엄격히 적용해야합니다 메모리 앨리어싱을 사용하면이 문제도 해결할 수 있지만 결과는 매우 명확하지 않습니다. 그래서 제복은 const와 같은 소프트웨어 엔지니어링 이점에 대해 다른 프로그래머에게 의도를 선언하는 것이 아니라 컴파일러와 드라이버에 대한 의도를 선언하여 개발자가이를 기반으로 최적화 할 수 있도록하는 것입니다.

D3D는 균일하지 않고 "const"와 "constant buffer"를 사용하므로 일부 겹치는 부분이 있습니다. 그게 "프레임마다 상수를 몇 번이나 업데이트합니까?" 그것은 당신이 그것에 대해 생각할 때 일종의 이상한 이야기입니다 :). 값은 셰이더 코드 내에서 일정하지만 API 수준에서는 매우 일정하지 않습니다.

2

단어의 어원이 중요합니다. "유니폼"이라는 용어는 Renderman 표준의 쉐이더 용어에서 영감을 얻은 GLSL에서 파생되었습니다. In Renderman에서 "uniform"은 "표면의 모든 부분이 일정 값을 유지하는 값이 음영 처리 된 값"에 사용되었습니다. 이는 표면을 가로 질러 보간 된 값을 나타내는 "변화"의 대안이었습니다.

는 "상수"값이 결코 변화를 의미하는 것입니다. 균일 한 값은 변경됩니다. 그들은 단순히 다른 값과 같은 빈도로 변경하지 않습니다. 입력 값은 호출 당 변경되고, 균일 값은 그리기 호출마다 변경되며 상수 값은 변경되지 않습니다. GLSL에서 const은 일반적으로 "컴파일 타임 상수"를 의미합니다. 컴파일 타임에 설정되고 변경되지 않는 값입니다.

Vulkan의 균일 변수는 궁극적으로 셰이더 외부에있는 리소스에서옵니다. 버퍼에 의해 공급되는 균일 변수 블록, 푸시 상수 상태에 의해 공급되는 푸시 상수의 유니폼은 모두 사용자가 설정 한 외부 리소스입니다. 이것은 컴파일 타임 상수 구조체와 근본적으로 다른 개념입니다.

상수 구조체와 다르기 때문에 요청할 때 다른 용어가 필요합니다.