Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL渲染无法正确使用使用GLSL着色器的OpenCV_Opengl_Opencv_Glsl - Fatal编程技术网

OpenGL渲染无法正确使用使用GLSL着色器的OpenCV

OpenGL渲染无法正确使用使用GLSL着色器的OpenCV,opengl,opencv,glsl,Opengl,Opencv,Glsl,我使用OpenGL和GLSL着色器编写了一个小型OpenGL程序。这是我的应用程序的屏幕: 现在,我的目标是使用OpenCV将我的opengl框架和我的网络摄像头中的框架混合在一个独特的框架中。在使用GLSL着色器之前,我尝试使用一些基本的OpenGL函数(glBengin、glVertex等)制作一个非常简单的程序来绘制彩色三角形 以下是渲染: 正如你所看到的,结果是正确的。现在,我想尝试我的第一个程序使用GLSL着色器和OpenCV,如下所示,但当我的应用程序启动时,我有一个黑屏。我尝试

我使用OpenGL和GLSL着色器编写了一个小型OpenGL程序。这是我的应用程序的屏幕:

现在,我的目标是使用OpenCV将我的opengl框架和我的网络摄像头中的框架混合在一个独特的框架中。在使用GLSL着色器之前,我尝试使用一些基本的OpenGL函数(glBengin、glVertex等)制作一个非常简单的程序来绘制彩色三角形

以下是渲染:

正如你所看到的,结果是正确的。现在,我想尝试我的第一个程序使用GLSL着色器和OpenCV,如下所示,但当我的应用程序启动时,我有一个黑屏。我尝试了几个测试,当我调用glUseProgram函数时,问题似乎就开始了(因此,当我想在代码中绑定程序着色器->时,它对应于程序->绑定()调用)。但是在这里我使用glDrawPixels函数来加载我的视频帧。如果我想使用GLSL着色器,我认为调用它不是一个好函数。这是我的C++代码:

[...]

/*My GLSL shaders initialization*/

