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();}
