2

OpenGL Bookの例に従い、.3dsファイルを表示するように拡張しました。また、OpenCVを使用して、Webカメラから画像を取得し、それにサーフオペレーターを適用して、特定のマーカーのホモグラフィを見つけることができました。見つかった変換は、3Dモデルに適用されます。ただし、プログラムでWebカメラの画像をテクスチャ背景として使用することはできません。このためのいくつかの例に従って、テクスチャを作成することは機能しているように見えますが、OpenGLブックの章で定義されているシェーダーを壊しているように見えるため、表示できません。glUseProgram事前定義されたシェーダープログラムを使用しようとすると、すぐにエラー1282が返されます。

シェーダーコードは、指定されたOpenGLブックのリンクにあります。テクスチャを作成するための私のコードは次のとおりです。

void setze_hintergrund()
{
    if(gp_DataArray->zugriff_bild == false){
/*gp_DataArray is provided to both threads (opencv & opengl) to exchange data like the webcam picture*/

        return;
    } else {

        // alte Textur löschen
        glDeleteTextures(1, &backgroundid);

        // lade das Bild als Textur
        glGenTextures(1, &backgroundid);
        glBindTexture(GL_TEXTURE_2D, backgroundid);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
            gp_DataArray->kamerabild->width, gp_DataArray->kamerabild->height,
            0, GL_BGR, GL_UNSIGNED_BYTE, gp_DataArray->kamerabild->imageData);
    }

    return;
}

void zeichne_hintergrund()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glDisable(GL_DEPTH_TEST);
    glDepthMask(GL_FALSE);

    glOrtho(-1, 1, -1, 1, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();   

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, backgroundid);

    glBegin (GL_QUADS);
        glNormal3f(0,0,1);
        glTexCoord2f(1.0, 1.0); glVertex3f(1, -1, -1); // Texturkoordinate rechts oben, Punkt rechts oben hinten setzen
        glTexCoord2f(0.0, 1.0); glVertex3f(-1, -1, -1); // Texturkoordinate links oben, Punkt links oben hinten setzen
        glTexCoord2f(0.0, 0.0); glVertex3f(-1, 1, -1); // Texturkoordinate links unten, Punkt links unten hinten setzen
        glTexCoord2f(1.0, 0.0); glVertex3f(1, 1, -1); // Texturkoordinate rechts unten, Punkt rechts unten hinten setzen
    glEnd ();

    glDisable(GL_TEXTURE_2D);

    glMatrixMode(GL_PROJECTION);
    //glLoadMatrixf(ProjectionMatrix);
    //ProjectionMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ProjectionMatrix");
    glUniformMatrix4fv(ProjectionMatrixUniformLocation, 1, GL_FALSE, ProjectionMatrix.m);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

    return;
}
4

1 に答える 1

0

すでに述べたように、非推奨の関数は使用しないでください。非推奨のコードのほとんどはzeichne_hintergrund()にあります。さらにレンダリングするための背景としてWebカメラ画像を使用する場合は、FBO(フレームバッファーオブジェクト)を使用する必要があります。FBOを使用すると、Webカメラの画像をバッファーにロードしてから、同じバッファーを使用してレンダリングすることができます。次に、このバッファをテクスチャにロードして、zeichne_hintergrund()関数で試したのと同じように画面に表示できます。

かつて使用したテクスチャをレンダリングするための頂点シェーダーとフラグメントシェーダーは、次のようになります。

バーテックスシェーダー:

#version 430

layout(location=0) in vec4 currentPos;
layout(location=1) in vec2 texPos;
out vec2 ex_TexCoor;

void main(void)
{
    gl_Position = currentPos;
    ex_TexCoor = texPos;
}

currentPosは頂点の位置であり、texPosは関連するUV座標です。

フラグメントシェーダー:

#version 430

in vec2 ex_TexCoor;
out vec4 color;

uniform sampler2D texture;

void main(void){
    color = texture2D(texture, ex_TexCoor);
}

ex_TexCoorは、頂点シェーダーからのuv座標であり、textureは、この特定のケースでレンダリングされたシーンを含むWebカメライメージです。

于 2013-03-06T09:38:52.590 に答える