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
C++ 纹理视图,GL_DEPTH_STENCIL_Texture_MODE参数设置为GL_STENCIL_INDEX和Intel GPU_C++_Opengl_Glsl_Glfw_Glm Math - Fatal编程技术网

C++ 纹理视图,GL_DEPTH_STENCIL_Texture_MODE参数设置为GL_STENCIL_INDEX和Intel GPU

C++ 纹理视图,GL_DEPTH_STENCIL_Texture_MODE参数设置为GL_STENCIL_INDEX和Intel GPU,c++,opengl,glsl,glfw,glm-math,C++,Opengl,Glsl,Glfw,Glm Math,我有一个深度模具纹理附加到帧缓冲区。我需要从着色器访问此纹理的模具索引 我正在使用纹理视图来简化对此纹理的模具索引的访问(如中所建议)。它在专用的nVidia GPU上运行良好,但在集成的英特尔GPU上不起作用。我知道模具值存在于深度模具纹理中,因为我通过glGetTexImage()检查了它们。但是当我在着色器中访问这些值时(通过纹理视图),我只得到零。 我不知道是我的代码错了/不完整还是英特尔驱动程序有错误 我做了一些测试。如果我直接在深度模具纹理上将参数GL_DEPTH\u STENCIL

我有一个深度模具纹理附加到帧缓冲区。我需要从着色器访问此纹理的模具索引

我正在使用纹理视图来简化对此纹理的模具索引的访问(如中所建议)。它在专用的nVidia GPU上运行良好,但在集成的英特尔GPU上不起作用。我知道模具值存在于深度模具纹理中,因为我通过glGetTexImage()检查了它们。但是当我在着色器中访问这些值时(通过纹理视图),我只得到零。 我不知道是我的代码错了/不完整还是英特尔驱动程序有错误

