フレームバッファにint情報を入れる

最終更新日08 Dec 2017 14:23

動機

画面をマウスクリックした地点のオブジェクトのIDを知りたいと思って実装した。

ポイント

glTexImage2Dするときと、glReadPixelするときでフォーマットを合わせておかないとエラーになる

最初はGL_UNSIGNED_BYTEでやろうとしたのですが、
0=0,1以上は全部255と出てしまいました。
GL_R16Iみたいに16Iがついてるのじゃないと整数の値をちゃんと出力できないみたい。

フレームバッファの作成するとき

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, width, height, 0, GL_RED_INTEGER, GL_SHORT, NULL);

取得するとき

glReadPixels(x, height - y, 1, 1, GL_RED_INTEGER, GL_SHORT, &nodeID);

マウスでクリックした地点のオブジェクトのIDを取得する例
void onMouseButton(GLFWwindow *window, int button, int action, int mods){
    if (action == GLFW_PRESS && button == GLFW_MOUSE_BUTTON_LEFT)
    {
        double x, y;
        glfwGetCursorPos(window, &x, &y);
 
        //クリックした地点のnodeIDを取得
        glBindFramebuffer(GL_FRAMEBUFFER, fboID);
        glReadBuffer(GL_COLOR_ATTACHMENT3);
        short nodeID;
        int width, height;
        glfwGetWindowSize(window, &width, &height);
        glReadPixels(x, height - y, 1, 1, GL_RED_INTEGER, GL_SHORT, &nodeID);
        //片付け 0に戻しておく
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        std::cout << "ノードID:" << nodeID<< std::endl;
 
        return;
    }
}


ファイル

サポートサイト Wikidot.com