2016-11-30 9 views
2

HLSL에서 배열의 길이를 가져 오는 방법에 대한 문서 나 예제를 찾을 수 없습니다.HLSL의 배열 길이?

hlsl 셰이더에 조명 배열을 밀어 넣고 for(int i=0; i<foo.length; i++) (올바른 구문이 아님)을 수행하려고합니다.

배열의 길이를 구할 수 있습니까? C++ 측에서 배열 길이 정수를 hlsl 셰이더에 푸시해야합니까?

또한 쉐이더에서 사용할 수있는 for 루프의 최대 개수는 무엇입니까? (루프가 풀리기 때문에 제한이 있어야합니다.)

답변

2

아는 한 미리 정의 된 길이 (Array syntax needs a positive integer as size)의 배열을 선언해야합니다. extern에서 고정 배열에 임의의 양의 데이터를 채우면 HLSL은이를 알 수 없습니다. 따라서 배열 길이를 셰이더에 전달해야합니다.

쉐이더 모델 3.0 이상에서 작업하고 이전에 [unroll]을 지정하지 않은 경우 루프가 자동으로 풀리지 않습니다. (doc)

어떤 속성이 컴파일러는 첫 번째 루프의 압연 버전을 방출하려고 시도하고, 실패 할 경우 루프가 풀려 경우 일부 작업이 쉬울 경우, 또는 다시 떨어질 지정하지

루프의 풀린 버전.

그래서 거기에는 최대 허용 루프 카운트하지 않습니다,하지만 사용 쉐이더 모델에 따라, 최대 실행 명령 수 (wiki)가 있고 또한 그것보다 더 필요한 경우 그래픽 장치를 재설정 윈도우의 감시가 무한 루프와 같이 렌더링을 위해 2 초 (doc).

+0

네, 그게 합리적입니다. hlsl 배열은 마술처럼 길이 값을 저장하는 구조는 아닙니다. 제 경우에는 언리얼 엔진 C++ 측을 통해 셰이더에 리소스를 보내고있었습니다.이 특정 배열을 셰이더 코드에서 "마법처럼"보이지 않게 사용할 수 있습니다. – Spectraljump