OpenGL没有按预期绘制

时间:2013-06-05 01:58:03

标签: c++ opengl opengl-3

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

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

这是创建三角形的init函数:

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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