2012-03-03 163 views
1

我正在嘗試創建OpenGL ES 1.1紋理並使用渲染內容進行填充。離屏渲染紋理渲染屏幕上的空矩形

準備質地:

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

GLuint texFrambuffer; 
glGenFramebuffers(1, &texFrambuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
    // this message doesn't appear, thus, framebuffer is complete 
} 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

GLfloat vertices[] = { 
    10.0f, 10.0f, 0.0f, 
    20.0f, 40.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDeleteFramebuffers(1, &texFrambuffer); 

渲染到紋理場景:

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1}; 
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f}; 
glVertexPointer(2, GL_FLOAT, 0, vertices2); 
glTexCoordPointer(2, GL_SHORT, 0, texCoord); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glDisable(GL_TEXTURE_2D); 

完整的源代碼可從到位桶:https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m

還有其他內容正確呈現。問題僅限於此紋理 - 它呈現爲白色矩形。

我已經研究了很多例子,但仍然無法弄清楚我做錯了什麼。什麼不見​​了?


更新1:我注意到,如果我設置glClearColor()並調用glClear()texFrambuffer必然,這些變化將被保存到我的質感。因此,glDrawArrays()和/或相關事情有問題。

我需要爲我的texFrambuffer專門設置矩陣模式和投影嗎?


更新2:我曾嘗試使用也glCopyTexImage2D從「主」幀緩衝區的內容複製到紋理。可用

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.75f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
GLfloat vertices[] = { 
    0.0f, 0.0f, 0.0f, 
    20.0f, 32.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindTexture(GL_TEXTURE_2D, texture); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0); 

完整的源代碼在到位桶:https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m

結果是相同的。只填充矩形。它看起來像我的矩陣肯定存在問題。

+0

你不應該使用glGenFramebuffersOES,glBindFramebufferOES,等等... OES函數,而不是核心?因爲ES 1.1在覈心中沒有Framebuffer對象,所以它們可以作爲擴展使用。 – 2012-03-03 06:45:31

+0

看來蘋果已經合併了API。使用OES和不使用OES的方法沒有區別。 – 2012-03-03 07:47:37

+0

你是什麼意思 - 合併?它甚至可以在Apple文檔中編寫:https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESonthe iPhone/OpenGLESonthe iPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW6( Framebuffer對象是iOS上的唯一呈現目標)在GLES 1.1上,您應該使用OES_framebuffer_object擴展。 – 2012-03-03 08:07:20

回答

0

您的問題與矩陣。默認情況下投影矩陣是標識。因此給出視口的(-1,-1) - (+ 1,+ 1)座標。很可能你需要正投影到(0,0) - (32,32)平方。