我做了一些测试。如果我直接在深度模具纹理上将参数
GL_DEPTH\u STENCIL\u TEXTURE\u MODE
设置为
GL_STENCIL\u INDEX
,避免使用纹理视图,则效果良好。如果使用纹理视图检索深度组件(将
GL\u depth\u STENCIL\u texture\u MODE
保留为默认值,即
GL\u depth\u组件
),则纹理视图工作正常。似乎只有两者的结合才会产生错误

  • OpenGL 4.3
  • 专用GPU:NVIDIA GeForce MX150(支持OpenGL高达 (4.6)
  • 集成GPU:Intel UHD Graphics 620(支持OpenGL高达4.4)操作系统:Windows 64位10.0.18362
完整的最小代码相当长,所以我删除了某些部分,尽管我不能删除更多部分,因为我不确定bug可能在哪里

filter.fs

#version 430 core
out vec4 fs_frag_color;

in vec2 vs_tex_coords;

layout (binding = 0) uniform usampler2D u_stencil_tex;


void main()
{   
    uint draw_count = texture(u_stencil_tex, vs_tex_coords).r;

    // Show stencil buffer
    if(draw_count == 1)
    {
        fs_frag_color = vec4(0, 1, 0, 1);
    }
    else if(draw_count > 1 && draw_count <= 10)
    {
        float orange_shade = float(draw_count + 5) / 15.0;
        fs_frag_color = vec4(orange_shade, orange_shade, 0 ,1);
    }
    else if(draw_count > 10 && draw_count <= 50)
    {
        float red_shade = float(draw_count + 5) / 55.0;
        fs_frag_color = vec4(red_shade, 0, 0, 1);
    }
    else
    {
        fs_frag_color = vec4(0, 0, 0, 1);
    }
}
#版本430核心
输出矢量4 fs\u frag\u颜色;
在vec2 vs_tex_coords中;
布局(装订=0)统一使用样本2D u_模板;
void main()
{   
uint draw_count=纹理(模板纹理与纹理坐标)。r;
//显示模具缓冲区
如果(绘图计数=1)
{
fs_frag_color=vec4(0,1,0,1);
}
否则如果(绘图计数>1和绘图计数10和绘图计数
int main(void)
{
    //Initialize GLFW and open a window with a 4.3 OpenGL context
    // ...

    glEnable(GL_DEBUG_OUTPUT);
    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
    glDebugMessageCallback(debugMessage_callback, nullptr);



    Shader main_shader;
    main_shader.load("shader.vs", "shader.fs");

    Shader filter_shader;
    filter_shader.load("filter.vs", "filter.fs");


    //CUBE VAO
    GLuint cube_VAO;
    GLuint cube_VBO;
    glGenVertexArrays(1, &cube_VAO);
    glGenBuffers(1, &cube_VBO);
    glBindVertexArray(cube_VAO);
        // cube_VAO settings...
    glBindVertexArray(0);


    //OFFSCREEN FBO
    GLuint offscreen_FBO = 0;
    GLuint offscreen_colorTex = 0;
    GLuint offscreen_depthStencilTex = 0;
    GLuint offscreen_stencilTexView = 0;

    int offscreen_width, offscreen_height;
    glfwGetFramebufferSize(window1, &offscreen_width, &offscreen_height);
    glGenFramebuffers(1, &offscreen_FBO);
    glBindFramebuffer(GL_FRAMEBUFFER, offscreen_FBO);

        glGenTextures(1, &offscreen_colorTex);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, offscreen_colorTex);
            glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, offscreen_width, 
                           offscreen_height);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D, 0); //unbind

        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                               GL_TEXTURE_2D, offscreen_colorTex, 0);

        static GLenum offscreen_drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
        glDrawBuffers(1, offscreen_drawBuffers);


        glGenTextures(1, &offscreen_depthStencilTex);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, offscreen_depthStencilTex);
            glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 
                           offscreen_width, offscreen_height);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D, 0); //unbind

        // Attach the depth and stencil texture to the framebuffer
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, 
                               GL_TEXTURE_2D, offscreen_depthStencilTex, 0);


        glGenTextures(1, &offscreen_stencilTexView);
        glTextureView(offscreen_stencilTexView, GL_TEXTURE_2D, 
                      offscreen_depthStencilTex, GL_DEPTH24_STENCIL8, 0, 1, 0, 1);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, offscreen_stencilTexView);
            glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, 
                            GL_STENCIL_INDEX);
        glBindTexture(GL_TEXTURE_2D, 0);
        // ^^^^^^
        // ^^^^^^  Here the important block
        // ^^^^^^


        // Check if the framebuffer is complete
        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            throw std::runtime_error("The offscreen FBO is not complete.");

    glBindFramebuffer(GL_FRAMEBUFFER, 0); //unbind



    // WINDOW RECTANGLE VAO
    GLuint wRect_VAO;
    GLuint wRect_VBO;
    glGenVertexArrays(1, &wRect_VAO);
    glGenBuffers(1, &wRect_VBO);
    glBindVertexArray(wRect_VAO);
        // wRect_VAO settings ...
    glBindVertexArray(0);


    while (!glfwWindowShouldClose(window1))
    {
        float ratio;
        int width, height;

        glfwGetFramebufferSize(window1, &width, &height);
        ratio = width / (float)height;

        glViewport(0, 0, width, height);


        // Drawing on the offscreen FBO
        glBindFramebuffer(GL_FRAMEBUFFER, offscreen_FBO);
            glEnable(GL_DEPTH_TEST);

            glEnable(GL_STENCIL_TEST);
                glStencilFunc(GL_ALWAYS, 1, 0xFF); //stencil test always pass
                glStencilOp(GL_KEEP, GL_INCR, GL_INCR); //the value stored in the stencil buffer is increased every time a fragment is not discarded

            glClearColor(1.f, 1.f, 1.f, 1.f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

            main_shader.bind();

            glm::mat4 view(1.0f); view = glm::translate(view, glm::vec3(0.f, 0.f, -3.f));
            glm::mat4 projection = glm::perspective(glm::radians(45.f), 800.f / 600.f, 0.1f, 100.0f);
            glm::mat4 model(1.f);
            model = glm::rotate(model, glm::radians(static_cast<float>(glfwGetTime() * 20.f)), glm::vec3(1.f, 1.f, 0.f));
            main_shader.set_mat4("model", model);
            main_shader.set_mat4("view", view);
            main_shader.set_mat4("projection", projection);

            glBindVertexArray(cube_VAO);
                glDrawArrays(GL_TRIANGLES, 0, 36);
            glBindVertexArray(0);

        // Drawing on the default FBO
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
            glDisable(GL_DEPTH_TEST);
            glClearColor(0.f, 1.f, 1.f, 1.f);
            glClear(GL_COLOR_BUFFER_BIT);

            filter_shader.bind();

            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, offscreen_stencilTexView);

            glBindVertexArray(wRect_VAO);
                glDrawArrays(GL_TRIANGLES, 0, 6);
            glBindVertexArray(0);                                   
        glBindFramebuffer(GL_FRAMEBUFFER, 0);


        glfwSwapBuffers(window1);


        glfwPollEvents();
    }

    //Destroy the window and shut down GLFW ...
}