C 基本顶点缓冲区示例不工作
我将要实现一个非常基本的渲染模块。现在是时候改变旧的方式来渲染原语到现代的方法使用VBO,到目前为止,我知道它是如何工作的,但我不能让我的PoC工作 加载基本模型(三角形)时不会生成opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏): 在主回路(图纸部分)中: 新绘图零件:(删除不必要的clientstate和绑定) 但是什么也没有显示。我曾尝试更改配置文件和OpenGL版本,但出现了其他问题。 我可以用老方法画一个简单的三角形:C 基本顶点缓冲区示例不工作,c,opengl,C,Opengl,我将要实现一个非常基本的渲染模块。现在是时候改变旧的方式来渲染原语到现代的方法使用VBO,到目前为止,我知道它是如何工作的,但我不能让我的PoC工作 加载基本模型(三角形)时不会生成opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏): 在主回路(图纸部分)中: 新绘图零件:(删除不必要的clientstate和绑定) 但是什么也没有显示。我曾尝试更改配置文件和OpenGL版本,但出现了其他问题。 我可以用老方法画一个简单的三角形: glBeg
glBegin(GL_TRIANGLES);
glVertex3f( -1.0f, -1.0f, -5.0f);
glVertex3f( -1.0f, 1.0f, -5.0f);
glVertex3f( 1.0f, 1.0f,-5.0f);
glEnd();
问:我做错了什么?有一些激活与VBO和VAO有关
附加问题:为什么在使用open gl 4.1 Core profile时,我无法通过genVertexArray获得VAO名称?(表示操作无效)有几件事:
glEnableClientState
已弃用glEnableClientState
用于告诉OpenGL您正在使用一个顶点数组来实现您不再使用的固定函数功能,因此调用该函数是没有用的(可能会导致奇怪的结果)GlenableVertexAttributeArray(0)代码>无需在绘图功能中再次启用它。启用第0个顶点属性存储在VAO中
glBindBuffer(GL_数组_BUFFER,map_VBO)代码>此外,无需在绘图函数中调用此函数glvertexattributepointer
在配置VAO时存储VBO绑定
glEnable/Disable ClientState
函数,记住在您的案例中只需要绑定VAO。我相信你错误的原因是第一点。第2点和第3点只是为了改进代码;) 有几件事:
glEnableClientState
已弃用glEnableClientState
用于告诉OpenGL您正在使用一个顶点数组来实现您不再使用的固定函数功能,因此调用该函数是没有用的(可能会导致奇怪的结果)GlenableVertexAttributeArray(0)代码>无需在绘图功能中再次启用它。启用第0个顶点属性存储在VAO中
glBindBuffer(GL_数组_BUFFER,map_VBO)代码>此外,无需在绘图函数中调用此函数glvertexattributepointer
在配置VAO时存储VBO绑定
因此,删除
glEnable/Disable ClientState
函数,记住在您的案例中只需要绑定VAO。我相信你错误的原因是第一点。第2点和第3点只是为了改进代码;) 您没有将glgenvertexarray
环绕glGenVertexArraysAPPLE
吗?(就像您提到的为glBindVertexArray
所做的那样)
该函数在OS X上的核心配置文件中不存在,您将注意到扩展字符串中明显缺少GL\u APPLE\u vertex\u array\u对象。它存在于传统(2.1)配置文件中,但不存在于核心(3.2+)
在OS X上使用核心配置文件时,您应该#包括
,并调用glGenVertexArrays(…)
而不是glGenVertexArraysAPPLE(…)
只能在OS X上的OpenGL 2.1上下文中调用VertexArray*APPLE
函数,否则会出现GL\u无效\u操作
错误。您没有将GlgenVertexArray
环绕GlgenVertexArray
吗?(就像您提到的为glBindVertexArray
所做的那样)
该函数在OS X上的核心配置文件中不存在,您将注意到扩展字符串中明显缺少GL\u APPLE\u vertex\u array\u对象。它存在于传统(2.1)配置文件中,但不存在于核心(3.2+)
在OS X上使用核心配置文件时,您应该#包括
,并调用glGenVertexArrays(…)
而不是glGenVertexArraysAPPLE(…)
只能在OS X上的OpenGL 2.1上下文中调用VertexArray*APPLE
函数,否则您将得到GL\u无效\u操作
错误。谢谢您的提示,我做了您指出的清理,但我仍然没有三角形。老办法仍然管用。嗯,很有趣。我看到您提到glgenvertexarray
将map\u VAO设置为0。它应该大于1。然后可能会出现GL\u INVALID\u值
错误(请尝试检查该错误)。在这种情况下,map_VAO变量是什么?它是一个不带符号的整数吗?还是一个无符号整数数组?当我使用其他配置文件(4.1内核)时,我在map_VAO中只得到0。这两个变量都是gluintword。您确定正在运行OpenGL核心上下文吗?因为如果是这样,你就不能在你的案例中使用旧的方法。可能是您的上下文被切换到不支持VAOs的遗留上下文(如果您没有明确指定核心配置文件,Mac OS X会这样做)。否则,我不知道是什么导致了错误。编辑:我看到了Andon M.Coleman,他刚刚为这个具体案例创建了一个答案:按照他的指示,你应该得到你的三角形:)谢谢你的提示,我做了你指出的清洁工作,但我仍然没有我的三角形。老办法仍然管用。嗯,很有趣。我看到您提到glgenvertexarray
将map\u VAO设置为0。它应该大于1。然后可能会出现GL\u INVALID\u值
错误(请尝试检查该错误)。在这种情况下,map_VAO变量是什么?它是一个不带符号的整数吗?还是一个无符号整数数组?当我使用其他配置文件(4.1内核)时,我在map_VAO中只得到0。这两个变量都是gluintword。您确定正在运行OpenGL核心上下文吗?因为如果是这样,你就不能在你的案例中使用旧的方法。可能是您的上下文被切换到不支持VAOs的遗留上下文(如果您没有明确指定cor,Mac OS X会这样做)
// .. clear buffers load identity etc...
glColor3f(0.33f,0.0f,0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, map_VBO);
glBindVertexArrayAPPLE(map_VAO);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0 );
glBindVertexArrayAPPLE(0);
glDisableClientState(GL_VERTEX_ARRAY);
glColor3f(0.33f,0.0f,0.0f);
glBindVertexArrayAPPLE(map_VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBegin(GL_TRIANGLES);
glVertex3f( -1.0f, -1.0f, -5.0f);
glVertex3f( -1.0f, 1.0f, -5.0f);
glVertex3f( 1.0f, 1.0f,-5.0f);
glEnd();