Articles of vbo vao

没有VAO和VBO的渲染?

我正试图移植我在PositionBasedDynamics上find的演示。 它有一个通用的函数来完成渲染和他们的示例工作,但是即使他们使用核心OpenGL和着色器,他们也不会生成/绑定任何顶点数组对象或顶点缓冲对象。 function是这样的: template<class PositionData> void Visualization::drawTexturedMesh(const PositionData &pd, const IndexedFaceMesh &mesh, const unsigned int offset, const float * const color, GLuint text) { // draw mesh const unsigned int *faces = mesh.getFaces().data(); const unsigned int nFaces = mesh.numFaces(); const Vector3r *vertexNormals = mesh.getVertexNormals().data(); const Vector2r *uvs = mesh.getUVs().data(); std::cout << nFaces << std::endl; glBindTexture(GL_TEXTURE_2D, […]

奇怪的行为使用VAO(OpenGL 4.0)

我想用VAO显示一个简单的纹理猴子网格。 这里是渲染部分的代码,首先没有VAO看看我在找什么结果。 Texture *pTexture = meshList[idx]->GetSubMaterial()->getTexture(); VertexBuffer *pVBO = meshList[idx]->GetVertexBuffer(); pVBO->Lock(); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0)); if (pTexture) { glEnableVertexAttribArray(1); glActiveTexture(GL_TEXTURE0); pTexture->Lock(); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(pVBO->GetVerticesByteSize(VERTEX_POSITION))); } glEnableVertexAttribArray(2); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER( (pVBO->GetVerticesByteSize(VERTEX_POSITION) + pVBO->GetVerticesByteSize(VERTEX_TEXTURE)))); pVBO->Unlock(); glDrawArrays(GL_TRIANGLES, 0, meshList[idx]->GetVertexBuffer()->GetBufferSize()); 这里是输出: 正如你所看到的,纹理映射是正确的。 现在我想把上面的代码实现到VAO中。 所以我将它置换到主循环之前(所以不在我的渲染系统中)并将其复制到我的Mesh类(模型类)的初始化中。 这里是Mesh类的头(只是看这个类的组成,属性等等): class Mesh : public Resource […]

我应该如何创建一个通用的场景对象来管理VBO数据?

为了简化使用不同的着色器和纹理来管理多种types的数据,我想创建一个通用的Scene对象(是否有这个名称?),这将允许我预先configuration我想要渲染的东西,以及数据如何变化。 让我举个例子: 下面的所有内容都是2D自上而下的游戏 有些部分是完全静态的,例如背景,几何形状也不会改变。 然后会有一个“NPC”层,几乎每一个帧都可以改变,使用不同的着色器。 最后但并非最不重要的,还有一个UI层,它位于其他的一切之上。 这些部分中的一些可能会被拆分成多个子部分,比如部分呈现为GL_TRIANGLE_FAN ,其他部分呈现为GL_LINE_STRIP等。为了避免重复大量的设置/生成几何/渲染阶段,将其包含在可以configuration,如: Scene s; Batch b1 = s.create_batch(somehow_specify_shaders_etc); generate_background_geometry(b1); Batch b2 = s.create_batch(somehow_specify_other_shaders_and_VAO); // game loop while (true) { // this would generate/update the NPC geometry on the fly b2.process_input(gather_user_input()); for (Batch b: s) b.render(); } 现在如果我想为每个批次指定不同的纹理绑定呢? 或不同的着色器? 有没有像这样管理几何数据的一般模式?

将弃用的OpenGL移植到“现代”问题

