当前位置: 首页 > 知识库问答 >
问题:

如何为OpenGL ES重写二维OpenGL应用程序?

董元徽
2023-03-14

我正在工作的OpenGL 2D游戏与雪碧图形。最近有人建议我应该使用OpenGL ES调用,因为它是OpenGL的子集,可以让我更容易地将它移植到移动平台上。大部分代码只是调用draw_image函数,其定义如下:

void draw_img(float x, float y, float w, float h, GLuint tex,float r=1,float g=1, float b=1) {
    glColor3f(r,g,b);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, tex);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f( x, y);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(w+x, y);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f( w+x, h+y);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f( x, h+y);
    glEnd();
}

我需要修改什么才能使这个OpenGL ES兼容?另外,我使用固定函数而不是着色器的原因是我在一台不支持GLSL的机器上开发。

共有1个答案

通俊发
2023-03-14

在OpenGL ES1.1中,使用glvertexpointer()glcolorpointer()gltexcoordpointer()gldrawarrays()函数来绘制一个四边形。与OpenGL实现相反,您必须描述quad所包含的结构(向量、颜色、纹理坐标),而不是仅仅使用内置的gltexcoord2fglvertex2fglcolor3f方法。

下面是一些示例代码,可以做您想做的事情。(我已经使用了您在函数定义中使用的参数名称,因此从示例中移植代码应该很简单。)

首先,您需要为您的四方的一个顶点定义一个结构。这将保存四个顶点的位置,颜色和纹理坐标。

// Define a simple 2D vector
typedef struct Vec2 {
    float x,y;
} Vec2;

// Define a simple 4-byte color
typedef struct Color4B {
    GLbyte r,g,b,a;
};

// Define a suitable quad vertex with a color and tex coords.
typedef struct QuadVertex {
    Vec2 vect;              // 8 bytes
    Color4B color;          // 4 bytes
    Vec2 texCoords;         // 8 bytes
} QuadVertex;
// Define a quad structure
typedef struct Quad {
    QuadVertex tl;
    QuadVertex bl;
    QuadVertex tr;
    QuadVertex br;
} Quad; 

现在,实例化您的四边形并分配四边形顶点信息(位置、颜色、纹理坐标):

Quad quad;
quad.bl.vect = (Vec2){x,y};
quad.br.vect = (Vec2){w+x,y};
quad.tr.vect = (Vec2){w+x,h+y};
quad.tl.vect = (Vec2){x,h+y};
quad.tl.color = quad.tr.color = quad.bl.color = quad.br.color
              = (Color4B){r,g,b,255};
quad.tl.texCoords = (Vec2){0,0};
quad.tr.texCoords = (Vec2){1,0};
quad.br.texCoords = (Vec2){1,1};
quad.bl.texCoords = (Vec2){0,1};

现在告诉OpenGL如何绘制四边形。对gl...pointer的调用为OpenGL提供了顶点结构值的正确偏移量和大小,因此它以后可以使用这些信息来绘制四边形。

// "Explain" the quad structure to OpenGL ES

#define kQuadSize sizeof(quad.bl)    
long offset = (long)&quad;

// vertex
int diff = offsetof(QuadVertex, vect);
glVertexPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));

// color
diff = offsetof(QuadVertex, color);
glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff));

// texCoods
diff = offsetof(QuadVertex, texCoords);
glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));

最后,分配纹理并绘制四方。gldrawarrays告诉OpenGL使用以前定义的偏移量和包含在quad对象中的值来绘制由4顶点定义的形状。

glBindTexture(GL_TEXTURE_2D, tex);

// Draw the quad
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindTexture(GL_TEXTURE_2D, 0);
 类似资料:
  • 我正在尝试将一个OpenGLES代码移植到OpenGL,但我对GlvertexatTribPointer有点困惑。下面是OpenGLES代码的一部分: 那么如何使用OpenGL创建缓冲区呢?因为在OpenGLES中,顶点是直接从glVertexAttribArray函数中的当前数组缓冲区中获取的。我尝试使用glBufferData,但它不起作用。

  • 我想做一个简单的2D地形,只有几个颠簸和高度变化: 我想过只是用随机数来描述某个顶点的高度,但我看不出我怎么能从这个做一个网格。我正在寻找一种方法来找到地形的顶点和索引缓冲区。 我如何做到这一点?

  • 我是Android编程新手。 我想了解如何为特定的Android应用程序维护活动堆栈,以及它如何根据用户导航进行更改。 例如,如果有多个活动,那么当用户单击“后退”按钮或“主页”按钮或启动新活动时,活动堆栈的行为如何? 我试图找到一个合适的职位,我可以得到所有的信息,但我没有得到任何。有人能建议我一些链接/帖子,我可以学习这个吗? 编辑: 到目前为止我遇到的链接/帖子: > onSaveInsta

  • 我需要在android应用程序中生成和扫描二维码。我需要这个功能将一些密码转换为二维码,然后使用二维码扫描仪扫描二维码中的密码,以便我可以验证它。我搜索并了解了zxing,但我不知道如何集成和使用它。如果有人能为如何将二维码扫描仪与android应用程序集成提供指导,我将不胜感激。

  • 我有一个二维数组,想通过java代码写入一个excel文件单元格区域中,并支持导出xlsx文件。 应该如何实现?

  • 本高级教程上接教程 6。我们将把我们的网页投票转换成一个独立的Python包,这样你可以在其它项目中重用或者分享给其它人。 如果你最近没有完成教程1–6,我们建议你阅读它们使得你的示例项目与下面描述的相匹配。 可重用很重要 设计、构建、测试和维护一个网页应用有许多工作要做。许多Python 和 Django 项目都有常见的共同问题。如果我们可以节省一些这些重复的工作会不会很棒? 可重用性是Pyth