小总

    技术2022-05-11  32

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


    最新回复(0)