【问题标题】:Explain how OpenGL ES background images work解释 OpenGL ES 背景图像是如何工作的
【发布时间】:2011-01-27 18:36:23
【问题描述】:

有人可以解释一下您如何在 OpenGL ES 视图上渲染背景图像吗?从设置 OpenGL 环境的基础开始。我是这里的 OpenGL 新手。

我是 seeing few questions/answers on stackoverflow 关于创建背景图像,但我目前正在尝试修改现有代码(尤其是 Apple 的 GLPaint),我不确定需要什么,不需要什么。尝试了解决方案,但没有成功,我想我应该退后一步,真正尝试了解发生了什么。盲目的黑客攻击并没有让我走多远=(

是否有任何简单的应用程序可以显示这一点?或者参考手册也会很有用(最好是新手参考手册)- 我试着查看 this answer 的参考资料,但我不明白 =(

【问题讨论】:

    标签: iphone opengl-es textures


    【解决方案1】:

    您需要将图像(尺寸必须是 2 的幂)渲染到 opengl。

    您可以将图像放置在您的 3d 世界中,使其看起来像背景(我这样做是因为我的相机角度是固定的。)或者您可以在绘制图像之前推送一些矩阵以使用 glOrthof 并弹出之后关闭矩阵。

    这里有一些代码可以帮助您将图像绘制到 opengl

    glPushMatrix();
    
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    
    UIImage *image = [UIImage imageNamed:@"map1.jpg"];
    if (image == nil)
        NSLog(@"Do real error checking here");
    
    GLuint width = CGImageGetWidth(image.CGImage);
    GLuint height = CGImageGetHeight(image.CGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    void *imageData = malloc( height * width * 4 );
    CGContextRef context = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
    CGContextTranslateCTM (context, 0, height);
    CGContextScaleCTM (context, 1.0, -1.0);
    CGColorSpaceRelease( colorSpace );
    CGContextClearRect( context, CGRectMake( 0, 0, width, height ) );
    CGContextTranslateCTM( context, 0, height - height );
    CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image.CGImage );
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
    
    CGContextRelease(context);
    
    free(imageData);
    [image release];
    
    static const GLfloat texCoords[] = {
        0.0, 1.0,
        1.0, 1.0,
        0.0, 0.0,
        1.0, 0.0
    };
    
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);   
    
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    static const GLfloat vertices[] = {
        -1.0,  1.0, -0.0,
        1.0,  1.0, -0.0,
        -1.0, -1.0, -0.0,
        1.0, -1.0, -0.0
    };
    static const GLfloat normals[] = {
        0.0, 0.0, 1.0,
        0.0, 0.0, 1.0,
        0.0, 0.0, 1.0,
        0.0, 0.0, 1.0
    };
    
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glNormalPointer(GL_FLOAT, 0, normals);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
    glPopMatrix();
    

    【讨论】:

    • 请注意,在支持 OpenGL ES 2.0 或支持非二次幂扩展的 iOS 设备上,纹理尺寸不必是 2 的幂:stackoverflow.com/questions/4760174/…
    • 太好了,这听起来像是我需要的,但是当我回到这个项目时必须检查它。
    • 那么上下文是什么?它与我已经拥有的 EAGLContext 有何不同。我可以重复使用我的 EAGLContext 来将图像绘制到上面,还是创建另一个上下文来绘制到我的 EAGLContext 上?
    • 另外,纹理应该是什么类型?
    • 纹理定义为“GLuint纹理[1];”这里的上下文是位图上下文。所有这些代码都发生在您通常在 EAGLView 中执行 opengl 的地方
    【解决方案2】:

    如果您想了解 OpenGL ES 1.1 的基础知识,我建议您从一开始就阅读这篇文章link。还提供了很多样例项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多