我的问题可能很简单,我正在使用OpenGL ES 2.0绘制简单的2D场景。
我有一个背景纹理,它覆盖整个屏幕,还有另一个在特定位置绘制的花朵纹理(或者我应该说是精灵?)。
我有一个背景纹理,它覆盖整个屏幕,还有另一个在特定位置绘制的花朵纹理(或者我应该说是精灵?)。
所以,我想到的最简单方法是两次调用glDrawArrays
,一次用于背景纹理的顶点,另一次用于花朵纹理的顶点。
这是正确的方法吗?如果是,那么对于10朵花,我需要调用glDrawArrays
10次吗?
关于混合怎么办?如果我想要将花与背景混合,我需要同时获得背景和花的像素颜色,这可能会带来问题,对吧?
还是说可以在一个绘制中完成?如果可以,那么我应该如何创建一个着色器,知道当前处理的是背景纹理顶点还是花纹理顶点?
或者说可以在一个绘制中完成吗?
一个绘制的问题在于着色器需要知道当前顶点是背景顶点(然后使用背景纹理颜色)还是花纹理顶点(然后使用花纹理颜色),我不知道该如何做到。
下面是如何使用一次绘制调用来绘制覆盖整个屏幕的背景图像和半大小、居中的花朵。
- (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);
}