マックっぽいスクリーンセーバーか?
最近、 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); }