2015-02-04 4 views
2

Я получил следующий код работает прекрасно на прошивке и Android:портирования OpenGL ES Framebuffer в OpenGL

unsigned int depth_texture = 0, 
      framebuffer = 0; 

glGenTextures(1, &depth_texture); 
glBindTexture(GL_TEXTURE_2D, depth_texture); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(GL_TEXTURE_2D, 
       0, 
       GL_DEPTH_COMPONENT, 
       256, 
       256, 
       0, 
       GL_DEPTH_COMPONENT, 
       GL_UNSIGNED_INT, 
       NULL); 

glBindTexture(GL_TEXTURE_2D, 0); 

glGenFramebuffers(1, &framebuffer); 

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

glFramebufferTexture2D(GL_FRAMEBUFFER, 
         GL_DEPTH_ATTACHMENT, 
         GL_TEXTURE_2D, 
         depth_texture, 
         0); 

unsigned int type = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

if(type == GL_FRAMEBUFFER_COMPLETE) 
{ printf("Complete!"); } 
else 
{ printf("Error!"); } 

Сейчас я портирование этого кода OpenGL Desktop (2.1 и выше) и он отказывается работать. Я всегда получаю ошибку GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER. Единственный способ заставить его работать - указать COLOR_ATTACHMENT (который исправит ошибку буфера рисования). Я читал документы GL glrameBuffer, и я не могу понять, почему приведенный выше код не сработает. Все, что я хочу, это сделать ТОЛЬКО глубину в текстуре ... Я что-то упустил?

ответ

2

Если вы не хотите, чтобы сделать каких-либо цветовых буферов, необходимо вызов, который указывает, что:

glDrawBuffer(GL_NONE); 

Это в состоянии видеобуфера, поэтому он должен быть вызван, когда FBO связан.

Если вы пропустите это, вы получите сообщение об ошибке, что вы видите, как указано для условий ошибки при «FrameBuffer Полнота» в OpenGL 3.3 спецификации:

не

Значение FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE не должно быть NONE для любой точки (ов) цветовой привязки, названной DRAW_BUFFERi.

{FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER}

Буфер Жеребьевка по умолчанию для кО является GL_COLOR_ATTACHMENT0, так что это условие ошибки применяется, если у вас нет привязанности к GL_COLOR_ATTACHMENT0, и оставить буфер отрисовки по умолчанию.

Чтобы избежать очень похожее состояние GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER ошибки, вам также потребуется установить буфер чтения в GL_NONE:

glReadBuffer(GL_NONE); 

Эти условия ошибки не перечислены в любой спецификации OpenGL ES, насколько как я мог найти. Поэтому звонок glDrawBuffer() там не нужен.

Остается еще страннее: проверяя все спецификации OpenGL на рабочем столе, начиная с 3.0, где были введены FBOs, условие ошибки указано в спецификациях для 3.1, 3.2, 3.3 и 4.0. Это было не в 3.0, и еще более интересно, ушел в 4.1 и более поздних версиях. Как отметил @derhass в комментарии, это было частью расширения ARB_ES2_compatibility, которое стало ядром OpenGL 4.1.

Запомните это, и вы можете показать себя на следующей вечеринке OpenGL trivia. Если есть такая вещь. :)

+0

немой вопрос - 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE' для цветных вложений не должен быть ничем для полноты. И 'glDrawBuffer (GL_NONE)' не устанавливает его в none? Или же 'glDrawBuffer (GL_NONE)' имеет другое значение – Kiran

+2

Сортировка, но не совсем. В вашем случае 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE' NONE для всех точек привязки цветов, потому что у вас нет цветовых вложений. Но на основе значения по умолчанию для буфера рисования «GL_COLOR_ATTACHMENT0» будет «назван DRAW_BUFFERi». Поэтому соответствующее вложение «не должно быть NONE», но оно есть. Поэтому ошибка! –

+1

Что касается того, почему это исчезло в 4.1: Это происходит через [GL_ARB_ES2_compatibility] (https://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt): «Удалить все ссылки на буферы рисования/чтения, влияющие на полноту», а также добавить «Если GL связан с объектом фреймбуфера, а буфер рисования выбирает вложение, которое не имеет прикрепленного изображения, то этот цвет фрагмента не записывается ни в какое буфер «. – derhass