Попытка использовать направленное отображение теней в OpenGL. Необходимо сгенерировать текстуру глубины, которая не является буфером рендеринга (должна быть возможность считывания из него), чтобы она прошла в будущем. Продолжайте получать GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT (как результат glCheckFramebufferStatus) при работе на Android (не получайте ошибку при работе на OSX).
Вот мой код:
//Shadow
//gen tex
gl_shadow_bogus_texture_active_n = 7;
glActiveTexture(GL_TEXTURE0+gl_shadow_bogus_texture_active_n);
glGenTextures(1, &gl_shadow_bogus_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,tex_dim.x,tex_dim.y,0,GL_RGB,GL_UNSIGNED_BYTE,0);
//gen depth
gl_shadow_texture_active_n = 4;
glActiveTexture(GL_TEXTURE0+gl_shadow_texture_active_n);
glGenTextures(1, &gl_shadow_texture_buff_id);
glBindTexture(GL_TEXTURE_2D, gl_shadow_texture_buff_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,1024,1024,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
glGenFramebuffers(1, &gl_shadow_framebuffer_id); //gen fb
glBindFramebuffer(GL_FRAMEBUFFER, gl_shadow_framebuffer_id); //bind fb
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_shadow_bogus_texture_buff_id, 0); //attach tex
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gl_shadow_texture_buff_id, 0); //attach depth
обратите внимание, что вся штука gl_shadow_bogus_texture_buff_id
(генерация и привязка цветовой текстуры) — это всего лишь попытка заполнить фреймбуфер, таким образом избавившись от ошибки. На самом деле меня не волнуют данные о цвете.
еще одно замечание: «color tex gen/bind» не требуется на Mac и может быть заменен на glDrawBuffer(GL_NONE)
и glReadBuffer(GL_NONE)
. Но я не могу скомпилировать с теми, что для Android...
gl_shadow_texture_active_n
? Кроме того, вы проверяете наличие других ошибок OpenGL? - person Nicol Bolas   schedule 01.02.2016gl_blah_texture_active_n
- это средство, с помощью которого я могу отслеживать, к какой glActiveTexture привязана эта текстура. У меня достаточно текстур, и в настоящее время я использую архитектуру типа texture_id-to-active_texture_n один к одному. Значительно упрощает вещи (хотя и делает слой ActiveTexture косвенного обращения излишним...). И да, я проверяю другие ошибки OpenGL. Все они проходят, поэтому я исключил их из примера кода для удобочитаемости. - person Phildo   schedule 01.02.2016uniform sampler2D blah_tex;
моему шейдеру. Я делаю это, передаваяActiveTexture
(GLuint
) вglUniform1i
. Поэтому любая текстура, которую я использую, должна быть связана с ActiveTexture. Там, где в некоторых случаях можно установить активные текстуры непосредственно перед вызовом отрисовки, который их использует, а затем переключить их для следующего вызова отрисовки, для которого нужны diff текстуры, я просто устанавливаю каждую текстуру в активную текстуру один раз и никогда не перемешиваю их. Что-то не так с этим ходом мыслей? - person Phildo   schedule 01.02.2016