关于我以前的问题: 没有VAO和VBO的渲染? 我开始意识到,我已经完全摆脱了现代OpenGL与VAO和VBO的例子。 所以他们的渲染function是这样的: void renderTriangleModels() { // Draw simulation model const ParticleData &pd = model.getParticles(); float surfaceColor[4] = { 0.2f, 0.5f, 1.0f, 1 }; if (shader) { shader->begin(); glUniform3fv(shader->getUniform("surface_color"), 1, surfaceColor); glUniform1f(shader->getUniform("shininess"), 5.0f); glUniform1f(shader->getUniform("specular_factor"), 0.2f); GLfloat matrix[16]; glGetFloatv(GL_MODELVIEW_MATRIX, matrix); glUniformMatrix4fv(shader->getUniform("modelview_matrix"), 1, GL_FALSE, matrix); GLfloat pmatrix[16]; glGetFloatv(GL_PROJECTION_MATRIX, pmatrix); glUniformMatrix4fv(shader->getUniform("projection_matrix"), 1, GL_FALSE, pmatrix); } for (unsigned […]

困惑于我应该如何使用OpenGL在2D游戏中组织我的代码

我刚刚开始学习OpenGL,我感到非常困惑和困惑。 我不想过早地优化事情,但是我也不会对我还不完全理解的事情做出决定。 问题1:我知道即时模式与在OpenGL中使用VBO相比是原始的和慢的,但是对于2D游戏来说,它有多重要,除非我开始渲染数以万计的精灵? 在哪一点上,它真的certificate了必须经历现代OpenGL所有这些繁琐过程的麻烦? (我知道现代的OpenGL是一个更好的做法,我只是合法好奇!) 问题2:我正在制作一个2D游戏,它将实现粒子,几个精灵,射线阴影和一些混合技巧。 我的问题是,我为每个精灵保留一个VAO和VBO,还是在一个VBO / VAO中创建所有精灵? 如果是这样,我该怎么做,我的代码应该如何构造? 我很困惑,我应该如何批量平局。 问题3:交换着色器是否非常昂贵? 我如何处理多个着色器? 我想过把对象分类,然后把具有相同着色器的那些对象拼接在一起进行绘制,所以我不必更换着色器,但是我不确定这是否值得一提。

VBO何时应该解除绑定?

searchVAO和VBO我在这里和这里阅读,我可以select性地取消绑定,以避免意外修改,所以我试了一下。 问题是解除绑定VBO导致访问冲突时调用glDrawElements,我不明白为什么我得到这种行为。 int main(int argc, char *argv[]) { if (!glfwInit()) { return -1; } GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { return -1; } GLfloat vertices[] = { -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right 0.5f, -0.5f, 0.0f, […]

性能glDrawElements与glDrawRangeElements与glDrawArrays

我在网上浏览过,试图find一个很好的答案,但无法find一个。 不同的论坛提到驱动程序错误等等,但是这些讨论通常已经有10年了,所以现在应该可以修复错误了。 所以,这个问题! 我正在绘制一个由628 008个顶点,法线和纹理坐标组成的网格。 我也有网格索引,但索引是最糟糕的一种索引:它们不重复使用顶点,但实际上只是按顺序(或接近)列出顶点。 所以我们也有628 008个指数。 是的,我可以重新写这个来重新使用顶点,但这不是我的问题所在。 在VAO中使用VBO(顶点,法线,纹理坐标)绘制网格,并使用两个不同的着色器:一个用于纹理网格的一部分,另一个着色器用于另一个非纹理部分。 为此,我使用OBJ格式和材料组(从Blender导出)。 网格划分为材料组,描述哪些材料应绘制一批指标。 VBO被设置为GL_STATIC_DRAW,因为它永远不会改变。 然后我遍历材料组并绘制每组中描述的指标范围,如下所示: for( const auto& group : mesh) if( group should use texturing ) { enable texturing shader with phong material set texturing uniforms set material stuff set mvp, etc } else { enable phong material shader set material stuff set mvp, etc […]

OpenGL – 如何使用glVertexAttribPointer绘制每个第三个三角形

我有一个顶点缓冲区。 有些情况下,我不想渲染整个网格,但是让我们说网格的每个三角形。 我正在使用VAO和VBO。 我在缓冲区中的数据是这样的: first triangle indx seciond triangle indx 0 1 2 3 4 5 6 7 8 | 9 10 11 12 13 14 15 16 17 … 我想要做的是 – 渲染第一个三角形,然后跳过第二个,然后渲染3D等。 可以通过调整glVertexAttribPointer()来完成,还是有一些其他的gl方法可以像这样操纵数据,或者我必须创建一个新的带有跳过三角形的缓冲区?

在graphics引擎中管理VBO / VAO

我正在试图制作一个2Dgraphics引擎来训练我。 我实际上是通过即时绘制来实现的,而且我在外面制作了渲染器(所以我可以在OpenGL和DirectX之间切换)。 我怎样才能管理顶点缓冲区对象和顶点数组对象? 我已经做了一个几何对象,我不认为VBO和VAO需要在这里。 我的渲染者管理这个场景的工作是? (在一个大的VBO组对象,隐藏在屏幕外的对象,按透明度sorting对象…) 更多关于我的架构的解释: 空间:包含空间元素的空间元素(如节点)。 网格:具有几何和材质的对象 场景:管理空间元素(如网格)和灯光。 渲染器:绘制给定的场景(网格和灯光) 我应该在哪里管理缓冲区(索引缓冲区,顶点对象缓冲区和顶点数组缓冲区)? 首先,我开始把它们放在几何类中,但是看起来很明显,因为一个缓冲区可以存放多个几何对象。 所以,我正在考虑将缓冲区放入缓冲区管理器(在场景对象中) – >场景可以管理网格物体(顺序+静态/dynamic重新组合缓冲区)。 你怎么看? 谢谢!

OpenGL VBO和VAO混淆

我想在这里提出我关于维也纳各组织和维和部队的问题。 基本上根据我的理解,你可以拥有不同的VAO,每个VAO可以包含多个VBO,并绑定到VAO的ID,你可以从VBO里面存储的VBO中抽取。 我写了一个简单的类,读取一个obj文件,然后创建顶点,法线和uvsvector列表,并上传3个VBO(vboID 1,2和3) void Model::loadToVBO() { glGenVertexArrays(1, &vaoID); glBindVertexArray(this->vaoID); glBindBuffer(GL_ARRAY_BUFFER, vertexID); glBufferData(GL_ARRAY_BUFFER, this->vertices.size()*sizeof(vec3), &this->vertices[0], GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, normalID); glBufferData(GL_ARRAY_BUFFER, this->normals.size()*sizeof(vec3), &this->normals[0], GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, uvcoordID); glBufferData(GL_ARRAY_BUFFER, this->uvs.size()*sizeof(vec2), &this->uvs[0], GL_STATIC_DRAW); glBindVertexArray(0); } 如果我在渲染函数中这样做,我尝试绑定到vaoID,并绘制元素,但它不会工作。 为了使它工作,我必须在渲染函数的每一帧RELOAD vbo数据(这是因为我有2个模型的每个模型的构造函数调用loadVBO,显然第二个模型覆盖了第一个vbo的1,2和3 ID位置(我假设从第一个对象生成的vao将与第二个模型生成的vao完全分离,并且每个vao都将拥有自己的3个VBO),所以也许我的代码并没有正确设置VAOs,读了一些关于如何使用glEnableVertexAttribArray和glVertexAttribPointer设置当前vbo状态到vao,但不能很好地理解它。也许因为我使用相同的函数绑定到着色器variables…. 下面的代码在着色器类中,它将vbo数据加载到着色器的variables中 void StaticShader::loadAttribute(GLuint bufferID, string variable, GLuint size) { GLuint variableID; variableID = glGetAttribLocation(this->shaderProgramID, variable.c_str()); glBindBuffer(GL_ARRAY_BUFFER, bufferID); glEnableVertexAttribArray(variableID); glVertexAttribPointer(variableID, size, GL_FLOAT, […]