Articles of vao

帮我理解这个vbo / rotation,以及如何完成opengl c ++

我相当新的opengl,我只是无法弄清楚如何旋转这个vbo / vao在二维空间。 这是我如何绑定我的坐标: float points[] = { 0.0f, 0.10f, 0.0f, -0.10f, -0.10f, 0.0f, 0.10f, -0.10f, 0.0f }; glGenBuffers(1, &points_vbo); glBindBuffer(GL_ARRAY_BUFFER, points_vbo); glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), points, GL_STATIC_DRAW); 我把vbo放在vao [0] glBindBuffer(GL_ARRAY_BUFFER, points_vbo); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 我启用数组 glEnableVertexAttribArray(0); 并打电话画在CPU上 glDrawArrays(GL_TRIANGLES, 0, 3); 在我的着色器中,我加载数组: //glsl shader layout ( location = 0 ) in vec3 […]

OpenGL VAO索引没有正确绘制

我疯了,试图找出为什么我无法使用VAO和索引绘制三角形。 我有一堆的多余的顶点,所以我可以切换我的索引数组来testing绘图。 std::vector<glm::vec3> vertices; //bot left vertices.push_back(glm::vec3(-0.75,0.9,1)); //0 vertices.push_back(glm::vec3(-0.5, 0.9, 1)); //1 vertices.push_back(glm::vec3(-0.25, 0.9, 1)); //2 vertices.push_back(glm::vec3(-0.0, 0.9, 1)); //3 //mid right vertices.push_back(glm::vec3(0.75, 0, 1)); //4 vertices.push_back(glm::vec3(0.5, 0, 1)); //5 vertices.push_back(glm::vec3(0.25, 0, 1)); //6 vertices.push_back(glm::vec3(0.0, 0, 1)); //7 //top left vertices.push_back(glm::vec3(-0.75, -0.9, 1)); //8 vertices.push_back(glm::vec3(-0.5, -0.9, 1)); //9 vertices.push_back(glm::vec3(-0.25, -0.9, 1)); //10 vertices.push_back(glm::vec3(-0.0, -0.9, -1)); […]

使用OpenGL Direct State Access进行实例化,stream式传输到VAO VertexBuffer

