Articles of 顶点缓冲区

重用VertexBuffer或新的VertexBuffer对象?

我现在想在directX10中渲染位图字体,而且我想尽可能高效地完成。 因为这个问题,我很难开始devise我的devise。 那么我应该重用一个VertexBuffer还是制作多个VertexBuffer对象? 目前我在程序中为每个Quad对象分配一个dynamic的VertexBuffer。 如果没有任何东西在我的屏幕上移动,我将不必映射/取消映射VertexBuffer。 对于字体,我可以在每个文本框或类似的地方分配一个缓冲区的地方实现类似的方法。 search后,我读了关于重用所有对象的单个VertexBuffer。 顶点caching也出现了。 这有什么优点/缺点,比我以前的方法快吗? 对于最后,还有其他的方法,我应该看看在屏幕上渲染许多二维四边形? 先谢谢你。

如何修复在顶点着色器中碰撞的模型matrix?

我是OpenGL编程的新手,我正在编写一些基本代码来在屏幕上显示一些对象。 我正在显示一个金字塔形状,以及我正在显示的一个框形状。 金字塔形状是一个类(C ++),每个金字塔对象创建它自己的VBO(存储点/颜色)。 盒子也一样。 我遇到的问题是我有两个形状,并使用相同的顶点着色器。 由于我在着色器中为每个对象应用了一个模型matrix,所以模型matrix被设置为一个对象,但是当另一个对象去显示它自己时,它会覆盖前一个对象的模型matrix。 所以只有一个对象在完成显示方法后才有正确的模型matrix。 我也使用分层转换来将对象附加到对方。 我有根对象存储视图/投影matrix,层次结构树的子项存储他们各自的模型转换。 当孩子想要展示自己的时候,它会向上走,计算出自己需要做的所有转换。 这个问题在这里也适用,因为要显示的最后一个孩子将是其模型matrix被应用在顶点着色器中的那个孩子。 我似乎无法弄清楚如何区分MVPmatrix应用于哪个顶点的着色器。 我想我错过了一些非常基本的东西,但我似乎无法弄清楚…任何帮助都会让我的生活变得更轻松! 编辑:是否有可能着色器覆盖glDrawArrays()/ glDrawElements()调用之间的MVPmatrix?

如何在DirectX11 C ++中渲染顶点缓冲区(特别是box2d的b2Draw)

