2012-11-21 2 views
1

프래그먼트 셰이더에 Perlin Noise를 구현하기를 원했습니다. 따라서 조각 쉐이더에 크기 512의 균일 한 int 배열을 전달해야합니다. 이제 이것은 내 오래된 Mac에서 끔찍한 성능 (1FPS)으로 이어집니다. 배열의 크기를 줄이려고 시도했는데 배열에 246 요소의 하드 한도가 있고 여전히 대화식 프레임 속도를 생성합니다. 그래서 내 질문은 다음과 같습니다.uniform int 배열이 246보다 큰 GLSL 성능 문제

  • 이 제한은 어디에서 발생합니까? OSX? 그래픽 카드? OpenGL 버전?
  • 이 문제를 해결할 방법이 있습니까? 정수 텍스처를 사용해 보았지만 OS에서 지원하지 않습니다!

비슷한 경험을 한 사람이 있습니까?

+0

당신은 GPU-gems [1] (http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter26.html), [2] (http : // http. developer.nvidia.com/GPUGems/gpugems_ch05.html) – JAre

답변

1

하드웨어 또는 셰이더 버전 제한이어야합니다. 대신 텍스쳐를 사용할 수 있습니까?

3

따라서 유니폼 int 배열을 조각 쉐이더에 전달해야합니다.

대신 1D 텍스처를 사용할 수 있습니다. 정수가 필요 없어도 Perlin Noise 용 수레가 작동합니다.

+0

정수 텍스처가 지원되지 않을 수 있습니다. – JAre

+0

1D 텍스처의 문제점은 OSX에서 지원되지 않기 때문에 texelFetch를 사용할 수 없다는 것입니다. 따라서 texture1D를 사용하여 값을 얻는 것이 필요합니다. 이는 엉망입니다 (값 보간과 올바른 인덱스 정규화에 신경을 써야 함). – Nicholas

+0

@Nicholas : Perlin Noise는 보간에 관계없이 작동합니다. Perlin Noise의 전체적인 아이디어는 한 옥타브의 값을 다음 옥타브의 오프셋으로 사용하는 것입니다. 값을 보간하고 "인덱스"를 [0; 1] 잘 작동합니다. 다음은 Shader Model 2 GPU의 Perlin Noise 구현에 대한 비디오입니다. 2004 년에 쓴 (어셈블리 쉐이더 언어 사용) http://www.youtube.com/watch?v=ZnxDfVSKPBI - 모든 LUT는 float 유형이며 표준화되었습니다. [0; 1] 범위. ** TL; DR : ** texelFetch가 필요하지 않습니다. texture1D를 보간하는 것으로도 작동합니다. – datenwolf