Phi*_*ldo 5 glteximage2d ios opengl-es-2.0
我的代码只是将一些人为的数据上传到纹理:
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);
Run Code Online (Sandbox Code Playgroud)
和我的着色器中仅从该纹理中采样的代码:
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"
}
Run Code Online (Sandbox Code Playgroud)
在OSX和Android上,这个纹理在我的着色器中是可读的(通过sampler2D-没什么花哨的) - 它可以工作.在iOS上,vec4(0.,0.,0.,1.)无论放入何种数据,来自该sampler2D的任何样本都会返回.
(请注意,当我更改GL_ALPHA为GL_RGBA,将纹理附加到帧缓冲区,然后glReadPixels在glTexImage2D我确实获取我输入的确切数据后调用,无论平台如何,并且功能(或iOS上的缺乏)保持不变.切换到GL_RGBA只需将它附加到帧缓冲区,这是必要的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.任何方向:从这里去哪里都会有所帮助!