マックっぽいスクリーンセーバーか?


最近、 OpenGL の本は、本屋に行ってもあんまり置いてないよなぁ。
あるとしても端っこの方に置いてあるよなぁ。
人気ないのかな。


マックっぽいスクリーンセーバーを作ろうと思ったら、
結局、独自路線になってしまった。
まあ、でもきれいに表示されるからよしと。
以下に主要なコードを載せます。

void CParticles::CParticles()
{
  ...

  ///// α値がガウシアン分布になっているテクスチャを作る
  m_TexSize = 16;
  m_ImgTex = new float[ m_TexSize * m_TexSize * 4 ];
  for(int h=0; h<m_TexSize; h++)
  {
    float *pT = m_ImgTex + m_TexSize * 4 * h;
    for(int w=0; w<m_TexSize; w++, pT+=4)
    {
      double len = sqrt( (double)((h-m_TexSize/2)*(h-m_TexSize/2) + (w-m_TexSize/2)*(w-m_TexSize/2)) );
      double base = gaussian( 2.0, len );
      pT[0] = 1.0f;
      pT[1] = 1.0f;
      pT[2] = 1.0f;
      pT[3] = (float)(1.0 * base);
    }
  }

  glGenTextures(1, &m_TexName);
  glBindTexture(GL_TEXTURE_2D, m_TexName);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

  /////点に対してテクスチャ座標を作るように設定
  glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_TexSize, m_TexSize, 0, GL_RGBA, GL_FLOAT, m_ImgTex);

  ...
}

void CParticles::Draw()
{
  glDisable(GL_DEPTH_TEST);

  /////どんどん色を足すことで、白とびをわざとさせる
  glEnable(GL_BLEND);
  //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//!<使わない
  glBlendFunc(GL_SRC_ALPHA, GL_ONE);

  glEnable(GL_TEXTURE_2D);
  glEnable(GL_POINT_SPRITE);

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);

  /////ポイントスプライトとテクスチャを使い、曲線に沿って点をたくさん並べる
  glBindTexture(GL_TEXTURE_2D, m_TexName);
  glPointSize(12.0f);

  /////お好きな頂点配列を設定してください
  glVertexPointer( 4, GL_DOUBLE, 0, m_ArrPos );
  glColorPointer( 4, GL_FLOAT, 0, m_ArrColor );
  glDrawArrays( GL_POINTS, 0, m_Count );

  glDisable(GL_BLEND);
}