2015-02-08 3 views
0

Хорошо, так вот мой текущий рабочий процесс для рендеринга. Я создаю объект framebuffer без привязки к глубине/трафарету и только прикрепление текстуры цвета. Я привязываю фреймбуфер и накладываю на него все свои текстуры. Затем я копирую данные текстуры из текстуры буфера визуализации на другую текстуру (хотя эта часть не очень актуальна, поскольку проблема возникает при визуализации в буфер кадра). Поэтому проблема заключается в том, что после того, как рендеринг пройдет через границы окон, он перестает рисовать. Так вот образ того, что в настоящее время оказывается (жаль, что я должен размещать ссылки, не хватает репутации размещать изображения пока):OpenGL FrameBuffer не рендеринг за кадром

http://i.imgur.com/lj2o7yO.jpg

А вот образ фактических данных текстуры (при условии, gDEBUgger).

enter image description here

Как вы можете видеть, та часть, где он отсекает, где ширина окна. Использование glClear также охватывает только размер окна текстуры и ничего больше. Я пробовал использовать glDisable(GL_SCISSOR_TEST) вместе с glViewport(0, 0, texture_width, texture_height), но он все еще обрезает текстуру. Уменьшение размера окна просмотра в одной и той же точке, делая его более крупным, просто растягивает изображение и отсекает больше текстуры.

Я имею в виду, что имеет смысл, почему вы хотите рисовать пиксели за кадром, когда вы даже не можете их видеть, что было бы ужасно для производительности. В моем случае, однако, мне нужно это сделать. Вот почему я ищу способ отключить его или что-то в этом роде.

Также обратите внимание, что я отключил проверку глубины, поэтому не может быть, чтобы четкость глубины не проходила мимо оконных границ, так как я отключил ее.

У кого-нибудь есть идеи?

Редактировать: На всякий случай кто-нибудь увидит эту тему в будущем, просто хотел сказать, что решило ее для меня. Мне просто нужно было установить видовое окно на размер текстуры И масштабировать матрицу перспективы до того же размера при рендеринге. В моем случае я использовал свой собственный матричный класс. Вот пример:

glViewport(0, 0, texture_width, texture_height); 
perspective_mat.identity(); 
perspective_mat.scale(1.0f/(texture_width/2), -1.0f/(texture_height/2)); 
perspective_mat.translate(-1.0f, 1.0f); 

В случае, если вы используете фиксированные трубопроводную вещи (не шейдеров, т.д.), то вы можете использовать матричные функции OpenGL для масштабирования и перевода. :)

ответ

0

Не видя своего действительного кода, трудно сказать, что происходит не так, но этот код работает.

// ************************************** Save the Current Viewport Size 

GLint screenViewPort[4]; 
glGetIntegerv(GL_VIEWPORT, screenViewPort); 

// ***************************** Define a Second Output Buffer and Bind it for Writing 

glGenFramebuffersEXT(1, wispSecondOutputBuffer); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, wispSecondOutputBuffer[0]); 

// ******************************* Set the Viewport to the Texture Size and Reshape 

glViewport(0,0,TEXTUREWIDTH, TEXTUREHEIGHT); 
[self resizeTextureGL]; 

// ************************************** Create the Output Imgage Texture 

glGenTextures(1, wispOutputTexture); 
glBindTexture(GL_TEXTURE_2D, wispOutputTexture[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)TEXTUREWIDTH, (GLsizei)TEXTUREHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

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_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

// ********************************* Attach the Output Texture to the Frame Buffer 

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, wispOutputTexture[0], 0); 

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; 
glDrawBuffers(1, DrawBuffers); 

// ************************************ Check that the Frame Buffer is Complete 

GLenum frameBufferStatus; 

frameBufferStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 

if(frameBufferStatus != GL_FRAMEBUFFER_COMPLETE_EXT) NSLog(@"There is a problem with the output frame buffer"); 

// ****************************************** Render to the Texture 

[self runTextureShaders]; 
[self runTextureShaders2]; 

// ************************************ Reset the Viewport and Frame Buffer 

glViewport(screenViewPort[0],screenViewPort[1],(GLsizei)screenViewPort[2], (GLsizei)screenViewPort[3]); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

// ******************************* Copy the Texture Data Into the Bitmap Image 

glBindTexture(GL_TEXTURE_2D, wispOutputTexture[0]); 
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapData); 

Звонок resizeTextureGL вычисляет матрицы Model, View и Projection.

Позже в коде у меня есть:

// ******************************************* Cleanup Memory 

glDeleteTextures(1, wispOutputTexture); 
glDeleteFramebuffersEXT(1, wispSecondOutputBuffer); 
+0

Хм, это, кажется, работает в настоящее время по некоторым причинам. Должно быть, я пропустил его, работая как-то после установки окна просмотра, но не совсем точно. Но, в любом случае, спасибо за помощь, я все равно помету как решение. :) – QualityPixels

Смежные вопросы