2015-02-08 145 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的调用计算模型,视图和投影矩阵。

代码后来我也有:

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

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

嗯,因某些原因被现在的工作。设置视口后,我一定错过了它的工作,但不完全确定如何。但无论如何,感谢您的帮助,我会标记为无论如何解决。 :) – QualityPixels 2015-02-08 09:57:38