2016-09-21 16 views
5

tôi có mã mà chỉ tải lên một số dữ liệu giả tạo đến một kết cấu (0., 0., 0., 1.):gl kết cấu sampler luôn trở vec4 trên iOS (nhưng là chức năng trên 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); 

và mã mà chỉ mẫu từ kết cấu mà trong shaders tôi:

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" 
} 

Ngày OSX và Android, kết cấu này là có thể đọc được trong shader của tôi (thông qua một không có gì sampler2D- ưa thích) - nó hoạt động. Trên iOS, bất kỳ mẫu từ đó sampler2D trả vec4(0.,0.,0.,1.), bất kể dữ liệu đưa vào.

(Lưu ý rằng khi tôi thay đổi GL_ALPHA để GL_RGBA, đính kèm các kết cấu cho một bộ đệm khung, sau đó gọi glReadPixels sau glTexImage2D tôi làm lấy lại dữ liệu chính xác mà tôi đưa vào, bất kể nền tảng và chức năng (hoặc thiếu trên iOS) vẫn giữ nguyên. Chuyển sang GL_RGBA chỉ cần đính kèm vào bộ đệm khung, cần thiết cho glReadPixels, mà tôi chỉ quan tâm mục đích gỡ lỗi tl; dr: Tôi khá tự tin rằng dữ liệu đang được tải lên kết cấu chính xác trên tất cả các nền tảng.)

thông tin khác:

gl_sim_texture_active_n là 6, và gl_sim_texture_buff_id là 14 (cả hai đều thu được hợp pháp và không có lỗi). Gọi số glGetError() hoặc glCheckFramebufferStatus(GL_FRAMEBUFFER) trước hoặc sau khi cả hai trả lại sạch sẽ. glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS) trả về 8 (giống như trên thiết bị Android thử nghiệm của tôi.

Tôi chỉ mất tổng cộng vì sao điều này sẽ hoạt động trên OSX/Android chứ không phải iOS. hữu ích!

Trả lời

Các vấn đề liên quan