如何使用直接状态访问stream到顶点缓冲区? 我想每帧更新我的matrix的顶点缓冲区,所以我可以在我的着色器中使用它。 这是我如何指定我的缓冲区。 我在我的应用程序中做了一次,当我初始化我的VAO。 glNamedBufferStorage(StaticModelData::instanceDataID, sizeof(InstanceData)*10, nullptr, 0); glMapNamedBufferRange(StaticModelData::instanceDataID, 0, sizeof(InstanceData) * 10, GL_MAP_UNSYNCHRONIZED_BIT); glVertexArrayVertexBuffer(StaticModelData::vaoID, 1, StaticModelData::instanceDataID, 0, 0); glVertexArrayAttribBinding(StaticModelData::vaoID, 3, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 3, 4, GL_FLOAT, GL_FALSE, 0); glVertexArrayAttribBinding(StaticModelData::vaoID, 4, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 4, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4); glVertexArrayAttribBinding(StaticModelData::vaoID, 5, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 5, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 8); glVertexArrayAttribBinding(StaticModelData::vaoID, 6, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 6, […]

为每个块存储体素游戏1 VAO和VBO或1的渲染数据

我有一个Minecraft风格体素游戏与放置和挖掘块。 它在我的电脑上以400+ fps运行,但是当我join半透明水时,它开始以〜40fps的速度运行。 所以每帧的时间增加了0.0175s或者以前的8倍。 我现在正在做的是每个块有一个VAO和VBO,每当一个块被改变或加载时,它会find所有的非被遮挡的块,并把它们的位置放到块中的另一个缓冲区中。 那么我使用实例来渲染一个绘制调用的整个块,所以我正在做的每一帧~300个绘制调用。 一旦我添加了水(使用与订单无关的透明度http://www.openglsuperbible.com/2013/08/20/is-order-independent-transparency-really-necessary/ )我个别地调用gldrawelements()为每个可见的水如果一半的可见区域是海洋,那么9000左右的区域就是这样。 我知道使用这些块的实例会有所帮助,但是对于每个块和每个块只有几百块的600多个缓冲区,我有2个VAO。 有没有更好的方法来组织这些事情。

OpenGL – 更新VAO数组缓冲区范围

我正尝试将数据stream式传输到一个缓冲区,该缓冲区已绑定到要通过着色器中的顶点属性访问的VAO顶点缓冲区绑定点。 通常我stream到我已经绑定为GL_UNIFORM_BUFFER的缓冲区,我这样做: //create an immutable data storage glNamedBufferStorage(uboID, capacity, data, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); //map entire storage forever mappedPtr = glMapNamedBufferRange(uboID, 0, capacity, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); //bind buffer to target(GL_UNIFORM_BUFFER) binding point glBindBufferBase(GL_UNIFORM_BUFFER, uboBinding, uboID); //bind shader interface block to target binding point glUniformBlockBinding(shaderProgramID, blockIndex, uboBinding); 现在统一块可以在着色器程序中访问,我可以像这样stream: //copy data to mapped pointer […]

OpenGL如何知道要绘制哪个缓冲区?

我一直在尝试一些OpenGL的东西,想知道的东西: OpenGL如何知道在glDrawElements时要绘制哪个缓冲区(因为有三个)? 这是一个代码片段(来自教程): // Use our shader glUseProgram(programID); glm::vec3 lightPos = glm::vec3(4,4,4); glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z); glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]); // This one doesn't change between objects, so this can be done once for all objects that use "programID" glm::mat4 ModelMatrix1 = glm::mat4(1.0); glm::mat4 MVP1 = ProjectionMatrix * ViewMatrix * ModelMatrix1; // Send our transformation […]

VAO和纹理坐标体素渲染的最佳策略?

我正在做一个游戏,用OpenGL渲染大量的立方体(体素)。 所有的立方体都具有相同的几何形状(所以我可以重新使用顶点位置VBO),并使用一个单一的精灵板材纹理。 这意味着纹理坐标将不得不根据所使用的精灵来改变立方体。 立方体的所有六边将使用相同的精灵(换言之,相同的纹理坐标)。 现在,用现代的OpenGL渲染器来解决这个问题的最佳策略是什么? 我提出了两种可能性: 创建与精灵表中的立方体精灵一样多的VAO。 将相同的顶点位置VBO绑定到它们全部,但是不同的纹理坐标VBO(根据要显示的纹理的sprite /部分)。 在我的具体情况下,这将产生大约600个不同的纹理坐标的VBO,因此600个VAO。 只创建一个VAO。 以通用的方式设置纹理坐标VBO(例如0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 )。 在渲染循环中,将实际纹理坐标(只有4个值)作为统一variables发送给着色器。 在着色器中,可以使用通用的纹理坐标来确定应该使用统一的四个值中的哪两个。 还有其他的可能性,我错过了? 什么是最好的performance?

glBindVertexArray GL_INVALID_OPERATION尽管glGenVertexArrays()

所以我一直在试图创建一个更简单的方法来绘制多边形,并遇到以下问题: 当我调用glBindVertexArray(m_VAO); 它会抛出一个GL_INVALID_OPERATION即使我以前调用过这些函数: glGenVertexArrays(1, &m_VAO); glBindVertexArray(m_VAO); 为什么会这样呢? 这个错误的唯一描述正式是我没有拨打上面的行。 这里是任何相关部分的来源。 请注意,我有这个错误后popup错误,但可能是因为这个当前的错误。 Polygon::Polygon(const std::vector<GLfloat>& vertexArray, const char* vertShaderPath, const char* fragShaderPath) :m_vertexArray(vertexArray) { // Created and linked shaders here… // … // … // Generate and bind vertex array object. glGenVertexArrays(1, &m_VAO); glBindVertexArray(m_VAO); // Generate and bind vertex buffer object. glGenBuffers(1, &m_VBO); glBindBuffer(GL_ARRAY_BUFFER, m_VBO); //Send verticies to […]

为什么glBindVertexArray有时会失败(但大多不)?

快速提纲: 加载和显示大(3k x 4k)16位灰度图像(大约32MB)的testing程序。 使用现代OpenGL(例如3.3或更高版本)着色器VBO VAO等 在Windows上运行与OpenTK(WinForms里面的WPF) – C# 在ATI FireGL和Nvidia Quadro FX上开发 使用MipMapping 我的testing程序实际上工作得很好(好像我没有太大的错误)。 我写了一个负载testing来发现线程错误和资源泄漏。 因此,在加载和closures查看器及其图像的过程中,零星地glBindVertexArray()在一个查看器实例中失败并且在另一查看器实例中工作。 说:不同的OpenGL上下文,相同的graphics卡,相同的进程,相同的线程。 在视觉上,我看到我的OpenGL HWND充满了红十字和红色的框架。 失败的观众越来越多。 从来不less人仍然继续工作。 我的背景加载纹理当前被禁用。 所以线程问题应该超出范围。 在绘制之前,我将“MakeCurrent()”作为上下文。 至于WPF法则,我所有的Viewers都在同一个UI线程中工作。 (那就是我所想的) 那么,什么是错的? 这似乎不像一个资源问题…因为问题变得更多的运行时间。 但是,为什么glBindVertexArray()失败的原因是什么? 我的工作stream程应该大部分时间都可以。 那么在我打电话之前,我有什么数据操作glFlush() ? 其实我试图添加一个glFlush()之前,但它没有解决它。 我的程序stream程有点复杂的OO模式,但基本归结为: 创建VAO: int a =GL.GenVertexArray(); GL.BindVertexArray(a); int b1= GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, b1); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(BufferSize), data, BufferUsageHint.StaticDraw); int b2= GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, b2); GL.BufferData(BufferTarget.ArrayBuffer, […]

我的GLSL Shader对象/包装器应该封装加载/设置VertexArrayObject吗?

我正在用C ++进行2D游戏,在OpenGL上有一个简单的渲染层。 我有一个GLSL着色器和着色器程序的包装器,这些包装器将着色器对象封装到C ++类中,并自动处理加载/编译/链接和使用着色器程序。 在我看来,VertexArrayObjects基本上是一个configuration设置的集合,用于特定的ShaderProgram。 我的问题是:我应该封装VAO的我的ShaderProgram对象,或在Sprite对象? VAO是以每个着色器为基础进行更改还是需要为每个可绘制对象types创建一个新的VAO? 如果是后者,是否需要一个VAO来绘制所有的精灵(每个精灵包含4个顶点,一个位置/方向等),还是每个精灵对象在游戏中都有一个VAO?