裏でこっそりフレームバッファ
2013-11-06


テクスチャとしてカラーバッファを持っていますので、sys::Textureの派生クラスになっています。普通はデプスバッファやステンシルバッファといったレンダーバッファを持っているものなんですが、ここではカラーバッファしか使いません。

作成(make)時には幅と高さを指定しています。今回のように画面全体のフレームバッファとして使う場合はサイズは仮想画面と同じになりますが、描画(されること)のできるテクスチャとして他にも使いようがありますのでサイズは指定できるようになっています。
描画時の座標をサイズに合わせるために、座標変換の行列はフレームバッファで持っておきます。

描画クラス sys::Rendererの変更部分です。
Renderer.cpp
/************************************************
    初期化
                引数      width, height = 端末画面サイズ
 ************************************************/
void    Renderer::init(int width, int height)
{
        initShader();                                                           // シェーダ初期化
        frame_buffer = new FrameBuffer(SCREEN_WIDTH, SCREEN_HEIGHT);            // フレームバッファ作成

        if ( width*SCREEN_HEIGHT < height*SCREEN_WIDTH ) {            // 横長(上下カット)
                screen_rect.w = width;
                screen_rect.h = width*SCREEN_HEIGHT/SCREEN_WIDTH;
        }
        else {                                                                                                  // 縦長(左右カット)
                screen_rect.w = height*SCREEN_WIDTH/SCREEN_HEIGHT;
                screen_rect.h = height;
        }
        screen_rect.x = (width - screen_rect.w)/2;
        screen_rect.y = (height - screen_rect.h)/2;
}

まず初期化部分では、仮想画面サイズでフレームバッファを作成しています。
ビューポートの設定はフレームバッファの切り替えごとに行うので、ここでは値の計算だけしておきます。

/********************
    稼働(前処理)
 ********************/
void    Renderer::update(void)
{
        glEnable(GL_BLEND);                                     // αブレンド初期化
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        frame_buffer-&gtbind();                         // フレームバッファ使用
}

/********************
    描画(後処理)
 ********************/
void    Renderer::draw(void)
{
        static const
        GLfloat _projection[4*4] =
                        {
                                1.0f, 0.0f, 0.0f, 0.0f,
                                0.0f, 1.0f, 0.0f, 0.0f,
                                0.0f, 0.0f, 1.0f, 0.0f,
                                0.0f, 0.0f, 0.0f, 1.0f,
                        };

        static const
        GLfloat _texcoords[] =
                        {
                                0.0f, 0.0f,
                                1.0f, 0.0f,
                                0.0f, 1.0f,
                                1.0f, 1.0f
                        };

        static const
        GLfloat _vertices[] =
                        {
                                -1.0f, -1.0f,
                                 1.0f, -1.0f,
                                -1.0f,  1.0f,
                                 1.0f,  1.0f,
                        };

        static const
        GLubyte _colors[] =
                        {
                                255, 255, 255, 255,
                                255, 255, 255, 255,
                                255, 255, 255, 255,
                                255, 255, 255, 255,
                        };

        ShaderProgram*  _shader = use_shader(SHADER_TEXTURE);

        // フレームバッファテクスチャ描画
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glViewport(screen_rect.x, screen_rect.y, screen_rect.w, screen_rect.h);
        glUniformMatrix4fv(_shader-&gtprojection, 1, GL_FALSE, _projection);
        glBindTexture(GL_TEXTURE_2D, frame_buffer-&gttexture);
        glVertexAttribPointer(_shader-&gttexcoord, 2, GL_FLOAT, GL_FALSE, 0, _texcoords);
        glVertexAttribPointer(_shader-&gtposition, 2, GL_FLOAT, GL_FALSE, 0, _vertices);
        glVertexAttribPointer(_shader-&gtcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, _colors);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

今までは Rendererの処理はメインの処理前にだけ行っていましたが、最後にフレームバッファを画面に描画しなければならないので後にも処理を入れています。


続きを読む
戻る
[Android プログラミング]

コメント(全1件)
コメントをする


記事を書く
powered by ASAHIネット