问题标签 [vertex-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1750 浏览

c++ - Directx10,实例化渲染,顶点缓冲输入

因此,我尝试在 DirectX10 中使用简单的着色器进行硬件实例化,其中顶点结构为顶点获取位置、纹理坐标和法线,为实例获取模型矩阵。问题是创建将数据发送到着色器中的模型矩阵的输入布局。使用 PIX 进行调试表明矩阵只得到无意义的值。

相关代码:

输入布局

着色器结构

缓冲器

绘制调用

m_instanceData 是一个向量,其中包含每个实例的 D3DXMATRIX。看过 SDK 附带的示例,我们的输入布局似乎看起来相同,但矩阵没有正确传输?

我目前只是发送一个单位矩阵作为模型矩阵用于测试目的,但它显示为完全不同的东西。我已经检查过,一旦我初始化实例缓冲区,数据就肯定在向量中。

Edit1:将 BuildInstanceBuffer() 方法更改为

第二次编辑:猜猜这有点不成熟。似乎我在着色器中的模型矩阵正在“正确”填充,因为每一行在正确的点上都有一个值。但那个值仍然不是我要传递的值。

老实说,这每分钟都变得陌生了。当我在 Visual Studio 中调试程序时,我得到一个绿色网格。在 PIX 中,它显示为黑色。我真的可以使用这个帮助,我不知道现在发生了什么。

0 投票
3 回答
1330 浏览

opengl - OpenGL:很多小型 VBO 可以吗?

我有很多对象,但我希望这些对象之一(鼠标悬停的那个)“发光”(快速改变颜色)。

因此,一种方法是让每个对象都有自己的 VBO。我不会有颜色数组。然后我会有一千个 VBO,每个都有大约 20 个四边形......如果它是选定的对象,我将在它之前调用 glColor3f(blah,blah,blah),否则它将是默认颜色。

另一种方法是将它们全部放在一个大 VBO 中。我将有一个颜色数组。然后我会非常频繁地将 glBufferSubDataARB 放入颜色数组中,以使一个对象发光。

哪种方式更好,为什么?如果两种方式都不好,也建议另一种方式。

0 投票
3 回答
2750 浏览

ios5 - 在 Open GL ES 2.0 (iOS GLKit) 中处理多个网格?

我已经设法使用 iOS 的 GLKit 在 Open GL ES 2.0 中创建了一个网格。我想不通的是如何创建第二个网格,它看起来与第一个网格相同,只是位置不同。

我认为如果有人可以简单地提供一些绘制多个网格的示例代码,那将是最有帮助的,因为我认为我这样做完全错误。尽管如此,这里列出了我为尝试完成这项工作所做的工作。

  • 我创建了两个顶点信息的 C 数组。第一个是我的模板(以 0,0,0 为中心的硬编码坐标),第二个是我想要显示的模板(最初为空)。
  • 我创建了两个索引信息的 C 数组。与顶点信息的处理相同。
  • 我有两个全局变量 int,vertexCount 和 indiceCount,最初都是 0。
  • 我有 ac 函数 createAt(float x, float y, float z)。此函数将我的顶点模板复制到我的顶点显示数组中,然后将传入的偏移量应用于每个顶点。它还复制索引并应用偏移量,以便它们指向新的显示顶点。

但这不起作用。只有一个对象被绘制在屏幕上。

查看其他人的问题和答案,听起来可能我应该有多个顶点缓冲区?我不知道; 我非常困惑。

0 投票
1 回答
171 浏览

opengl-es - glBindBuffer 是否会使以前的 gl*Pointer 调用无效?

我想像这样处理我的代码:

这行得通吗?

或者我需要为每个缓冲区调用 gl*Pointer 吗?

0 投票
3 回答
1423 浏览

c++ - OpenGL 基本 IBO/VBO 不工作

我一直在关注此处列出的教程。

我想使用索引缓冲区对象、顶点缓冲区对象、我自己的顶点和片段着色器以及我自己的顶点结构来绘制一个三角形。

我的问题是当我画画时什么都没有出现。我不确定我做错了什么。我的着色器工作正常,我在不使用 ibo/vbo 的情况下测试了它们,它们很好。

这是我的代码:

我没有执行任何视图转换,当我使用更基本的绘制方法时,一切都在镜头前显示得很好。我真的认为这与我声明这些缓冲区的方式有关。

编辑 1:应用程序是双缓冲的。

编辑 2:已解决。3 个顶点 V0、V1 和 V2 都在修改同一个数组元素。如,我没有使用simple_triangle[0], simple_triangle[1], simple_triangle[2],但我只使用simple_triangle[0]. 再次感谢您发现我的愚蠢错误。

0 投票
2 回答
1323 浏览

objective-c - 为什么在 iOS 的 OpenGL ES 中使用 GL_UNSIGNED_SHORT 时会出现 EXC_BAD_ACCESS?

我需要做的是绘制一个包含超过 256 个元素的顶点数组。当我的数量少于这个数量时,我在调用 glDrawElements 时使用了 GL_UNSIGNED_BYTE,一切正常。当我有超过 256 个元素时,它会再次从第一个顶点开始绘制(即,最后一个元素 [256 - 255,无论] 与第一个 [1 或 0] 连接,并且不会绘制更多元素)。如果我改用 GL_UNSIGNED_SHORT,我会得到 EXC_BAD_ACCESS。是什么赋予了?

0 投票
1 回答
1205 浏览

c# - 地形编辑器的 XNA VertexBuffer

我正在从事一个个人项目,与许多 XNA 项目一样,该项目从地形置换贴图开始,该贴图用于生成在Device.DrawIndexedPrimitives()调用中呈现的顶点集合。

我已更新为 custom VertexDeclaration,但我现在无法访问该代码,因此我将发布稍旧但在范式上相同 (?) 的代码。

我将 a 定义VertexBuffer为:

其中“顶点”定义为:

VertexPositionNormalTexture[] vertices

我还有两个在每次 Update() 迭代时交换的索引缓冲区。在Draw()通话中,我设置了GraphicsDevice缓冲区:

忽略我希望不相关的代码行,我有一个方法可以检查边界形状以确定顶点是否在鼠标光标的某个半径内,并根据按下的键升高或降低这些顶点位置。我的问题是VertexBuffer.SetData()在容器类的初始化时只调用一次。

修改VertexPositionNormalTexture[]数组的顶点位置不会反映到屏幕上,尽管顶点位置的值已更改。我相信这与VertexBuffer.SetData()调用有关,但是您不能SetData()在修改顶点数组后简单地调用它。

SetData()在重新检查了 IndexBuffer 的处理方式(2 个缓冲区,有时交换并传入Update())之后,我认为这应该是处理VertexBuffer操作的方式,但这行得通吗?有没有更合适的方法?我在这里看到了对类似问题的另一个参考,但源链接在 MegaUpload 上,所以......

我会尝试我的VertexBuffer.Swap()想法,但我也看到了参考DynamicVertexBuffer并想知道有什么收获?性能据说会受到影响,但是对于地形编辑器,如果我可以动态地操作顶点数据,我认为这不是太大的权衡。

我可以发布更多代码,但我认为这可能是对设备缓冲区的设置方式或数据流式传输方式缺乏了解。

编辑:下面提出的解决方案是正确的。我会尽快发布我的代码。

0 投票
1 回答
5025 浏览

opengl - OpenGL——一次渲染多个网格,带有单独的变换

我正在寻找一种同时渲染多个网格的方法,这样我就不必为每个网格发出绘制调用。我在这里处理的是 2D 渲染,一个典型的对象,比如一个正方形,里面可能只有两个三角形。但是,一个对象也可能非常复杂,并且有数千个三角形。

现在每个对象都可以自行移动。从概念上讲,为每个“对象”设置一个 VBO(或 VBO/IBO 对)是完全合理的:只要对象不变,我每帧都需要上传到 GPU 的只是变换信息:一个位置向量和一个方向值。或者,等效地,一个变换矩阵。

但是这种方法的问题在于,对于 1000 个方形对象的场景,我需要初始化 1000 个 VBO 和 1000 个 IBO,并且 1000 个绘制调用每帧设置 1000 套制服以渲染 2000 个三角形。

好的。如果所有这些对象都相同,我可以有一个 VBO/IBO 来描述它们,设置一个统一缓冲区对象(或者统一数组更合适——我仍然需要学习如何使用这些)和转换数据它们中的每一个,并发出一个实例化绘制调用,让顶点着色器通过使用它接收到的实例编号从 UBO 中提取转换数据。伟大的。

我只想更进一步。我想做相当于在不相同的网格上实例化的事情:我有 1000 个不同的对象,我很乐意在 1000 个单独的顶点/索引缓冲区对或一对巨大的顶点/索引缓冲区中描述它们。我想一次性将他们的转换数据发送到 GPU。只需让驱动程序/GPU 绑定或选择正确的顶点即可。

这可以做到吗?可以在不使用 SM4 几何着色器的情况下完成吗?

更新:我只是想到了一种潜在的方法来实现这一点。我使用顶点属性作为我的“实例化”值,用它来索引包含转换的 UBO。这是这样做的方法吗?

0 投票
1 回答
960 浏览

opengl - 是否可以在顶点着色器中循环第二个 VBO?

所以,假设我有两个顶点缓冲区。一个描述我想要绘制的实际形状,另一个能够影响第一个。

所以,我真正想做的是这样的:

我可能想做的事情可能是重力,即 second_one 中的每个点都尝试将点拖得更靠近它等等,然后在调整点之后,应用矩阵以获得其实际位置。

我真的很惊讶它是可能的,或者接近它的东西。但重点是能够使用第二个 VBO,或者让它成为 vec3 类型的制服,让我可以访问它。

0 投票
1 回答
1323 浏览

iphone - iPhone Cheetah 3D OpenGL ES 顶点缓冲区对象 (VBO) 示例

我想使用顶点缓冲区对象 (VBO) 来改进我在 iPhone 的 Open GL ES 1.1 游戏中对有些复杂模型的渲染。在阅读了关于 SO 和这个(http://playcontrol.net/ewing/jibberjabber/opengl_vertex_buffer_object.html)教程的几篇文章之后,我仍然无法理解 VBO 以及如何根据我的 Cheetah 3D 导出​​模型格式来实现它们。有人可以给我一个实现 VBO 并使用它来绘制具有给定数据结构的顶点并解释语法的示例吗?我非常感谢任何帮助!

我在 Pro OpenGL ES (Appress) 第 9 章的帮助下编写了以下代码。我正在使用 DrawElements 命令获取 EXC_BAD_ACCESS,但我不知道为什么。有人可以阐明一下吗?谢谢 -

以下是我遇到异常的绘图命令: