我有代码,只是上传一些人为的数据到纹理:
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))修复!