OpenGL VBO 程序给出黑屏

Posted

技术标签:

【中文标题】OpenGL VBO 程序给出黑屏【英文标题】:OpenGL VBO program gives blank screen 【发布时间】:2012-06-15 23:18:16 【问题描述】:

我一直在尝试将我的一些代码转换为现代 OpenGL。我已经达到了没有任何 OpenGL 错误的地步,但是当我尝试绘制对象时没有任何显示。这是我的代码(减去上下文创建和错误检查):

//Compile shaders and create/link program
//I very highly doubt the problem's here (all my tests say it worked fine),
//so I'm leaving this out for now,  but I'll dig it out of my classes if
//there's no obvious problem with the VBO code.

//Create VAO, VBO

unsigned vaoId, vboId;
int positionAttributeLocation;
float vertices[] = ...vertex data here...;
unsigned indices[] = ...index data here...;

positionAttributeLocation = glGetAttribLocation(programId, "position");

glGenVertexArrays(1, &vaoId);
glGenBuffers(1, &vboId);

glBindVertexArray(vaoId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(positionAttributeLocation, 3, GL_FLOAT, GL_FALSE, 0, null);
glEnableVertexAttribArray(positionAttributeLocation);

//Create index buffer
unsigned indexId;
glGenBuffers(1, &indexId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glUseProgram(programId);
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(unsigned int), GL_UNSIGNED_INT, null);

不完全是 SSCCE,但我认为这就是所有可能导致问题的代码,而且它几乎是独立的。

【问题讨论】:

您是否尝试过先绘制不带 VBO 的图像?如果可行,那么您可能需要确保您的 GPU 支持 VBO。您可以使用 GLGetInfo 函数检查这一点(我不记得它到底叫什么...) 我的代码在我使用固定功能管道时可以工作,但我已经删除了大部分内容并用着色器/VBO 代码替换了它。我使用的是 OpenGL 3.3,所以我不得不使用 VBO。我确信我的 GPU 支持它们,因为它的驱动程序升级到 OpenGL 4.2 并且 VBO 早在那之前就成为了核心。 3.3 不会强制您使用着色器。兼容性配置文件允许您使用 FFP。 我只是把代码放上去,试图从你的翻译中猜测有太多的误解或细微错误的可能性。查看真正的代码,您所做的工作不会有歧义。 如果您需要帮助,您需要发布SSCCE 代码。不是对您的代码的模糊描述,不是 2 或 3 行,而是足以重现问题的代码。没有它,我们只是在猜测浪费时间。 【参考方案1】:

在调用glGetAttribLocation()/glEnableVertexAttribArray() 之前尝试glUseProgram()

【讨论】:

我实际上是在 glEnableVertexAttribArray() 之前得到它(我必须重构一些代码以使示例简洁),但不是在 glGetAttribLocation() 之前。我怀疑它会影响后者,但我会尝试。顺便说一句,glGetAttribLocation() 是用于 GLSL 的新输入/输出变量的正确调用吗? 我试过一个 OpenGL 调试器,看起来所有的 VBO 东西都在通过。我会四处寻找,看看是否能找到其他可能导致问题的原因。【参考方案2】:

我想通了。通过一些重构,我忘记了正确设置宽度和高度变量,创建了一个 0 x 0 视口。哎呀...

【讨论】:

【参考方案3】:

您的问题很可能在于您的 cg 程序和模型视图空间。

在gldrawarrays之前添加cgGLSetStateMatrixParameter(modelViewMatrix, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);到你的程序中,并在你的cg文件中添加OUT.HPos = mul(ModelViewProj, IN.position);

同时在你的 initcg 部分添加 modelViewMatrix 作为 cg 参数。

我从 cgtoolkit 中的基本 opengl 示例中解决了这个问题,我的渲染功能与您的非常相似,现在在遇到同样的问题后也可以使用。

【讨论】:

以上是关于OpenGL VBO 程序给出黑屏的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 1.1:无法转换为 VBO

OS X OpenGL 3.2 核心(黑屏)

OpenGL glClearColor 总是黑屏

VAO VBO EBO

OpenGL - 在 ubuntu 的线程上创建 vbo?

OpenGL:VAO/VBO 混淆