2010-10-18 70 views
0

我通過IP鏈接發送一個opengl 3D場景到使用SDK 4.1構建的我的iPhone應用程序。我首先使用FBO渲染3D場景,然後用glReadPixels讀取它並將其發送給iphone應用程序。如果我將應用程序接收到的像素數據轉換爲UIImage,我發現它顯示正確。但是當我在使用opengl es 1.1(在iPhone 3G上)的glTexSubImage2D中使用相同的數據時,我什麼都看不到。任何想法可能會出錯?由於不支持glDrawPixels,因此我使用glTexSubImage2D。任何示例/教程來解決這個問題?感謝任何幫助。在opengl 1.1中使用glTexSubImage2D 1.1

在此先感謝。

Code - 

    - (id) initWithFrame: (CGRect) frame 
    { 
    ..... 
    api = kEAGLRenderingAPIOpenGLES1; 
    m_context = [[EAGLContext alloc] initWithAPI:api]; 

    glGenFramebuffersOES(1, &m_frameBuffer); 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer); 
    glGenRenderbuffersOES(1, &m_colorRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); 

    glGenTextures(1, &m_tex); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 
    .... 
    } 

    - (void) drawView: (CADisplayLink*) displayLink 
    { 
    glBindTexture(GL_TEXTURE_2D, m_tex); 
    glTexSubImage2D(GL_TEXTURE_2D, 0,0,0, 
      WIDTH, HEIGHT, 
      GL_BGRA, 
      //GL_RGBA, 
      GL_UNSIGNED_BYTE, 
      m_pixelData); 

const GLfloat quadVertices[] = { 
    -1.0f, -1.0f, 0.0f, 
    -1.0f, 1.0f, 0.0f, 
    1.0f, 1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    -1.0f, -1.0f, 0.0f 
}; 

// Sets up an array of values for the texture coordinates. 
const GLfloat quadTexcoords[] = { 
    0.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 
    1.0f, 0.0f, 
    0.0f, 0.0f 
}; 
glVertexPointer(3, GL_FLOAT, 0, quadVertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, quadTexcoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); 

    [m_context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
    } 
+3

哪裏是你的繪製調用? – Bahbar 2010-10-18 19:21:51

+0

包括樣品繪製代碼 – 2010-10-19 09:26:15

回答

0

爲什麼你用5個頂點組成三角形條?我想你想要的是由2個三角形組成的正方形,因此你的條只需要4個頂點。

而且,在你的情況下,它會更容易只是初始化一個方形紋理和渲染它像這樣(不使用頂點):

/* do the glGenTextures()/glTexImage()/glBindTexture() dance here */ 
int box[] = { nXOffset, nYOffset, nWidth, nHeight }; /* define the part of the texture you're going to render */ 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, box); 
glDrawTexfOES(0.0f, 0.0f, 0.0f, nWidth, nHeight); /* rectangle in the screen coordinates, where to render the previously defined part of the texture */ 
0

如果您使用GL_*_MIPMAP_*GL_TEXTURE_[MIN|MAG]_FILTER(注意defaults!),請確保你真正爲所有紋理映射層級提供的圖像數據。

+0

謝謝。但是如果我刪除mipmap代碼,我會得到相同的結果。我沒有看到任何東西。 – 2010-10-18 18:54:25

+0

也包含樣本繪製代碼。 「看不到任何東西」意味着我看不到3D像素數據。只是空白屏幕的繪圖代碼。 – 2010-10-19 09:27:20

0

請記住,iPhone/ipad平臺上的紋理寬度和高度需要是2的冪。如果不是,你會得到一個空白的屏幕。

+0

僅適用於較舊的設備。 OpenGL ES 2.0設備可以支持任意大小。可以在渲染代碼中添加例外以檢查設備類型,從而推斷出OpenGL ES版本,並相應地進行調整。 – 2010-11-11 16:53:36