OpenGL 未按预期绘制

Posted

技术标签:

【中文标题】OpenGL 未按预期绘制【英文标题】:OpenGL does not draw as expected 【发布时间】:2013-06-05 01:58:02 【问题描述】:

我目前正在阅读当前的 OpenGL 编程指南,版本 4.3。我实现了第一个示例的代码,应该显示两个三角形。基本上很简单。

但是当我运行该代码时没有显示任何内容(只是黑色窗口)。

这是创建三角形的初始化函数:

GLuint vertexArrayObjects[1];
GLuint buffers[1];
const GLuint vertexCount = 6;

void init() 
//  glClearColor(0,0,0,0);

    glGenVertexArrays(1, vertexArrayObjects);
    glBindVertexArray(vertexArrayObjects[0]);

    GLfloat vertices[vertexCount][1] 
        -90.0, -90.0,
         85.0, -90.0,
        -90.0,  85.0,
         90.0, -85.0,
         90.0,  90.0,
        -85.0,  90.0
    ;

    glGenBuffers(1, buffers);
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    ShaderInfo shaders[] 
        GL_VERTEX_SHADER, "one.vsh",
        GL_FRAGMENT_SHADER, "one.fsh",
        GL_NONE, nullptr
    ;

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, ((char *)NULL + (0)));
    glEnableVertexAttribArray(0);

还有非常简单的画法:

void display() 
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(vertexArrayObjects[0]);
    glDrawArrays(GL_TRIANGLES, 0, vertexCount);

    glFlush();

但如前所述,没有绘制任何内容。我的实现是否有错误?

完整的代码是here,LoadShaders(直接来自书籍网站,所以这应该是出于兴趣)是here。 着色器是here。

【问题讨论】:

这是一个很长的镜头,但我没有看到任何glViewport。也许还可以关闭面部剔除(我不记得默认值是什么) @Grimmy 剔除似乎默认关闭。书中的示例应该在没有视口的情况下工作,他们的代码中没有,而且我还没有看到更难的示例。 【参考方案1】:

对于本书中的第一个示例,没有应用任何转换(即,在顶点着色器中,顶点的位置vPosition 直接映射到输出位置gl_Position)。因此,窗口的坐标系是标准化的设备坐标。只有在 xy 中坐标在 [-1,1] 之间的对象才会被传递给光栅化器(而不是被裁剪)。鉴于您在程序中指定的几何图形,您渲染的三角形完全覆盖了视口,因此您应该看到您在片段着色器中指定的颜色(蓝色)。

否则,您的代码看起来是正确的。 (虽然您不需要将nullptr 传递到LoadShaders 的着色器列表中。仅查找GL_NONE)。

【讨论】:

你是对的,坐标应该是0.xx而不是xx.0。尽管如此,窗口仍然是黑色的......【参考方案2】:

好吧,我发现了问题所在。应用程序在构建时运行在与源完全不同的位置,并且着色器文件不会复制到目标目录中。因此,程序显然无法读取它们并且没有任何显示。用绝对路径替换相对着色器路径one.vshone.fsh 解决了这个问题。

【讨论】:

以上是关于OpenGL 未按预期绘制的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 纹理未按定义显示

立方体在旋转时未按预期呈现

使用 VAO 在 OpenGL 中更改绘制的实例化顺序

OpenGL 深度/剔除问题

Qt OpenGL 纹理透明度问题

opengl如何绘制一个三维平面