OpenGLES2:如何加载和访问大型浮点数组

时间:2016-08-26 19:05:14

标签: opengl-es opengl-es-2.0

我有一个大的WxH浮点数组:

float floatArray[W][H];

我想在片段着色器中访问它,我需要通过纹理加载/访问它,因为它的大小:

vec4 v4 = texture2D(tex, v_texCoord);
//Getting v4.x as floatArray[v_texCoord.x * W][v_texCoord.y * H]

我像这样加载纹理:

int texturenames[1];
glGenTextures(1, texturenames);
glActiveTexture(GL_TEXTURE0 + texturenames[0]);
glBindTexture(GL_TEXTURE_2D, texturenames[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_FLOAT, floatArray);
glUniform1i(glGetUniformLocation(program_, "tex"), texturenames[0]);

我没有得到正确的价值观。请注意glTexImage2D的第三个(内部格式)和第七个(格式)参数是GL_LUMINANCE。

void glTexImage2D(GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid * data);

如何在OpenGLES2中加载和访问大浮点数组?

1 个答案:

答案 0 :(得分:0)

简短回答 - 你不能。 OpenGL ES 2.0不支持浮点纹理。

鉴于您只想要单个通道,您可以使用RGBA unorm纹理对其进行编码,并在着色器中以算法方式恢复该值,但在移动GPU上听起来非常昂贵。

OpenGL ES 3.0支持浮动纹理,因此可以提供更多运气。