サンプルを眺めた
使い勝手が、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);