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
)。因此,窗口的坐标系是标准化的设备坐标。只有在 x 和 y 中坐标在 [-1,1] 之间的对象才会被传递给光栅化器(而不是被裁剪)。鉴于您在程序中指定的几何图形,您渲染的三角形完全覆盖了视口,因此您应该看到您在片段着色器中指定的颜色(蓝色)。
否则,您的代码看起来是正确的。 (虽然您不需要将nullptr
传递到LoadShaders
的着色器列表中。仅查找GL_NONE
)。
【讨论】:
你是对的,坐标应该是0.xx
而不是xx.0
。尽管如此,窗口仍然是黑色的......【参考方案2】:
好吧,我发现了问题所在。应用程序在构建时运行在与源完全不同的位置,并且着色器文件不会复制到目标目录中。因此,程序显然无法读取它们并且没有任何显示。用绝对路径替换相对着色器路径one.vsh
和one.fsh
解决了这个问题。
【讨论】:
以上是关于OpenGL 未按预期绘制的主要内容,如果未能解决你的问题,请参考以下文章