c++ - OpenGL Shader Program使用时导致屏幕变黑

标签 c++ opengl glsl shader

因此,在我的OpenGL代码中,每当我尝试在项目中使用着色器程序时,屏幕就保持黑色。
我特意在着色器代码中犯了一个错误,以确保错误检查有效,并且确实如此,因此当我去修复它并再次运行该程序时,它只是出现了黑屏。
我已经进入其他项目以确保着色器程序能够正常工作,但确实可以,但是对于这个特定项目,它们根本不起作用。
此代码只是简单的三角形程序的一部分。
enter image description here
但是如您所见,UseProgram调用已被注释掉。
当我取消注释时,我只会得到黑屏。
enter image description here

// 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.0:gl_Position = vec4(vertexPosition, 0.0, 0.0);

gl_Position = vec4(vertexPosition, 0.0, 1.0);
剪辑空间坐标是Homogeneous coordinates。归一化设备坐标是Cartesian coordinate,它是通过将剪辑空间坐标的x,y和z分量除以剪辑空间坐标(Perspective divide)的w分量而计算得出的。

关于c++ - OpenGL Shader Program使用时导致屏幕变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64957872/

相关文章:

c++ - OpenGL 淡入淡出问题

opengl - 加载 GL_RGB 纹理后出现奇怪的颜色偏移

c++ - 在opengl中在z方向上更改将2d纹理应用于单个立方体表面

opengl - 重用多个着色器存储 block 的绑定(bind)是否合法

ios - GPUImage glsl 正弦波 photoshop 效果

c++ - 为什么删除成员变量的复制构造函数不会阻止默认复制构造函数

c++ - glm::lookat,OpenGL 中的透视澄清

c++ - 处理基类子对象的表达式的动态类型

c++ - 悬挂指针 - 请验证

c++ - 为什么 OSX Mavericks 不编译我的 GLSL 着色器?