- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在关于 OpenGL 3.0+ 的教程中,我们以这种方式创建顶点数组对象和顶点缓冲区对象:
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
在这里,VAO 是一个unsigned int
(GLuint
),我们在函数glGenVertexArray
中将它的地址传递给它。但是,根据文档,该函数的第二个参数应该是 array of unsigned int
(GLuint*
)。 VBO 和 glGenBuffers
也是如此。我不明白为什么上面的代码可以使用这样的参数。
我已经尝试用这个替换上面的代码(并在我的代码的其他地方做必要的修改):
GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
它编译并执行,但我得到了一个意想不到的行为:我的纹理矩形使用第一种语法呈现,而不是第二种语法。我也不明白为什么会这样。
编辑:谢谢。如前所述,第二个代码中存在索引错误。
最佳答案
规范中的函数签名是:
void glGenVertexArrays( GLsizei n,
GLuint *arrays);
因此 arrays
需要一个 GLuint
pointer 可以有效写入 n * sizeof(GLuint)
字节的数据。
可以这样写:
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
因为 glGenVertexArrays
想要一个指向 GLuint
的指针,其中写入 n * sizeof(GLuint)
字节的数据是有效的 (在你的情况下 1
) 并且因为 VAO
可以保存这个数据量,所以这样写是正确的。如果您每次调用仅创建一个 ID,则更可取。
正如其他人所说,数组中的第一个元素的索引为 0
。就此而言,它必须是:
GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
如果你想在一次调用中创建更多元素,你想使用 std::array
而不是 []
。
std::array<GLuint,3> VAOs;
std::array<GLuint,3> VBOs;
glGenVertexArrays(VAOs.size(), &VAOs[0]);
glGenBuffers(VBOs.size(), &VBOs[0]);
注意 unsigned int
和 GLuint
不一定是相同的类型或大小,unsigned int
有一个最小保证数字范围,但是大小在不同的平台上仍然会有所不同。另一方面,GLuint
具有定义的大小。
关于c++ - glGenVertexArrays 和 glGenBuffers 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45860198/
我试图使用 1 个数组作为 init() 函数来创建 5 个顶点数组对象 (vao)。 但是,glGenVertexArrays( 5, &vao ) 向我抛出一个错误,我不明白为什么会这样。 我想我
我对生成/创建顶点数组对象 (VAO) 的观点感到困惑: glGenVertexArrays(GLsizei n, GLuint *arrays); 和 glBindVertexArray(GLuin
我和我的 friend 正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个C++类,每个ModelObject都有一个GLuint vao作为成员变量。然后
我现在正在使用 SDL、glew 和 glm 使用 C++ 学习 OpenGL。我已经到了“VAO 和 VBO”阶段。但是,我收到一个错误。当我运行我的程序时,我得到一个异常:LearningOpen
我在解决这个问题时遇到了一些麻烦。我在 mac os x 10.9 上使用 cmake 构建了我的 SDL opengl 应用程序,它可以很好地处理这个包含 header #if defined(__
我正在尝试学习如何在 opengl 中编程并且正在使用 this tutorial .教程 1 工作正常,教程 2 崩溃并返回 1。 它失败了: GLuint VertexArrayID; glGen
我正在尝试在 Mac OS 上将“现代”OpenGL (3+) 与 SDL 2.0.3 和 C++ 一起使用,如果我直接调用 OpenGL 函数它就可以工作,但是一旦我尝试将它包装在一个类中这是行不通
我正在尝试自己学习 openGL,所以我买了一本关于 openGL 的书,第一章是示例代码,所以我尝试了一下,但出了点问题。在第 17(glGenVertexArrays(NumVAOs, VAOs)
我正在尝试运行一个简单的 OpenGL 程序,但我无法让它显示任何内容。我在 Mac 上使用 Swift,虽然我对 Windows 上的 OpenGL 有丰富的经验,但我对这两者都不熟悉。程序运行良好
我正在尝试使用顶点数组对象在 opengl 中渲染立方体。相同的代码适用于 linux 机器,但不适用于 Windows 机器。使用 glGenVertexArrays 和 glBindVertexA
因为我已经在 java 上使用 opengl 进行编程,所以我尝试使用 Visual Studio 2015 Community 切换到 c++ 我目前安装了 opengl 版本 4.5 (cout
我正在尝试在我的 Mac (10.11.5) 上的 PyOpenGL 上运行 glGenVertexArrays。它没有找到它。 问题似乎出在我的 Mac (?) 支持的 OpenGL 版本上。我试图
在关于 OpenGL 3.0+ 的教程中,我们以这种方式创建顶点数组对象和顶点缓冲区对象: GLuint VAO, VBO; glGenVertexArrays(1, &VAO); glGenBuff
我的 gdb 回溯给出: (gdb) backtrace #0 0x00000000 in ?? () #1 0x0804a211 in init () at example1.cpp:147 #
我写了一个小程序,应该用 OpenGL 4.3 显示几个立方体。我使用 SDL 2.0 创建上下文,但我认为我的问题不在于此。 我有一个 Cube 类,它有几个属性,包括用于顶点数组的 GLuint
我正在尝试将 VertexArray 与 Android NDK 一起用于一个已经编译正常并且使用其他 Open GL ES 调用正常的项目。出于这个问题的目的,让我们单独讨论调用“glGenVert
在尝试使用“现代”OpenGL(基本上是 3.2+)时,我在使用 GLFW、GLEW 和 OpenGL 运行基本代码(源自 here 和 here)时遇到了一些麻烦。 我的第一个问题是使用以下代码:
全部,在使用 glGenVertexArrays() 时遇到困难。我收到以下错误: Exception in thread "main" java.lang.IllegalStateException
我在下面有下面的测试代码,我试图让一个基本的 opengl Gtk3 GLArea 示例工作。 下面的错误目前是我的症结所在,从我读到的内容来看,这可能意味着这些功能对上下文不可用,但阅读有关 GLA
我正在制作一个 WebGL 程序并需要 GL 函数 glGenVertexArrays 和 glBindVertexArrays。有人知道 WebGL 中是否有这些等价物吗?这是我到目前为止所拥有的:
我是一名优秀的程序员,十分优秀!