gl 纹理采样器总是在 iOS 上返回 vec4(0.,0.,0.,1.)(但在 OSX/Android 上起作用)
gl texture sampler always returning vec4(0.,0.,0.,1.) on iOS (but is functional on 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 returns vec4(0.,0.,0.,1.)
的任何样本,无论输入的数据如何。
(请注意,当我将 GL_ALPHA
更改为 GL_RGBA
时,将纹理附加到帧缓冲区,然后在 glTexImage2D
之后调用 glReadPixels
I do 取回我输入的确切数据,无论平台如何,功能(或 iOS 上缺少的功能)保持不变。切换到 GL_RGBA
只是附加它所必需的到帧缓冲区,这是 glReadPixels
所必需的,我只关心调试目的。tl;dr: 我有理由相信数据正在上传到纹理在所有平台上都正确。)
其他信息:
gl_sim_texture_active_n
为6,gl_sim_texture_buff_id
为14(均合法无误获取)。在 return clean 之前或之后调用 glGetError()
或 glCheckFramebufferStatus(GL_FRAMEBUFFER)
。 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)
returns 8(与我测试的 Android 设备相同。
我完全不知道为什么这会在 OSX/Android 而不是 iOS 上工作。关于从这里去哪里的任何方向都会有所帮助!
啊,我找到了!
GL_REPEAT
不支持非POT材质! (GLSL texture2D() always returns (0, 0, 0, 1)) 已修复!
我的代码只是将一些人为的数据上传到纹理:
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 returns vec4(0.,0.,0.,1.)
的任何样本,无论输入的数据如何。
(请注意,当我将 GL_ALPHA
更改为 GL_RGBA
时,将纹理附加到帧缓冲区,然后在 glTexImage2D
之后调用 glReadPixels
I do 取回我输入的确切数据,无论平台如何,功能(或 iOS 上缺少的功能)保持不变。切换到 GL_RGBA
只是附加它所必需的到帧缓冲区,这是 glReadPixels
所必需的,我只关心调试目的。tl;dr: 我有理由相信数据正在上传到纹理在所有平台上都正确。)
其他信息:
gl_sim_texture_active_n
为6,gl_sim_texture_buff_id
为14(均合法无误获取)。在 return clean 之前或之后调用 glGetError()
或 glCheckFramebufferStatus(GL_FRAMEBUFFER)
。 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)
returns 8(与我测试的 Android 设备相同。
我完全不知道为什么这会在 OSX/Android 而不是 iOS 上工作。关于从这里去哪里的任何方向都会有所帮助!
啊,我找到了!
GL_REPEAT
不支持非POT材质! (GLSL texture2D() always returns (0, 0, 0, 1)) 已修复!