2014-09-16 8 views
0

내가openl-es 3.0을 사용하여 버텍스 쉐이더에서 버퍼 메모리에 어떻게 액세스 할 수 있습니까?

을 (방법을 TexelFetch 사용)는 OpenGL 3.x를 이상 사용하여 버텍스 쉐이더 액세스 사용자 자신의 버퍼 데이터 (텍스처 버퍼 오브젝트를) 들었습니다 그래서 최근 I'v은 OpenglES 3.0 버텍스 쉐이더에 TPB의 기술을 적용하려 IOS7와 함께하지만 난 TBZ bcz OpenGLES 3.0 cant 그것을 사용할 수 없습니다.

내 버텍스 쉐이더는 TBO에 액세스하여 속도, 위치 및 힘과 같은 데이터를 사용해야합니다.

나는 OpenglES 3.0에서 사용 similer의 TBO의 techinc 싶어.

픽셀 버퍼 객체를 사용하는 경우 셰이더에서 "texelFetch()"메서드를 사용하여 액세스 할 수 있습니까?

내 운동을 어떻게 파악할 수 있습니까? 아무도 좋은 방법을 알고 있습니까?

답변

0

Pixel Buffer Object에서 직접 샘플링 할 수 있다고 생각하지 않습니다.

한 가지 분명한 옵션은 텍스처 버퍼 개체 대신 일반 질감을 사용하는 것입니다. ES 3.0 호환 iOS 장치의 최대 텍스처 크기는 4096입니다 (출처 : https://developer.apple.com/library/iOS/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html). 데이터의 크기에 따라 몇 가지 하위 사례가 있습니다. n은 텍셀 수있는 함께 : n 4096 대부분에있다

  • 경우 크기 n x 1을 가진 2D 텍스처에 저장할 수 있습니다.
  • n이 4096보다 큰 경우 크기 4096 x ((n + 4095)/4096)의 2D 텍스처로 저장할 수 있습니다.

두 경우 모두 texelFetch()을 사용하여 텍스처에서 데이터를 가져올 수 있습니다. 첫 번째 경우에는 을 샘플링하여 i 값을 얻습니다. 두 번째 경우는 (i % 4096, i/4096)입니다.

이미 버퍼에 데이터가있는 경우 glTexImage2D()을 호출하기 전에 버퍼를 GL_PIXEL_UNPACK_BUFFER으로 바인딩하여 텍스처를 저장할 수 있습니다. 그런 다음 버퍼에서 데이터를 가져옵니다.

고려해야 할 또 다른 옵션은 Uniform Buffer Objects입니다. 이렇게하면 균일 한 블록에 버퍼 내용을 바인딩 할 수 있습니다. 그런 다음 셰이더의 값에 액세스 할 수 있습니다. 자세한 내용은 glBindBuffer(), glBindBufferBase(), glBindBufferRange()GL_UNIFORM_BUFFER 대상을 찾으십시오. 균일 한 블록의 최대 크기는 GL_MAX_UNIFORM_BLOCK_SIZE이며, iOS/A7 장치의 경우 16,384입니다.