gl纹理采样器在iOS上总是返回vec4(0,0,0,1 .)(但在OSX/Android上有效)



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

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时,将纹理附加到framebuffer,然后在glTexImage2D之后调用glReadPixels,我返回我放入的确切数据,无论平台如何,功能(或缺乏iOS)保持不变。)切换到GL_RGBA只需要将其附加到framebuffer,这对于glReadPixels是必要的,我只关心调试目的。tl;dr:我有理由相信数据在所有平台上都被正确地上传到纹理。

其他信息:

gl_sim_texture_active_n = 6, gl_sim_texture_buff_id = 14(均合法且无错误)。调用glGetError()glCheckFramebufferStatus(GL_FRAMEBUFFER)之前或之后都返回干净。glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)返回8(与我的测试Android设备相同)。

我只是完全不明白为什么这将在OSX/Android上工作,而不是iOS。任何方向re:从这里去哪里会有帮助!

我找到了!

GL_REPEAT不支持非POT纹理!(GLSL texture2D()总是返回(0,0,0,1))修复!

相关内容

  • 没有找到相关文章

最新更新