我有所有的DirectX11设备等设置和使用DirectXTK的SpriteBatch和目前试图实现一个b2Draw类来绘制我的box2d物理世界。 我不知道如何渲染b2Draw给我的顶点缓冲区。 我目前的代码, void DebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) { Vertex* vertexData = new Vertex[vertexCount * 3]; for (int i = 0; i < vertexCount; i++) { vertexData[i] = { DirectX::XMFLOAT3(vertices[i].x, vertices[i].y, 0) }; } // Create vertex buffer D3D11_SUBRESOURCE_DATA subresourceData; subresourceData.pSysMem = vertexData; ID3D11Buffer* vertexBuffer; D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = […]

关于SharpDx彩色立方体的问题

最近我开始学习SharpDx,所以我是一个新手。 我尝试创建一个在每个顶点具有不同颜色的立方体,例如下面的图片。 但是,我编码后创建的东西,我不明白,如下图。 我已经检查了我的代码很多时间,但仍然无法找出什么是错的。 我希望有人能为我指出。 非常感谢。 听到是我的代码 InitializeDirectX: int width = renderForm.ClientSize.Width; int height = renderForm.ClientSize.Height; Rational rational = new Rational(60, 1); ModeDescription backBufferDesc = new ModeDescription(width, height, rational, Format.R8G8B8A8_UNorm); SwapChainDescription swapchainDesc = new SwapChainDescription { ModeDescription = backBufferDesc, SampleDescription = new SampleDescription(1, 0), Usage = Usage.RenderTargetOutput, BufferCount = 1, OutputHandle = renderForm.Handle, IsWindowed = […]

与VBOs优化

我目前正在研究一个多维数据集引擎,并遇到一些CPU优化问题。 我将所有的四维VBO数据存储在一个Block(在一个块的x,y,z)类中,它存储在长度为6(最大的立方体面数)的数组中。 我宁愿把它合并到一个VBO中。 我遇到的唯一问题是,我找不到在每张脸上都呈现6种不同纹理的方法。 GL11.glPushMatrix(); GL11.glTranslatef(LENGTH.x * origin.x, LENGTH.y * origin.y, LENGTH.z * origin.z); for (int z = 0; z < LENGTH.z; z++) { for (int y = 0; y < LENGTH.y; y++) { for (int x = 0; x < LENGTH.x; x++) { Block b = get(x, y, z); if (b.getBlockType().isTransparent() || b.getVisibleFaces() == […]

如何创建提供这种模式的顶点缓冲区?

我有一系列的顶点,我想用下面的configuration进行布局,但我还没有能够find如何用square和X模式来做到这一点。 大多数情况下,我通常会看到一个四边形分成两个三角形,通常使用三角形列表。 我怀疑这是使用三角形条,但我不完全确定如何做到这一点。 谁能帮忙?

将波前数据加载到VAO中并进行渲染

我已经成功地将一个三角波前(.obj)加载到6个vector中,前3个vector包含顶点,UV坐标和法线的位置。 最后三个具有为每个面存储的索引。 我一直在考虑使用VAO和VBO来渲染,我不太清楚如何加载和渲染数据。 我最大的担忧之一是索引渲染只允许你有一个索引数组,这意味着我必须使前三个向量的所有大小相同,我想这样做的唯一方法是使3新大小相同的顶点,并加载每个面的数据,但是这将完全破坏索引的目的。 任何帮助,将不胜感激。

每秒创建一次vbo

我有一个VBO在我的游戏中存储一些数据。 事情是,数据可以以大约一秒钟的速度改变。 数据的大小并不固定,这意味着某些对象有时可见,有时不可见,甚至可能有不同的多边形数量。 我想弄清楚如何使用VBOs有效地做到这一点。 在即时模式下,我只是不会调用单个对象的渲染方法,而不会出现! 如果我需要更多的多边形,我会…更经常地调用glVertex2f! 我明白为什么使用即时模式在性能上真的很差,但是我真的不能想到有任何好方法来“建立”VBO。 我想过使用一个列表,将顶点追加到列表中,然后创建vbo,但是我认为这有三个缺点。 更多的CPU密集型,需要更多的内存复制,并需要我每次重新创建(我可以这样做)的VBO,因为我不知道在建立列表之前的大小! 有没有一个常用的方法来建立一个VBO许多小对象而不使用列表? 一些伪代码: void GlobalRender() { foreach (chunk in chunks) { if (chunk.RequiresUpdate) { chunk.UpdateVBO(); //In there, that's where I don't know how large I'll need my VBO to be. } chunk.Render(); } } void UpdateVBO() //The code called above { foreach (node in nodes) { if […]

在游戏引擎中,如何从网格文件中正确获取不同顶点格式的顶点缓冲区?

我是发动机编程的新手。 我有一个如何从网格文件中获取顶点格式的顶点缓冲区的问题。 例如,在OBJ文件或FBX文件中,我们分别保存位置,法线。 所以整个网格文件是不同数组的结构,它们包含顶点的不同属性。 但是,当我们将这些数据提供给显卡时,我们将提供一个顶点结构数组 ,这里的顶点结构包含一个顶点的位置,法线,UV …。 所以,假设我们想从网格文件(数组结构)为不同的着色器生成不同的顶点缓冲区,那么我认为我们可以使用2个解决scheme: 生成不同的结构数组,这里不同的结构将是不同的顶点格式。 问题是:需要大量的内存来保存不同的顶点缓冲区。 生成一个通用的结构数组,这里的结构包含了我们可以从网格文件中获得的所有顶点属性,并使用offset来获得不同顶点格式的正确数据。 问题是:着色器程序访问顶点数据的速度会慢吗? 哪一个是更好的方法? 还是有更好的解决scheme? 再次,我只是一个新鲜的,所以我希望我的描述是足够清楚的问题:-) 非常感谢你!

几何devise和缓冲区

我正在做一些testing渲染的东西,我想知道如何devise我的几何类。 目前,我是这样做的: 初始化:股票数组与阵地,arrays与颜色,数组与法线,…有属性。 就在渲染之前,如果我的几何已经改变,我更新他的顶点缓冲区和索引缓冲区。 要做到这一点,我在这里计算交错数组,并将其发送到我的顶点缓冲区。 我用粒子进行了一些testing(在iPad上10000),最重的函数是“Geometry :: computeInterleavedArray”。 我怎样才能避免这部分? 所有数据已经​​交错的情况下,将几何数据存储在单个数组中是否更好?