经过多年的关于顶点缓冲区对象(VBOs)的听取,我终于决定尝试一下(我的东西通常不是性能的关键,显然…) 我将在下面描述我的实验,但是为了简单起见,我在“简单”直接模式(glBegin()/ glEnd()),顶点数组(CPU端)和VBO(GPU端)之间看到了难以区分的性能,渲染模式。 我想明白为什么会这样,在什么样的条件下,我可以期望看到维也纳各组织显着地超越了他们原始的双关语的祖先。 实验细节 对于实验,我生成了大量点的(静态)三维高斯云。 每个点都有与之相关的顶点和颜色信息。 然后,我以相当的“轨道”行为在相继的帧中围绕云端旋转相机。 再次,点是静态的,只有眼睛移动(通过gluLookAt())。 数据在任何渲染之前生成一次,并存储在两个数组中以用于渲染循环。 对于直接渲染,整个数据集呈现在单个glBegin()/ glEnd()块中,每个glColor3fv()和glVertex3fv()都包含一个单独的调用。 对于顶点数组和VBO渲染,整个数据集都是用一个glDrawArrays()调用渲染的。 然后,我简单地运行一分钟左右,然后用高性能定时器测量平均FPS。 性能结果## 如上所述,我的台式机(XP x64,8GB RAM,512 MB Quadro 1700)和我的笔记本电脑(XP32,4GB RAM,256 MB Quadro NVS 110)的性能无法区分。 然而,它的确按照预期的分数进行了缩放。 显然,我也禁用了vsync。 笔记本电脑运行的具体结果(呈现w / GL_POINTS): 在glBegin()/ glEnd(): 1K点 – > 603 FPS 10K – > 401 FPS 100K – > 97 FPS 1M点 – > 14 FPS 顶点数组(CPU端): 1K点 […]
我刚从本教程开始学习OpenGL: http : //openglbook.com/the-book/ 我到了第二章,画了一个三angular形,除了VAO,我明白了所有的一切(这个缩写是好的吗?)。 教程有这样的代码: glGenVertexArrays(1, &VaoId); glBindVertexArray(VaoId); 虽然我明白代码是必要的,但我不知道它做了什么。 尽pipe我从来没有使用VaoId(除了销毁它),但代码在没有它的情况下不能运行。 我假设这是因为它需要绑定,但我不知道为什么。 这个确切的代码是否需要成为每个OpenGL程序的一部分? 该教程将VAO解释为: 顶点数组对象(或VAO)是描述如何将顶点属性存储在顶点缓冲对象(或VBO)中的对象。 这意味着VAO不是存储顶点数据的实际对象,而是顶点数据的描述符。 顶点属性可以用glVertexAttribPointer函数及其两个姐妹函数glVertexAttribIPointer和glVertexAttribLPointer来描述,我们将在下面探讨其中的第一个。 我不明白VAO如何描述顶点属性。 我没有以任何方式描述它们。 它是否从glVertexAttribpointer获取信息? 我想这一定是它。 VAO只是来自glVertexAttribPointer的信息的目的地吗? 请注意,我接受的教程是否可以接受? 有什么我应该注意的或更好的教程要遵循?
我用C ++编写了一个OpenGL的模型加载器。 我已经使用std::vector来存储我的顶点数据,但是现在我想把它传递给glBufferData() ,但是数据types是非常不同的。 我想知道是否有一种方法来在std::vector之间转换glBufferData()logging的const GLvoid * 。 顶点types typedef struct { float x, y, z; float nx, ny, nz; float u, v; } Vertex; vector<Vertex> vertices; glBufferData()调用 glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW); 我得到以下(预期)的错误: error: cannot convert 'std::vector<Vertex>' to 'const GLvoid*' in argument passing 如何将vector转换为与glBufferData()兼容的types? NB。 我现在不关心正确的内存分配。 vertices.size() * 3 * sizeof(float)最有可能是段错误,但我想先解决types错误。
我正在尝试在Linux环境下开发ES 2.0应用程序。 我的目标GPU是富士通rubyMB86298。 为了优化性能,我决定使用VBO概念。 我对维也纳国际组织是很新的。 我使用VBO渲染基本原始像trinagle和四边形,我没有顶点。 为了使用VBO渲染皇冠,我计算了所有的顶点(大于200)。 现在我发现将这200个顶点的数据发送给VBO是很困难的。我不能手动input所有的顶点数据并将其存储在一个数组中,并将其传递给VBO。 有没有办法将每个for循环的顶点数据(用于冠的顶点计算)发送到VBO? 任何人都可以使用VBO共享在ES 2.0中绘制弧形或圆形的代码片段吗?