2016-09-21 10 views
5

У меня есть код, который загружает только некоторые надуманные данные в текстуру (0., 0., 0., 1.):Г.Л. текстура сэмплер всегда возвращается vec4 на прошивке (но функционал на 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- ничего фантазии) - это работает. КСН, любые образцы из что sampler2D возвращает vec4(0.,0.,0.,1.), независимо от данных положить в.

(Обратите внимание, что при изменении 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. Любое направление: где идти отсюда будет полезно!

ответ