在opengl 1.1中使用glTexSubImage2D

时间:2010-10-18 17:27:26

标签: iphone opengl opengl-es opengl-to-opengles

我正在通过IP链接发送一个opengl 3D场景到我使用SDK 4.1构建的iPhone应用程序。我首先使用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];
    }

3 个答案:

答案 0 :(得分:0)

如果您对GL_*_MIPMAP_*使用GL_TEXTURE_[MIN|MAG]_FILTER(请注意defaults!),请确保您实际提供所有mipmap级别的图像数据。

答案 1 :(得分:0)

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

答案 2 :(得分: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 */