6

我相信我的问题很简单,我正在使用 OpenGL ES 2.0 来绘制一个简单的 2D 场景。
我有一个延伸整个屏幕的背景纹理和另一个在屏幕上特定位置绘制的花朵(或我说的雪碧?)纹理。

所以我能想到这样做的微不足道的原因是调用glDrawArrays两次,一次是背景纹理的顶点,另一次是花朵纹理的顶点。

那是正确的方法吗?如果是这样,这是否意味着对于 10 朵花,我需要调用glDrawArrays10 次?

那么混合呢?如果我想将花朵与背景混合,我需要背景和花朵像素颜色,这可能是两次绘制的问题?

或者是否可以一次抽签?如果是这样,我如何创建一个着色器来知道它现在是在处理背景纹理顶点还是花朵纹理顶点?

或者是否可以一次抽签?     

一次绘制的问题是着色器需要知道当前顶点是背景顶点(而不是使用背景纹理颜色)还是花朵顶点(而不是使用花朵纹理颜色),我不知道该怎么做它。  

下面是我如何使用一个绘图调用来绘制背景图像,拉伸整个屏幕,花朵以一半大小居中。

- (void)renderOnce {
    //... set program, clear color..

    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, backgroundTexture);
    glUniform1i(backgroundTextureUniform, 2);

    glActiveTexture(GL_TEXTURE3);
    glBindTexture(GL_TEXTURE_2D, flowerTexture);
    glUniform1i(flowerTextureUniform, 3);

    static const GLfloat allVertices[] = {
        -1.0f, -1.0f, // background texture coordinates
        1.0f, -1.0f,  // to draw in whole screen
        -1.0f,  1.0f, //
        1.0f,  1.0f,

        -0.5f, -0.5f, // flower texture coordinates
        0.5f, -0.5f,  // to draw half screen size
        -0.5f,  0.5f, // and centered
        0.5f,  0.5f,  //
    };

    // both background and flower texture coords use the whole texture
    static const GLfloat backgroundTextureCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f,
    };

    static const GLfloat flowerTextureCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f,
    };

    glVertexAttribPointer(positionAttribute, 2, GL_FLOAT, 0, 0, allVertices);
    glVertexAttribPointer(backgroundTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, backgroundTextureCoordinates);
    glVertexAttribPointer(flowerTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, flowerTextureCoordinates);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
4

1 回答 1

5

你有两个选择:

  1. 为您要绘制的每个纹理调用 glDrawArrays,如果您有超过 10-20 个纹理,这会很慢,为了加快速度,您可以使用硬件 vbo
  2. 将要绘制的所有精灵的顶点(顶点、纹理坐标、颜色)批处理到一个数组中,并使用纹理图集(一种纹理,其中包含您要绘制的所有图片)并用一个 glDrawArrays 绘制所有这些

第二种方法显然是更好和正确的方法。要了解如何做,请查看我的 awnser here

于 2013-09-30T10:54:53.383 回答