【问题标题】:OpenGL Drawing with VBO使用 VBO 进行 OpenGL 绘图
【发布时间】:2013-07-02 21:20:22
【问题描述】:

我正在尝试编写一个小的 Opengl 程序来仅使用顶点缓冲区对象(不使用 VAO)来绘制一个三角形,但是每当我想编译它时,它只会显示一个蓝屏

这是我的代码

#include <iostream>
#include <GLUT/glut.h>
#include <OpenGL/gl3.h>

GLuint VBO;
GLuint VAO;

void display();

float vertex[] = {-1.0, 0.0 , 0.0,
                   0.0 , 1.0 , 0.0 ,
                   1.0 , 0.0 , 0.0 };

int main (int argc, char *argv[])

{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(1000, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("My First GLUT/OpenGL Window");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

 void display()

{
glClearColor(0, 0, 1,1);
glClear(GL_COLOR_BUFFER_BIT);

glGenBuffers(1,&VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,9 *sizeof(vertex),vertex, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);

glVertexAttribPointer(0, 3,GL_FLOAT, GL_TRUE, 0, 0);


glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(0);

glutSwapBuffers();
};

【问题讨论】:

  • 你的着色器在哪里?或者,你为什么不使用glVertexPointer()
  • 我是 Opengl 编程的新手,我想探索使用 opengl 绘制的不同方法,所以按照一些在线教程(没有涵盖程序的所有内容)我想出了这段代码,不过我知道我们应该提供我们的着色器程序..

标签: c++ opengl graphics 3d vbo


【解决方案1】:

三个问题:

  • 您的代码错过了设置视口(如果窗口恰好以 0×0 的大小创建并且稍后才调整大小,则初始视口大小将为 0×0)。

  • 您对sizeof 运算符的使用是错误的。 vertex 是一个静态分配的数组,因此sizeof 运算符将返回顶点数组的总大小,而不仅仅是单个元素的大小。因此,在这种特殊情况下,只需 sizeof(vertex) 而不将其乘以 9 就足够了。

最后但并非最不重要的是,问题的真正原因:

  • 您的着色器在哪里?使用通用顶点属性,当然 OpenGL-3 强制使用,您必须提供顶点和片段着色器的有效组合。没有这些,什么都不会渲染。

【讨论】:

  • 实际上我从互联网教程中找到了所有这些问题,有一些教程将 sizeof 运算符乘以一个常数,关于着色器,我已经知道顶点和片段着色器是强制性的,但正如我提到的在有一些在线教程没有提到程序的所有方面之前,我认为通过不指定着色器我们让 OpenGl 使用某种默认着色器程序可能就像一个简单的直通着色器:P,无论如何,谢谢你的回答..
  • @BulBul:OpenGL 中没有默认着色器。使用 OpenGL-2 并使用非通用顶点属性(glVertexPointer、glNormalPointer、glEnableClientState(GL_VERTEX_ARRAY) 等),您可以默认使用固定函数管道。关于 sizeof 运算符,我认为您提到的教程要么写了 sizeof(v[0])sizeof(*v) 之类的东西,并且确实在指针上工作,而不是在静态分配的数组上工作。由于您不知道这种微妙之处,我强烈建议您提高您的 C/C++ 知识。
  • 从我读过的一本 C 编程书籍的定义中指出 >>> 数组的名称(不指定索引)是指向该数组中第一个元素的指针示例:“vertex”等价于“vertex[0]”,但 sizeof() 运算符的工作方式似乎与我预期的完全不同。
  • @BulBul:是的,原则上,通过数组定义创建的符号可以像指针一样使用。然而,静态分配数组的符号与指针符号的行为不同,数组符号通常会转换为指针符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多