0

我通过 IP 链接向使用 SDK 4.1 构建的 iPhone 应用程序发送 opengl 3D 场景。我首先使用 FBO 渲染 3D 场景,使用 glReadPixels 读取它并将其发送到 iphone 应用程序。如果我将应用程序接收到的像素数据转换为 UIImage,我会看到它正确显示。但是,当我使用 opengl es 1.1(在 iPhone 3G 上)在 glTexSubImage2D 中使用相同的数据时,我什么也看不到。有什么想法可能会出错吗?我正在使用 glTexSubImage2D 因为 glDrawPixels 不受支持。有没有解决这个问题的例子/教程?感谢任何帮助。

提前致谢。

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(注意默认值!),请确保您确实为所有 mipmap 级别提供了图像数据。

于 2010-10-18T18:51:14.663 回答
0

请记住,在 iphone/ipad 平台上,纹理的宽度和高度必须是 2 的幂。如果不是,你会得到一个空白屏幕。

于 2010-11-11T16:29:03.323 回答
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 回答