【问题标题】:OpenGL output of simple vertex shader OK but results in a black screen简单顶点着色器的 OpenGL 输出正常,但导致黑屏
【发布时间】:2020-10-11 08:15:20
【问题描述】:

是的,这是另一个“OpenGL 中的黑屏,求助!”邮政。我已经尽职尽责,这是我迄今为止尝试诊断的内容:

  • 在使用 GLAD/GLFW 初始化窗口期间检查所有错误
  • 在编译和程序链接期间检查任何着色器错误
  • 在整个应用中的每个 GL 命令后检查 GL 错误。
  • 使用 Renderdoc 检查正在执行的 gl 命令列表。
  • 使用 glClear 清除屏幕颜色(是的,这完全没问题,所以大概上下文是可以的)

我的程序是一个非常简单的程序,它设置了一个缓冲区来渲染一个三角形(实际上还有更多的脚手架,因为它是从我在 d3d11 中使用的以前的渲染器改编而来的,但是我将它不断地削减,直到它基本上只是教程代码)。在 Renderdoc 中,您可以看到顶点位置没有问题,并且似乎理解片段着色器也已链接并执行,但我看到的只是黑屏。

如果有人知道任何问题或调试步骤,请务必向我提出您的想法。我将发布我的主要渲染代码、着色器和来自 renderdoc 的几个屏幕,这样您就可以看到我并不疯狂。此外,我知道这里有些东西对每帧都没有意义。这就像我可以对其进行完整性检查一样简单。我的着色器加载代码和窗口初始化代码是标准的,所以我不会费心发布它,但如果有人认为我很高兴看到它会有所帮助。

主循环

    glViewport(0, 0, 300, 300); 
    ASSERT(glGetError() == GL_NO_ERROR);


    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID); 
    ASSERT(glGetError() == GL_NO_ERROR);
    glBindVertexArray(VertexArrayID); 
    ASSERT(glGetError() == GL_NO_ERROR);

    static const GLfloat g_vertex_buffer_data[] = {
       -1.0f, -1.0f, 0.0f,
       1.0f, -1.0f, 0.0f,
       0.0f,  1.0f, 0.0f,
    };

    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    ASSERT(glGetError() == GL_NO_ERROR);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    ASSERT(glGetError() == GL_NO_ERROR);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    ASSERT(glGetError() == GL_NO_ERROR);

    glEnableVertexAttribArray(0);
    ASSERT(glGetError() == GL_NO_ERROR);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    ASSERT(glGetError() == GL_NO_ERROR);
    glVertexAttribPointer(
        0,           
        3,             
        GL_FLOAT,     
        GL_FALSE,      
        0,         
        (void*)0     
    );
    ASSERT(glGetError() == GL_NO_ERROR);
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    ASSERT(glGetError() == GL_NO_ERROR);
    glDisableVertexAttribArray(0);
    ASSERT(glGetError() == GL_NO_ERROR);

    glfwPollEvents();
    glfwSwapBuffers(glfwGetCurrentContext());

垂直着色器

#version 330 core
layout(location = 0) in vec3 inPos;
layout(location = 0) out vec4 outPos;

void main(){
  outPos.xyz = inPos;
  outPos.w = 1.0;
}

片段着色器

#version 330 core
layout(location = 0) out vec3 color;
void main(){
  color = vec3(1,0,0);
}

【问题讨论】:

    标签: c++ opengl glsl shader glfw


    【解决方案1】:

    您需要在顶点着色器中写入gl_Positiongl_Position 不能替换为自定义输出变量(如片段着色器中的 gl_FragColor):

    #version 330 core
    layout(location = 0) in vec3 inPos;
    
    void main()
    {
        gl_Position.xyz = vec4(inPos, 1.0);
    }
    

    OpenGL Shading Language 4.60 Specification - 7.1.1. Vertex Shader Special Variables

    请注意,顶点着色器的输出是下一个着色器阶段(在您的情况下为片段着色器)的输入,但Rendering Pipeline 中的以下步骤需要顶点位置 (gl_Position)。

    【讨论】:

    • 完全正确,谢谢您的回答。花了太长时间,应该刚刚超过规范!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多