OpenGL拒绝绘制三角形

时间:2015-04-29 18:16:56

标签: c++ opengl

我试图在OpenGL的窗口中绘制一个大三角形。我的程序编译并运行,但我的窗口只有一个黑屏。

我已经检查并仔细检查了多个教程,看起来我的步骤是正确的......我错过了一些明显的东西吗?

以下是整个计划:

#include <stdlib.h>
#include <stdio.h>
#include <GL/glew.h>
#include <GLUT/glut.h>

GLuint VBO;

struct vector {
  float _x;
  float _y;
  float _z;
  vector() { }
  vector(float x, float y, float z) { _x = x; _y = y; _z = z; }
};

void render()
{
  glClear(GL_COLOR_BUFFER_BIT);

  glEnableVertexAttribArray(0);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

  glDrawArrays(GL_TRIANGLES, 0, 3);

  glDisableVertexAttribArray(0);

  glutSwapBuffers();
}

void create_vbo()
{
  vector verts[3];
  verts[0] = vector(-1.0f, -1.0f, 0.0f);
  verts[1] = vector(1.0f, -1.0f, 0.0f);
  verts[2] = vector(0.0f, 1.0f, 0.0f);

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Triangle Test");
    glutDisplayFunc(render);

    glewInit();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    create_vbo();
    glutMainLoop();

    return 0;
}

更新:事实证明,没有&#34;程序&#34; (也就是说,已编译的着色器文件)会产生未定义的行为(图形卡越新,它就越有可能工作)。

因为我的卡片是正确的,并且只支持OpenGL 2.1,所以找到一个合适的着色器示例有点困难 - 似乎有很多不同的教程在不同的阶段写入的OpenGL。

我的顶点着色器(整个文件):

void main()
{
  gl_Position = ftransform();
}

我的片段着色器(整个文件):

void main()
{
    gl_FragColor = vec4(0.4,0.4,0.8,1.0);
}

我使用了来自this OpenGL Tutorial Site的示例LoadShaders函数来创建程序,现在,我也可以看到三角形!

(感谢@ chbaker0指点我正确的方向。)

2 个答案:

答案 0 :(得分:2)

我不知道这是否会对您有所帮助,但在您的create_vbo()函数中有:

  glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

试试这个:

  glBufferData( GL_ARRAY_BUFFER, sizeof( verts[0] * 3 ), &verts[0], GL_STATIC_DRAW );

在此函数调用之后,将此函数调用添加到create_vbo()函数的末尾

// This MUST BE LAST! Used to Stop The Buffer!
glBindBuffer( GL_ARRAY_BUFFER, 0 ); 

我很难看到你的错误。在我的项目中,我确实有一些vbos,但我也使用vaos。我的代码能够在OpenGL 2.0 - 4.5中工作,但是对于旧版本,由于API中已弃用的功能,因此逻辑上存在分歧。我也不使用过剩。我希望这会有所帮助。

我注意到的另一件事是你注意你的顶点缠绕顺序吗?这意味着OpenGL在CCW订单或CW订单中使用它们?背面剔除是打开还是关闭?在设置和配置OpenGL上下文时,需要考虑很多元素。自从我使用旧版本的OpenGL以来已经有一段时间了,但我知道一旦你开始使用特定版本或更新版本,你将不得不提供自己的模型视图投影矩阵,这是需要考虑的事情。

答案 1 :(得分:0)

我遇到的问题是使用管道功能而不定义着色器程序。规范说这应该有效,但是在我的图形卡上却没有。 (有关详细信息,请参阅问题中的我的更新。)

感谢所有评论者向正确的方向推动我。