頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


glReadPixelsでシェーダの出力をCPU側で得る

glReadPixelsってのがあるとは聞いていたんだけど、GPU側で画像処理してそれをCPUで使おうって時に初めて使ったよ。

改めてこのglReadPixelsを見ると引数に何を読むかを指すモノがないんだよね。
記述する部分で使っているframe bufferから読むみたいなので特に指定する必要があるならglBindFramebufferで。

こんな感じで書いたらいけた。
{
    unsigned char *data = calloc(width*height*4, sizeof(unsigned char));//メモリ確保
    glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,data);
    for (int ii=0;ii < width;ii++) {
        NSLog(@"%d,%d,%d,%d",data[ii*4],data[ii*4+1],data[ii*4+2],data[ii*4+3]);
    }
    free(data);
}
シェーダはテクスチャに出力してて型はGL_RGBA、だから0から1の範囲。
シェーダで例えば3.0/255.0を出力すると受け取り側はunsigned charなので上のNSLogでは3を出力してくれる(ふと256個あるから256で割るんじゃないの?とも思ったけど255.0/256.0を出力してCPU側で受け取ると254になってしまった)。

念のため、、、上のコードはwidth分だけRGBAに相当するデータをNSLogで書き出してるだけで、メモリ確保した分全てを出力しているわけではないよ。

<< OpenGLで描画する時に平行移動と回転の順を変えたい  TopPage  フラグメントシェーダに値を渡す >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/924-19197879




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad