opengl是一个状态机,状态机的意思就是只要打开某种状态(使用glEnable()打开),后面将一直使用这种状态,知道调用glDisable()关闭状态。每种状态都有相应的初始化的过程,比如光照,设置环境光,漫反射光,镜面反射光等,这些工作可以在初始化opengl的时候进行,但直到调用glEnable(GL_LIGHTING),才可以使用关照,也就是说什么时候想用了,如果已经进行了初始化,只需在任何你想用的地方调用glEnable(GL_LIGHTING)即可。
下面是在opengles下的小旗飘飘的效果的实现:
GLfloat m_FlagVertex[100][38][3];
GLfloat m_FlagTexCoord[100][38][2];
void Init()
{
int i,j;
for (j = 0; j < 19; j++)
{
for (i = 0; i < 100; i++)
{
m_FlagVertex[i][j * 2][0] = float(float(j) / 2.0f - 4.5f);
m_FlagVertex[i][j * 2][1] = float((float(i + 1) / 20.0f) - 2.5f);
m_FlagVertex[i][j * 2][2] = float(sin((((j / 3.0f) * 60.0f) / 360.0f) * 3.141592 * 2.0f));
m_FlagTexCoord[i][j * 2][0] = float(float(j) / 18.0f);
m_FlagTexCoord[i][j * 2][1] = float(float(i + 1) / 99.0f);
m_FlagVertex[i][j * 2 + 1][0] = float(float(j) / 2.0f - 4.5f);
m_FlagVertex[i][j * 2 + 1][1] = float((float(i) / 20.0f) - 2.5f);
m_FlagVertex[i][j * 2 + 1][2] = float(sin((((j / 3.0f) * 60.0f) / 360.0f) * 3.141592 * 2.0f));
m_FlagTexCoord[i][j * 2 + 1][0] = float(float(j) / 18.0f);
m_FlagTexCoord[i][j * 2 + 1][1] = float(float(i) / 99.0f);
}
}
}
void DrawFlag()
{
static GLfloat rot = 0.0f;
rot ++;
int i,j;
for (j = 0; j < 18; j ++)
{
for (i = 0; i < 100; i++)
{
hold1 = m_FlagVertex[i][0][2];
hold2 = m_FlagVertex[i][1][2];
m_FlagVertex[i][j * 2][2] = m_FlagVertex[i][(j + 1) * 2][2];
m_FlagVertex[i][j * 2 + 1][2] = m_FlagVertex[i][(j + 1) * 2 + 1][2];
m_FlagVertex[i][36][2] = hold1;
m_FlagVertex[i][37][2] = hold2;
}
}
glPushMatrix();
glLoadIdentity();
glTranslatef(m_Trans[0], m_Trans[1], m_Trans[2]);
glRotatef(rot, 1.0f, 0.0f, 0.0f);
glRotatef(rot, 0.0f, 1.0f, 0.0f);
glRotatef(rot, 0.0f, 0.0f, 1.0f);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Texture);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, m_FlagVertex);
glTexCoordPointer(2, GL_FLOAT, 0, m_FlagTexCoord);
for (GLuint k = 0; k < POINTNUM; k++)
{
glVertexPointer(3, GL_FLOAT, 0, m_FlagVertex[k]);
glTexCoordPointer(2, GL_FLOAT, 0, m_FlagTexCoord[k]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 38);//这个地方应该注意
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}