Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 基本顶点缓冲区示例不工作_C_Opengl - Fatal编程技术网

C 基本顶点缓冲区示例不工作

C 基本顶点缓冲区示例不工作,c,opengl,C,Opengl,我将要实现一个非常基本的渲染模块。现在是时候改变旧的方式来渲染原语到现代的方法使用VBO,到目前为止,我知道它是如何工作的,但我不能让我的PoC工作 加载基本模型(三角形)时不会生成opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏): 在主回路(图纸部分)中: 新绘图零件:(删除不必要的clientstate和绑定) 但是什么也没有显示。我曾尝试更改配置文件和OpenGL版本,但出现了其他问题。 我可以用老方法画一个简单的三角形: glBeg

我将要实现一个非常基本的渲染模块。现在是时候改变旧的方式来渲染原语到现代的方法使用VBO,到目前为止,我知道它是如何工作的,但我不能让我的PoC工作

加载基本模型(三角形)时不会生成opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏):

在主回路(图纸部分)中:

新绘图零件:(删除不必要的clientstate和绑定)

但是什么也没有显示。我曾尝试更改配置文件和OpenGL版本,但出现了其他问题。 我可以用老方法画一个简单的三角形:

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();