gl纹理采样器总是在iOS上返回vec4(0,0,0.1,1。)(但在OSX / Android上运行)

时间:2016-09-21 15:11:27

标签: ios opengl-es-2.0 glteximage2d

我的代码只是将一些人为的数据上传到纹理:

glActiveTexture(GL_TEXTURE0+gl_sim_texture_active_n);
glBindTexture(GL_TEXTURE_2D, gl_sim_texture_buff_id);
for(int i = 0; i < w*h; i++) buff[i] = 0xAB;
glTexImage2D(GL_TEXTURE_2D,0,GL_ALPHA,w,h,0,GL_ALPHA,GL_UNSIGNED_BYTE,buff);

和我的着色器中仅从该纹理中采样的代码:

uniform vec2 viewport;
uniform sampler2D sim_texture;
void main()
{
  vec2 tex_uv = vec2(gl_FragCoord.x/(viewport.x-1.),gl_FragCoord.y/(viewport.y-1.));
  gl_FragColor = texture2D(sim_texture,tex_uv).argb; //swizzle is to just put 'a' in a visibly renderable position as "redness"
}

在OSX和Android上,这个纹理在我的着色器中是可读的(通过sampler2D-没什么花哨的) - 它可以工作。在iOS上,来自该sampler2D的任何样本都会返回vec4(0.,0.,0.,1.),无论放入何种数据。

(请注意,当我将GL_ALPHA更改为GL_RGBA时,请将纹理附加到帧缓冲区,然后在glReadPixels之后调用glTexImage2D 获取我输入的确切数据,无论平台如何,功能(或iOS上的缺乏)都保持不变。切换到GL_RGBA只需要将其附加到帧缓冲区,这对{ {1}},我只关心调试目的。 tl; dr:我有理由确信数据正在所有平台上正确上传到纹理。)

其他信息:

glReadPixels为6,gl_sim_texture_active_n为14(两者均合法且无误)。在返回清除之前或之后调用gl_sim_texture_buff_idglGetError()glCheckFramebufferStatus(GL_FRAMEBUFFER)返回8(与我的测试Android设备相同。

我完全不知道为什么这会在OSX / Android上工作,而不是iOS。任何方向:从这里去哪里都会有所帮助!

1 个答案:

答案 0 :(得分:2)

Gah我找到了它!

GL_REPEAT不支持非POT纹理! (GLSL texture2D() always returns (0, 0, 0, 1))已修复!