5

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

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,将纹理附加到帧缓冲区,然后glReadPixelsglTexImage2D我取回输入的确切数据后调用无论平台如何,功能(或 iOS 上的功能缺失)保持不变。切换到GL_RGBA只需要将它附加到帧缓冲区,这是必要的glReadPixels,我只关心调试目的。tl;博士:我有理由相信数据正在所有平台上正确上传到纹理。)

其他信息:

gl_sim_texture_active_n为 6 和gl_sim_texture_buff_id14(均合法且无错误地获得)。调用glGetError()glCheckFramebufferStatus(GL_FRAMEBUFFER)之前或之后都返回干净。glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)返回 8(与我的测试 Android 设备上的相同。

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

4

1 回答 1

2

呸,我找到了!

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

于 2016-09-25T19:26:37.850 回答