如何在着色器(OpenGL 4.0)中访问2个可调整大小的内存的非幂?

时间:2014-05-31 15:28:32

标签: opengl glsl shader

我需要在片段着色器中使用一块内存。我读过GL_TEXTURE_1D,但我读过最大尺寸可能很低。此内存块将在运行时更改其大小,此大小应至少为1MB。 我将在片段着色器中按顺序访问此块:

for (int i=0; i<sizeOfBlock; i++){
     vec4 v=read(block, i);
}

我猜这个着色器会非常慢,即使FBO是256x256,但我希望它能在gtx 550 Ti中以5-10 fps的速度运行,¿它不可能吗?

我应该选择哪个OpenGL对象来使用这个内存?

1 个答案:

答案 0 :(得分:2)

您可能想要查看缓冲区纹理。它们支持的尺寸保证至少为65536像素,这不符合您的要求。但我相信大多数GPU都支持更大的尺寸。可以使用GL_MAX_TEXTURE_BUFFER_SIZE查询支持的大小。

您可以在http://www.opengl.org/wiki/Buffer_Texture找到完整的说明。总结使用缓冲区纹理的最重要步骤:

  • 使用通常的glGenBuffers()glBindBuffer()glBufferData()来电,将您的数据存储在缓冲区中。
  • 使用glGenBuffers()创建纹理ID。
  • 使用glBindTexture(GL_TEXTURE_BUFFER, id)绑定纹理。
  • 使用glTexBuffer()将缓冲区数据与纹理相关联。
  • 在片段着色器中,为纹理声明类型samplerBuffer的统一变量,并使用texelFetch()函数访问数据。