2013-06-05 63 views
1

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

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

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

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

+0

这是一个远射,但我没有看到任何'glViewport'。也许也关闭脸部剔除(我从来不记得默认是什么) – Grimmy

+0

@Grimmy剔除似乎是默认关闭。本书中的例子应该没​​有视口,它的代码中没有任何地方,我还没有看到更难的例子。 – Appleshell

回答

0

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

0

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

否则,你的代码看起来是正确的。 (尽管您不需要将nullptr加入LoadShaders的着色器列表中,但只能查找GL_NONE)。

+0

你说得对,坐标应该是'0.xx'而不是'xx.0'。尽管如此,窗户仍然是黑色的...... – Appleshell