0

SDK 4.1 を使用して構築された iPhone アプリに、IP リンクを介して opengl 3D シーンを送信しています。最初に FBO を使用して 3D シーンをレンダリングし、glReadPixels で読み取り、iPhone アプリに送信します。アプリが受け取ったピクセルデータをUIImageに変換すると、正しく表示されていることがわかります。しかし、opengl es 1.1 (iPhone 3G) を使用して glTexSubImage2D で同じデータを使用すると、何も表示されません。何がうまくいかないのでしょうか?glDrawPixels がサポートされていないため、glTexSubImage2D を使用しています。この問題を解決するための例/チュートリアルはありますか? どんな助けにも感謝します。

前もって感謝します。

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];
    }
4

3 に答える 3

0

GL_*_MIPMAP_*forを使用している場合GL_TEXTURE_[MIN|MAG]_FILTERデフォルトに注意してください!)、すべてのミップマップレベルの画像データを実際に提供していることを確認してください。

于 2010-10-18T18:51:14.663 に答える
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 */
于 2011-06-23T11:40:16.550 に答える
0

Keep in mind that textures width and height needs to be a power of 2 on iphone/ipad platform. if it isn't you get a blank screen.

于 2010-11-11T16:29:03.323 に答える