bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

サンプルを眺めた

使い勝手が、OpenGLそのままなので覚えやすいかも。

OpenRLのシェーダーは3つ。

シェーダー 説明
Vertex Shader ジオメトリデータの操作
Ray Shader レイとマテリアルの相互作用、フレーム出力
Frame Shader カメラの実装とフレーム出力

accumulate(color)でフレームバッファに出力

Frame Shaderは必須、Vertex ShaderとRay Shaderは同時に実行される

画像に保存するサンプルの簡単な流れ

コンテキスト作成

OpenRLContext context = OpenRLCreateContext(NULL, errorCatcher, NULL);
OpenRLSetCurrentContext(context);

ピクセルバッファ作成

RLbuffer pixelBuffer;
rlGenBuffers(1, &pixelBuffer);
rlBindBuffer(RL_PIXEL_PACK_BUFFER, pixelBuffer);
rlBufferData(RL_PIXEL_PACK_BUFFER, FRAME_WIDTH*FRAME_HEIGHT*4*sizeof(float), 0, RL_STATIC_DRAW);

フレームバッファテクスチャ作成

RLtexture mainFramebufferTexture;
rlGenTextures(1, &mainFramebufferTexture);
rlBindTexture(RL_TEXTURE_2D, mainFramebufferTexture);
rlTexImage2D(RL_TEXTURE_2D, 0, RL_RGBA, FRAME_WIDTH, FRAME_HEIGHT, 0, RL_RGBA, RL_FLOAT, NULL);

フレームバッファ作成

RLframebuffer mainFramebuffer;
rlGenFramebuffers(1, &mainFramebuffer);
rlBindFramebuffer(RL_FRAMEBUFFER, mainFramebuffer);

フレームバッファフレームバッファテクスチャにストアする設定

rlFramebufferTexture2D(RL_FRAMEBUFFER, RL_COLOR_ATTACHMENT0, RL_TEXTURE_2D, mainFramebufferTexture, 0);

ビューポート設定

rlViewport(0, 0, FRAME_WIDTH, FRAME_HEIGHT);

シェーダー作成

RLshader frameShader;
frameShader = shaderCompileAndCheck(RL_FRAME_SHADER, g_frameShaderSource);

シェーダープログラム作成

RLprogram frameProgram;
frameProgram = rlCreateProgram();

シェーダープログラムにシェーダーを設定

rlAttachShader(frameProgram, frameShader);
programLinkAndCheck(frameProgram);

プリミティブをバインド

rlBindPrimitive(RL_PRIMITIVE, 0);

シェーダーを設定

rlUseProgram(frameProgram);

フレーム描画

rlRenderFrame();

フレームバッファテクスチャをピクセルバッファにストア

rlBindBuffer(RL_PIXEL_PACK_BUFFER, pixelBuffer);
rlBindTexture(RL_TEXTURE_2D, mainFramebufferTexture);
rlGetTexImage(RL_TEXTURE_2D, 0, RL_RGBA, RL_FLOAT, NULL);
rlBindBuffer(RL_PIXEL_PACK_BUFFER, NULL);

ピクセルバッファをTGAで保存

saveBufferAsTGA(pixelBuffer, FRAME_WIDTH, FRAME_HEIGHT, "tutorial.tga");

シェーダープログラムからシェーダーを分離

rlDetachShader(frameProgram, frameShader);

シェーダー破棄

rlDeleteShader(frameShader);

シェーダープログラム破棄

rlDeleteProgram(frameProgram);

フレームバッファ破棄

rlDeleteFramebuffers(1, &mainFramebuffer);

フレームバッファテクスチャ破棄

rlDeleteTextures(1, &mainFramebufferTexture);

ピクセルバッファ破棄

rlDeleteBuffers(1, &pixelBuffer);

コンテキスト破棄

OpenRLDestroyContext(context);