현재 나는 작업중인 게임 엔진을위한 GLSL에서 쉐이더를 만드는 법을 배우고 있으며, 나는 퍼즐과 관련된 언어에 관한 질문을 가지고 있습니다. 3.0 미만의 셰이더 버전에서는 루프 조건에서 균일 변수를 사용할 수 없다는 것을 알게되었습니다. 예를 들어 다음 코드는 3.0 이전의 셰이더 버전에서는 작동하지 않습니다.GLSL break 명령어
for (int i = 0; i < uNumLights; i++)
{
...............
}
그러나 그것은 반복 일정량으로 루프와이를 교체하지만,이 경우, uNumLights보다 크면 루프를 끊을 조건문을 포함 할 수 없다? 예 :
for (int i = 0; i < MAX_LIGHTS; i++)
{
if(i >= uNumLights)
break;
..............
}
해당하지 않습니까? 후자는 이전 버전 GLSL에서 작동해야합니까? 그렇다면 빛의 수에 따라 다른 버전의 쉐이더를 사용하는 것과 같은 내가 읽은 다른 기술보다 구현하기가 더 쉽고 효율적이지 않습니까?
이것이 바보 같은 질문 일 수도 있지만 초보자인데 이것이 작동하지 않아야하는 이유를 찾을 수 없습니다.
현재 쉐이더 모델 2.0 만 지원하는 오래된 비디오 카드에 쉐이더를 쓰고 있습니다. 이상한 점은 두 번째 변형이 실제로 작동한다는 것입니다. 또는 적어도 오류없이 컴파일됩니다. 기능에 관한 한, break 명령이 트리거 될 때 중지되는지 여부는 확실하지 않습니다. 첫 번째 과정은 전혀 컴파일되지 않습니다. –
그러나 @ dm.skt에서 설명한대로 두 번째 변형은 쉐이더 재 컴파일의 높은 위험 때문에 효과적이지 않습니다. 따라서 HAL에서만 지원되는 구문 구조 (하드웨어에서는 아님)에 의존하지 않고 성능 히트를 제공합니다 :-) –