小总

来源:互联网 发布:制作社交网络 纪录片 编辑:程序博客网 时间:2024/03/29 13:31

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

原创粉丝点击