[...]
int                         main(int ac, char **av)
{
    bool                    isAlive = true;
    unsigned int            vaoID = 0;
    SDL_Event               event;
    GLuint                  textureID = 0;
    ShaderProgram           *program = NULL;

    if (!glfwInit())
        return (-1);

    if (!glfwOpenWindow(WIDTH, HEIGHT, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {
        glfwTerminate();
        return (-1);
    }

    glEnable(GL_DEPTH_TEST);

    //Viewport initialization

    glViewport(0, 0, WIDTH, HEIGHT);

    //Vertex declaration

    VertexDeclaration *vDeclar = initVertexDeclaration();

    //Glew init component

    glewInit();

    //VBO initialization

    VertexBuffer *vBuffer = initVBO();

    //Shaders initialization

    program = initShaders("triangle-pf.vert", "triangle-pf.frag");

    //Texture initialization

    textureID = loadBMPTexture("Box.bmp");

    //VAO initialization

    initVAO(vaoID, vBuffer, textureID, vDeclar);

    //Screen capture Initialization

    CvCapture   *capture = cvCaptureFromCAM(CV_CAP_ANY);

    if (!capture) {
        fprintf(stderr, "ERROR: capture is NULL \n");
        getchar();
        return (-1);
    }

    //Main loop

    while (isAlive == true)
    {
        //eventListener(&event, &isAlive);

        if (glfwGetKey(GLFW_KEY_ESC))
            isAlive = false;

        glClearDepth(1.0f);
        glClearColor(0.13f, 0.12f, 0.13f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        //---------------------------------------------------

        IplImage    *frame = cvQueryFrame(capture);

        if (!frame) {
            fprintf(stderr, "ERROR: frame is null...\n");
            getchar();
            break;
        }

        //---------------------------------------------------

        program->bind();

        //Projection matrix

        glm::mat4 ProjectionMatrix = glm::perspective(45.0f, 500.0f / 500.0f, 0.1f, 100.0f);

        //View matrix

        glm::mat4 ViewMatrix = glm::lookAt(glm::vec3(0.0f, 0.0f, 8.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

        //Model matrix

        glm::mat4 ModelMatrix = glm::mat4(1.0f);
        ModelMatrix = glm::translate(ModelMatrix, glm::vec3(0.0f, 0.0f, 0.0f));
        ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(1.0f, 1.0f, 1.0f));
        ModelMatrix = glm::scale(ModelMatrix, glm::vec3(1.0f, 1.0f, 1.0f));

        //Prepare matrix

        glm::mat4 ModelViewMatrix = ViewMatrix * ModelMatrix;
        glm::mat3 NormalMatrix = glm::mat3(glm::vec3(ModelViewMatrix[0]), glm::vec3(ModelViewMatrix[1]), glm::vec3(ModelViewMatrix[2]));
        glm::mat4 ModelViewProjectionMatrix = ProjectionMatrix * ModelViewMatrix;
        glm::vec4 LightPositionVec1 = ViewMatrix * glm::vec4(LightPosition1[0], LightPosition1[1], LightPosition1[2], LightPosition1[3]);

        //Send source light properties

        program->setUniform("LightInfos[0].La", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("LightInfos[0].Ld", glm::vec3(0.800000f, 0.800000f, 0.800000f));
        program->setUniform("LightInfos[0].Ls", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("LightInfos[0].Le", glm::vec3(0.200000f, 0.200000f, 0.200000f));

        /*program->setUniform("LightInfos[1].La", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("LightInfos[1].Ld", glm::vec3(0.800000f, 0.800000f, 0.800000f));
        program->setUniform("LightInfos[1].Ls", glm::vec3(0.000000f, 1.000000f, 1.000000f));
        program->setUniform("LightInfos[1].Le", glm::vec3(0.200000f, 0.200000f, 0.200000f));*/

        //Send model materials properties

        program->setUniform("MaterialInfos.Ka", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("MaterialInfos.Kd", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("MaterialInfos.Ks", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("MaterialInfos.Ke", glm::vec3(0.200000f, 0.000000f, 0.200000f));
        program->setUniform("MaterialInfos.Shininess", 10.0f);

        //Send light position

        program->setUniform("LightInfos[0].Position", LightPositionVec1);

        //Send matrix

        program->setUniform("ProjectionMatrix", ProjectionMatrix);
        program->setUniform("NormalMatrix", NormalMatrix);
        program->setUniform("ModelViewMatrix", ModelViewMatrix);
        program->setUniform("ModelMatrix", ModelMatrix);
        program->setUniform("MVP", ModelViewProjectionMatrix);

        glDrawPixels(frame->width, frame->height, GL_RGB, GL_UNSIGNED_BYTE, frame->imageData);

        //VAO binding

        glBindVertexArray(vaoID);

        //Render meshes

        glDrawArrays(GL_TRIANGLES, 0, vBuffer->getSize());

        glBindVertexArray(0);

        program->release();

        angle += 0.50f;

        glFlush();
        glfwSwapBuffers();
    }

    unsigned int vboID = vBuffer->getHandle();
    glDeleteBuffers(1, &vboID);
    glDeleteVertexArrays(1, &vaoID);
    return (0);
}

因此,我认为问题来自glDrawPixels,它不能与GLSL着色器一起使用。我尝试了几种可能的方法,但没有成功。也许我必须直接将视频帧缓冲区发送到像素着色器?在这种情况下,我怎么做?我真的迷路了。有人能帮我吗?

设置的方法是将图像数据用作纹理。这可能是一个很好的起点。然后,您可以在背景中渲染一个四边形,该四边形填充整个屏幕,并使用纹理确定每个像素的颜色。与
glDrawPixels()
相比的优点是,如果缩放窗口(和四边形),视频中的图像将相应缩放

如果需要,可以在渲染该四边形时使用着色器中的纹理:为每个像素调用片段(像素)着色器,并使用采样器从纹理中获取颜色。然后,可以根据照明需要修改该颜色


你在上面画什么取决于你。

“使用OpenCV将我的opengl框架和我的网络摄像头中的框架混合在一个独特的框架中”,这是什么意思?难道不能在背景中渲染一个四边形,并使用OpenCV中的图像数据作为纹理,然后在顶部绘制其他3D对象吗?我不明白你为什么要使用着色器。着色器应该做什么?我使用着色器来计算一些基本Opengl使用无法渲染的灯光效果。我只想渲染我的立方体,并将我的实时视频作为背景(如上面三角形的示例)。这就像是视频帧(来自我的网络摄像头)和另一帧与立方体的并置。你明白我的意思吗?是的,那叫做增强现实。您需要将这些灯光效果应用于背景还是3D对象?我的灯光效果仅应用于我的3D对象,就像在我的第一张图片上一样。背景只是来自网络摄像头的视频流。这不是纹理(图片编号2)。上面三角形的例子就是这样工作的。我没有在背景上使用任何纹理,它只是视频流。我在上面画了一个简单的三角形。我只想有同样的行为,但使用GLSL着色器。你知道你可以对3D对象使用着色器,但保留旧代码作为背景,对吗?我仍然不明白为什么你会想用一个着色器作为背景,因为你似乎不需要它。好的,这是一个好答案。非常感谢。我试试看。关于我在上面发布的带有彩色三角形的小程序,这意味着如果我在OpenGL上下文(没有三角形)中返回视频流,OpenGL(在背景中)创建一个纹理(每个视频帧都有来自网络摄像头的像素缓冲区),并将其发送到片段着色器并将其绘制到屏幕上。我知道OpengL使用自己的着色器(但过程是隐藏的)。因此,我必须复制相同的行为,但这次是使用我自己的着色器。是吗?我不知道如何实现
glDrawPixels
。这甚至可能取决于硬件。但如果不需要修改渲染方式,我仍然不明白为什么要使用着色器渲染背景。我只想在3D模型上应用着色器,而不是在背景上,因为它是视频流。网络摄像头记录的环境必须相同。我只想在我的3D模型上应用亮度效果。正如你说的,这是增强现实。我想你可能对着色器的概念有点倒退。将着色器视为纹理,一种为像素指定颜色的方法。可以将不同的着色器应用于不同的对象。可以将多个着色器应用于同一对象。如果愿意,您甚至可以为每个三角形使用一个着色器。您可以将其与其他工具(如普通旧纹理)混合搭配。在代码中,可以先调用glDrawPixels,然后绑定着色器,然后仅使用shaders.Ok渲染三维模型。我将glDrawPixels调用移到着色器程序绑定的正上方。我有一个视频流,但没有显示3D模型。你知道为什么吗?再次感谢你的帮助。
[...]

/*My GLSL shaders initialization*/

[...]
int                         main(int ac, char **av)
{
    bool                    isAlive = true;
    unsigned int            vaoID = 0;
    SDL_Event               event;
    GLuint                  textureID = 0;
    ShaderProgram           *program = NULL;

    if (!glfwInit())
        return (-1);

    if (!glfwOpenWindow(WIDTH, HEIGHT, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {
        glfwTerminate();
        return (-1);
    }

    glEnable(GL_DEPTH_TEST);

    //Viewport initialization

    glViewport(0, 0, WIDTH, HEIGHT);

    //Vertex declaration

    VertexDeclaration *vDeclar = initVertexDeclaration();

    //Glew init component

    glewInit();

    //VBO initialization

    VertexBuffer *vBuffer = initVBO();

    //Shaders initialization

    program = initShaders("triangle-pf.vert", "triangle-pf.frag");

    //Texture initialization

    textureID = loadBMPTexture("Box.bmp");

    //VAO initialization

    initVAO(vaoID, vBuffer, textureID, vDeclar);

    //Screen capture Initialization

    CvCapture   *capture = cvCaptureFromCAM(CV_CAP_ANY);

    if (!capture) {
        fprintf(stderr, "ERROR: capture is NULL \n");
        getchar();
        return (-1);
    }

    //Main loop

    while (isAlive == true)
    {
        //eventListener(&event, &isAlive);

        if (glfwGetKey(GLFW_KEY_ESC))
            isAlive = false;

        glClearDepth(1.0f);
        glClearColor(0.13f, 0.12f, 0.13f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        //---------------------------------------------------

        IplImage    *frame = cvQueryFrame(capture);

        if (!frame) {
            fprintf(stderr, "ERROR: frame is null...\n");
            getchar();
            break;
        }

        //---------------------------------------------------

        program->bind();

        //Projection matrix

        glm::mat4 ProjectionMatrix = glm::perspective(45.0f, 500.0f / 500.0f, 0.1f, 100.0f);

        //View matrix

        glm::mat4 ViewMatrix = glm::lookAt(glm::vec3(0.0f, 0.0f, 8.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

        //Model matrix

        glm::mat4 ModelMatrix = glm::mat4(1.0f);
        ModelMatrix = glm::translate(ModelMatrix, glm::vec3(0.0f, 0.0f, 0.0f));
        ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(1.0f, 1.0f, 1.0f));
        ModelMatrix = glm::scale(ModelMatrix, glm::vec3(1.0f, 1.0f, 1.0f));

        //Prepare matrix

        glm::mat4 ModelViewMatrix = ViewMatrix * ModelMatrix;
        glm::mat3 NormalMatrix = glm::mat3(glm::vec3(ModelViewMatrix[0]), glm::vec3(ModelViewMatrix[1]), glm::vec3(ModelViewMatrix[2]));
        glm::mat4 ModelViewProjectionMatrix = ProjectionMatrix * ModelViewMatrix;
        glm::vec4 LightPositionVec1 = ViewMatrix * glm::vec4(LightPosition1[0], LightPosition1[1], LightPosition1[2], LightPosition1[3]);

        //Send source light properties

        program->setUniform("LightInfos[0].La", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("LightInfos[0].Ld", glm::vec3(0.800000f, 0.800000f, 0.800000f));
        program->setUniform("LightInfos[0].Ls", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("LightInfos[0].Le", glm::vec3(0.200000f, 0.200000f, 0.200000f));

        /*program->setUniform("LightInfos[1].La", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("LightInfos[1].Ld", glm::vec3(0.800000f, 0.800000f, 0.800000f));
        program->setUniform("LightInfos[1].Ls", glm::vec3(0.000000f, 1.000000f, 1.000000f));
        program->setUniform("LightInfos[1].Le", glm::vec3(0.200000f, 0.200000f, 0.200000f));*/

        //Send model materials properties

        program->setUniform("MaterialInfos.Ka", glm::vec3(0.000000f, 0.000000f, 0.000000f));
        program->setUniform("MaterialInfos.Kd", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("MaterialInfos.Ks", glm::vec3(1.000000f, 1.000000f, 1.000000f));
        program->setUniform("MaterialInfos.Ke", glm::vec3(0.200000f, 0.000000f, 0.200000f));
        program->setUniform("MaterialInfos.Shininess", 10.0f);

        //Send light position

        program->setUniform("LightInfos[0].Position", LightPositionVec1);

        //Send matrix

        program->setUniform("ProjectionMatrix", ProjectionMatrix);
        program->setUniform("NormalMatrix", NormalMatrix);
        program->setUniform("ModelViewMatrix", ModelViewMatrix);
        program->setUniform("ModelMatrix", ModelMatrix);
        program->setUniform("MVP", ModelViewProjectionMatrix);

        glDrawPixels(frame->width, frame->height, GL_RGB, GL_UNSIGNED_BYTE, frame->imageData);

        //VAO binding

        glBindVertexArray(vaoID);

        //Render meshes

        glDrawArrays(GL_TRIANGLES, 0, vBuffer->getSize());

        glBindVertexArray(0);

        program->release();

        angle += 0.50f;

        glFlush();
        glfwSwapBuffers();
    }

    unsigned int vboID = vBuffer->getHandle();
    glDeleteBuffers(1, &vboID);
    glDeleteVertexArrays(1, &vaoID);
    return (0);
}