2010年02月02日

画像ファイルから生データ(RGBA値)を取得するiPhoneプログラム - (iPhone SDK, OpenGL)

blog_2_1

プラットフォーム:iPhone
ライブラリ:OpenGL ES, iPhone SDK

PNGファイルなどの画像ファイルを読み込んで、生のRGBAデータを取得するプログラムです。このプログラムをビルドするには、CoreGraphicsフレームワークが必要です。

まずは、画像ファイルを読み込むプログラムです。これは、非常に簡単で、関数を呼ぶだけです。filenameに画像ファイル名を指定します。
CGImageRef img = [UIImage imageNamed:filename].CGImage;

これで、画像が読み込めましたが、生データではありません(ポインタでRGBAを参照できない)。読み込んだ画像から生データを取り出します。
size_t w = CGImageGetWidth(img);
size_t h = CGImageGetHeight(img);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(img);

GLubyte* pixels = (GLubyte*)malloc(w * h * 4);
CGContextRef context = CGBitmapContextCreate(pixels, w, h, 8, w * 4, colorSpace, kCGImageAlphaPremultipliedLast);

CGContextDrawImage(context, CGRectMake(0, 0, (CGFloat)w, (CGFloat)h), img);

CGContextRelease(context);


CGBitmapContextCreate関数で、contextとpixelsを関連づけています。つまり、contextに対して描画すると、pixelsが書き換えられるというわけです。そこで、CGContextDrawImage関数で、読み込んだ画像imgをcontext(つまり、pixels)に描画しています。生データ(pixels)が手に入ればcontextはいらないので、CGContextRelease関数で破棄します。

以上です。

いろいろな関数を使ったので、後でリファレンス記事を書こうかな。

2010年01月31日

OpenGLリファレンス [glVertexPointer関数, glColorPointer関数] - (OpenGL)

ライブラリ:OpenGL

iPhone SDKのOpenGLで長方形を描画」では、長方形を描画するコードを紹介しました。内容をより理解するために、関数の説明をします。ポイントはポリゴンの頂点の座標と色を設定する処理です。

頂点を設定して、有効にするには、glVertexPointerとglEnableClientStateを呼び出します。

glVertexPointer(
    GLint size,
    GLenum type,
    GLsizei stride,
    const GLvoid *pointer
)

sizeは座標軸の数で、2次元の場合は2です。
typeは配列の型で、GL_で始まる値です。GL_SHORT、GL_INT、GL_FLOAT、GL_DOUBLEがあります。
strideは配列のオフセットです。配列に隙間が無いときは0です。
pointerは配列のポインタです。

glEnableClientState(
    GLenum array
)

arrayは有効にする状態を表す値です。
ポリゴンの頂点の場合は、GL_VERTEX_ARRAY。頂点の色の場合は、GL_COLOR_ARRAYを指定します。

頂点の色を設定して、有効にするには、glColorPointerとglEnableClientStateを用います。

glColorPointer(
    GLint size,
    GLenum type,
    GLsizei stride,
    const GLvoid * pointer
)

sizeは、色の構成要素の数です。4を指定します。
typeは配列の型です。GL_で始まる値です。
strideは配列のオフセットです。
pointerは配列のポインタです。

最後に、設定した頂点と色を描画する関数を呼びます。
glDrawArrays関数です。

glDrawArrays(
    GLenum mode,
    GLint first,
    GLsizei count
)

modeは、ポリゴンの種類です。GL_TRIANGLE_STRIP、GL_TRIANGLES、GL_LINESなどの値を指定します。
firstは指定した配列のオフセットです。
countは頂点の数です。

2010年01月30日

iPhone SDKのOpenGLで長方形を描画 - (iPhone SDK, OpenGL)

blog_2_1

プラットフォーム:iPhone(Simulator)
言語:Objective-C, C/C++
ライブラリ:OpenGL, iPhone SDK

iPhoneSDKのOpenGLの勉強をしています。
まずは、基本からということで、長方形を描画する関数drawRectを作成しました。
以下は関数のソースコードです。
void drawRect(
    const float x,  //x座標
    const float y,  //y座標
    const float w,  //幅
    const float h,  //高さ
    const unsigned char r,  //RGBのRed
    const unsigned char g,  //RGBのGreen
    const unsigned char b  //RGBのBlue
)
{
    const GLfloat vertex[] = {
        x, -h + y,
        w + x, -h + y,
        x, y,
        w + x, y
    };

    const GLubyte color[] = {
        r, g, b, 255,
        r, g, b, 255,
        r, g, b, 255,
        r, g, b, 255
    };

    glVertexPointer(2, GL_FLOAT, 0, vertex);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

関数のテストをしてみます。
Xcodeを起動して「OpenGL ES Application」プロジェクトを新規作成します。
そして、EAGLView.mファイルのdrawView関数を編集します。
コードは以下のようになります。
- (void)drawView {
    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    drawRect(-0.5f, 0.5f, 1.0f, 1.0f, 255, 0, 0);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

ビルド→実行の結果は以下のようになります。
drawRect


2010年01月22日

vc2008でOpenGLを使えるようにする-(Windows, OpenGL, VC2008)

CA3A0024


OS:windows xp
ライブラリ:OpenGL
開発環境:VisualC++2008
言語:C/C++

VC2008でOpenGL(GLUT)が使えるようにセッティングしました。
GLUTのダウンロードはこちらです。
以下、セッティングの手順です。

1.ダウンロードしたglut-3.7.6-bin.zipというファイルを解凍(C:/Program Filesの中にコピー)。
2.glut-3.7.6-binの中のファイル(glut32.lib, glut.h, glut32.dll)を以下のディレクトリにコピー。
    ・glut32.lib->C:/Program Files/Microsoft Visual Studio 9.0/VC/lib
    ・glut.h->C:/Program Files/Microsoft Visual Studio 9.0/VC/include/glut
※glutというディレクトリを新規作成した。
    ・glut32.dll->C:/WINDOWS/system32

以上でセッティングは終了。

使用するときは、
#include <glut/glut.h>
とすればOK。