gpt4 book ai didi

c++ - 如何为 OpenGL ES 重写 2D OpenGL 应用程序?

转载 作者:可可西里 更新时间:2023-11-01 17:35:41 27 4
gpt4 key购买 nike

我正在开发一款带有 Sprite 图形的 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 的机器上进行开发。

最佳答案

在 OpenGL ES 1.1 中使用 glVertexPointer() , glColorPointer() , glTexCoordPointer()glDrawArrays()绘制四边形的函数。与您的 OpenGL 实现相比,您必须描述四边形所包含的结构( vector 、颜色、纹理坐标),而不仅仅是使用内置的 glTexCoord2f , glVertex2fglColor3f方法。

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

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

// 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);

另请注意,如果您不需要着色器,则完全可以使用 OpenGL ES 1。 ES1 和 ES2 的主要区别在于,在 ES2 中,没有固定的管道,因此您需要自己实现矩阵堆栈和着色器来进行基本渲染。如果您对固定管道提供的功能没问题,只需使用 OpenGL ES 1。

关于c++ - 如何为 OpenGL ES 重写 2D OpenGL 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10299918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com