OpenGL着色器程序在使用时导致屏幕变黑

Posted

技术标签:

【中文标题】OpenGL着色器程序在使用时导致屏幕变黑【英文标题】:OpenGL Shader Program causing screen to go black when used 【发布时间】:2020-11-22 18:25:14 【问题描述】:

所以在我的 OpenGL 代码中,每当我尝试在我的项目中使用着色器程序时,屏幕就会一直保持黑色。

我故意在着色器代码中犯了一个错误,以确保错误检查有效,而且确实有效,所以当我去修复它并再次运行程序时,它只是给出了一个黑屏。

我参与了其他项目以确保着色器程序有效,并且确实有效,但对于这个特定项目,它们根本不起作用。

这段代码只是一个简单的三角形程序的一部分。

但如您所见,UseProgram 调用已被注释掉。

当我取消注释时,我只是得到一个黑屏。

// I'm only using this for testing purposes
static constexpr const char* vertexShaderCode = R"(
    #version 460 core

    layout (location = 0) in vec2 vertexPosition;
    
    void main() 
        gl_Position = vec4(vertexPosition, 0.0, 0.0);
    

)";

static constexpr const char* fragmentShaderCode = R"(
    #version 460 core

    out vec4 fragmentColor;

    void main() 
        fragmentColor = vec4(0.1, 0.1, 1.0, 1.0);
    
)";

unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);
glShaderSource(fragmentShader, 1, &fragmentShaderCode, nullptr);

glCompileShader(vertexShader);
glCompileShader(fragmentShader);

// error checking
// I've made sure it logs errors to the console, and it does.

    int compileSuccess;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compileSuccess);
    if (!compileSuccess) 
        char infoLog[512];
        glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);

        cerr << "Failed to compile vertex shader!" << '\n';
        cerr << "Shader Info log: " << infoLog << '\n';
    


    int compileSuccess;
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compileSuccess);
    if (!compileSuccess) 
        char infoLog[512];
        glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);

        cerr << "Failed to compile fragment shader!" << '\n';
        cerr << "Shader Info log: " << infoLog << '\n';
    


unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

// This logs errors and it works as well.

        int linkSuccess;
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linkSuccess);
        if (!linkSuccess) 
            char infoLog[512];
            glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);

            cerr << "Failed to link Shader Program!" << '\n';
            cerr << "Shader Program Info log: " << infoLog << '\n';
        
    

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

// when this is un commented the screen stays black
//glUseProgram(shaderProgram);

// rest of code to create triangle ...

【问题讨论】:

【参考方案1】:

剪辑空间坐标的第 4 个分量应该是 1.0:

gl_Position = vec4(vertexPosition, 0.0, 0.0);

gl_Position = vec4(vertexPosition, 0.0, 1.0);

剪辑空间坐标是Homogeneous coordinates。标准化的设备坐标是Cartesian coordinate,它是通过将剪辑空间坐标的 xyz 分量除以 w 剪辑空间坐标的分量 (Perspective divide)。

【讨论】:

以上是关于OpenGL着色器程序在使用时导致屏幕变黑的主要内容,如果未能解决你的问题,请参考以下文章

在opengl矩形上使用着色器会导致它消失[关闭]

无法让 openGL 的 glDrawElements 与几何着色器一起使用

opengl着色器程序中的重复顶点

用于片段着色器的 OpenGL GLSL 绑定采样器

OpenGL相机移动程序顶点着色器问题

是啥导致基于 OpenGL 2.0 的着色器处理代码在 ::glBegin() 中崩溃?