问题标签 [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 回答
435 浏览

opengl-es - 将我的几何图形发送到 glsl 的最有效方法是什么?

在我的场景中,我有一棵网格树。每个网格包含一个变换矩阵、一个顶点列表、法线、uvs 和一个子网格列表。

我想使用 VBO 将“结构数组”中的几何图形发送到 glsl,但我不知道在父网格矩阵变换的情况下如何处理更新每个网格的矩阵。我应该遍历网格树并为每帧的每个顶点添加一个矩阵吗?我应该对每帧的顶点进行预乘吗?我应该保持一个统一的矩阵列表并按索引引用当前顶点的矩阵吗?我应该为每个网格使用一个 glDrawArrays 还是 glDrawElements?

0 投票
1 回答
1435 浏览

opengl - OpenGL深度缓冲问题

在我最近的几个项目中,我一直在使用一些实用程序文件,这些文件是我在查看一些演示时发现

即一个名为 opengl.h 的文件 - 主要用于管理着色器,有点像 glew 和另一个文件 gl_font。

gl_font 是他们用来使用顶点缓冲区对象在屏幕上渲染字体的类。

但是,当我使用它在我的游戏中渲染帧速率时,它会正确绘制除天空盒之外的所有内容。由于某种原因,天空盒呈现为白色,如此处所示如果我不呈现字体,它看起来像这样

以下是我认为最重要的 gl_font 类的一些部分:

我尝试更改glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT);为 glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT | GL_TEXTURE_BIT); 并且背景纹理返回,但未渲染字体。

是渲染字体时深度缓冲区的图像,是未渲染时的样子。

任何人都可以阐明这个问题吗?

任何帮助将非常感激!

谢谢。

0 投票
1 回答
2276 浏览

c# - 在 XNA 4.0 中使用 DynamicVertexBuffer

我阅读了有关 DynamicVertexBuffer 的内容,以及它应该如何更好地处理经常变化的数据。我有一个由立方体组成的世界,我需要将立方体的顶点存储在这个缓冲区中以将它们绘制到屏幕上。

但是,并非所有立方体都有顶点(有些是空气,它是透明的),也不是立方体的所有面都需要绘制(它们彼此面对),所以我如何跟踪哪些顶点存储在缓冲?此外,某些面需要最后绘制,即其中具有透明度的面(如玻璃或树叶),并且这些面还需要以从后到前的顺序绘制,以免弄乱 alpha 混合。

如果所有这些顶点都任意存储在这个缓冲区中,我怎么知道哪些顶点在哪里?

此外,顶点的数量可以改变,但 DynamicVertexBuffer 对我来说似乎不是很动态,因为我根本无法改变它的大小。每次我需要添加或删除面时,我是否必须重新创建缓冲区?

0 投票
2 回答
1987 浏览

c++ - 代码辅助,OpenGL VAO/VBO 类不绘制

编辑二:
当前代码效果很好!感谢大家。我继续在底部包含了我的着色器代码以供参考,尽管它们在这一点上完全没有做任何事情。

我正在尝试使用 OpenGL 4.1 并且仍处于开发初期。目前我什至还没有在这个项目中真正使用 4.0 功能,所以这也是一个 OpenGL 3 问题。

我最初的目标是制定两个类来处理 VAO 和 VBO。我有一些误解,但最终通过了空白屏幕。

基本上我只是希望在这一点上能在屏幕上看到任何东西。我正在使用 glfw 和 glew。我是完全遗漏了一些东西还是只需要纠正一些东西?抱歉,目前代码有些混乱。

基础.vert

基础片段

0 投票
2 回答
3778 浏览

c++ - OpenGL:顶点索引缓冲区的问题

我刚开始使用 VBO,除了顶点索引缓冲区外,一切似乎都很好。如果我在启用索引缓冲区后调用 glDrawElements ,我会收到访问冲突错误(找不到索引),如果我只是用指向内存中索引数组开头的指针调用它,它就可以工作..

我认为我在设置时做的一切都是正确的,但我仍然会发布一些代码:

画我做:

s->draw() 行调用:

(注意:在所有指针/drawElements 调用中,我想使用顶点缓冲区下标而不是末尾的 &..[0] 指针,但我不能)。

这就是问题所在。我不明白。我生成缓冲区对象,用索引数据填充它,但是在绘制时似乎找不到它。任何人都知道如何解决这个问题?

谢谢

编辑:在我看来,编译器将缓冲区对象中的偏移量“0”解释为指向内存中位置“0”的指针,这会引发访问冲突错误。

0 投票
2 回答
559 浏览

c++ - 顶点缓冲对象 Open GL

我对 Open GL 真的很陌生,我正在尝试构建非弃用代码。现在我无法掌握的是VBO。这就是我到目前为止所得到的,你能解释一下我应该做什么。另外,我有 OpenGL 编程指南,所以如果你能指出一些要阅读的页面,那也会很有帮助。

0 投票
1 回答
376 浏览

c++ - DirectX:2个精灵多边形之间的小失真

您好,我很长一段时间以来都使用相同的方式使用 directx 渲染精灵,但在这里我以纹理渲染屏幕,然后在屏幕上用大精灵渲染它。

对于我使用的相机: vUpVec=D3DXVECTOR3(0,1,0); vLookatPt=D3DXVECTOR3(0,0,0); vFromPt=D3DXVECTOR3(0,0,-1);

并渲染精灵: CUSTOMVERTEX* v; spritevb->Lock( 0, 0, (void**)&v, 0 );

这是非常基本且有效的,我的精灵在屏幕上呈现全屏。但是通过仔细观察,我发现屏幕上有一条小对角线(在两个多边形之间)不是彩色的,但就像它们没有完美定位一样。

我考虑过过滤并尝试删除所有内容,但也许我忘记了一些东西......

谢谢

0 投票
1 回答
5275 浏览

c++ - 如何正确更新 DirectX 10 中的顶点缓冲区

对于一点背景:我正在使用 C++ 进行一个项目,在该项目中我试图根据实时配置文件数据绘制对象的 3D 表示。分析数据是从外部分析硬件收集的。该系统以每秒 300 次的速度沿着一个对象移动,为我的软件提供了一个剖面切片。每个切片由一个 ~8000 个 XY 点的列表组成。轮廓仪的运动由编码器记录。编码器信息提供了扫描的第三维。

另一个需要注意的重要事项是分析器可能会在对象上来回移动。发生这种情况时,我想用新的切片替换以前读取/绘制的切片(基于编码器位置)。到目前为止,我正在使用按编码器计数存储的切片循环缓冲区来实现这一点。这也意味着当缓冲区填满并开始覆盖旧切片时,我将要丢弃切片。为了在屏幕上显示适当数量的主题 - 我需要一次绘制 1000 个剖面数据。现在我将对象渲染为点云。将来我们可能会尝试附加相邻的切片并渲染为三角形列表。

我是 DirectX 的新手,但是使用书籍和在线示例,我已经到了在 3D 中绘制对象的地步,但我确信我没有有效/正确地使用顶点缓冲区。我发现的大多数示例都适用于非常静态的模型。因此,他们倾向于使用其点列表创建单个顶点缓冲区,然后仅通过矩阵变换进行操作。另一方面,当我从我们的硬件中检索配置文件数据时,我将非常快速地更新场景。

目前,我正在为我读入的每个切片创建一个新的顶点缓冲区。当我绘制场景时,我循环遍历最多 1000 个缓冲区的列表,并为每个缓冲区调用 Draw()。我注意到,如果我将一次绘制的顶点缓冲区数量减少一半,我的 FPS 会显着提高,而将每个缓冲区的顶点点数量减半时几乎没有改善 - 所以我认为这表明多个顶点缓冲区不是解决这个问题的正确方法。

所以对于我的问题的胆量......我想知道当顶点变化如此频繁时,我是否可以将所有这些顶点放在一个顶点缓冲区中。我可以更新现有顶点缓冲区中的点吗?还是应该在每次更新场景时重新创建一个全新的缓冲区?最后要记住的一件事是,硬件中每个切片的点数会有所不同 - 因此,在覆盖以前的切片时,新切片的点数可能比被替换的切片多或少。

谢谢你的时间。任何建议将不胜感激!

0 投票
2 回答
4164 浏览

opengl - OpenGL顶点缓冲区混淆

有人愿意解释一下VertexBufferVertexArrayVertexBufferObjectVertexArrayObject之间的区别吗?我什至不确定这些是否都是不同事物的术语,但我已经看到它们都出现在 OpenGL 规范中。

我知道VertexBuffer只包含顶点而没有其他任何东西,一旦绑定,一旦我设置了顶点指针,我就可以使用 DrawArrays 来绘制它。我已经多次这样做了。

我正在使用我认为是 VertexArray 的东西,它存储设置的任何顶点缓冲区的状态,以及任何顶点指针。绑定 VertexArray 会自动绑定顶点缓冲区并设置顶点指针。我也(大部分)成功地使用了这个。

但是什么是VertexBufferObjectVertexArrayObject?他们更好吗?VertexArray 没有给我我需要的一切吗?

0 投票
1 回答
1761 浏览

c++ - 如何使用静态 TexCoords 和动态顶点调用 glDrawElements

我正在使用带有 VBO 的 glDrawElements 调用来渲染我的场景。场景是一块带有顶点和纹理坐标的布料——在这个例子中,我正在渲染一个标志。

在我的场景中,顶点是动态的,这意味着我需要每帧都写入 VBO。我的大部分处理都是使用 CUDA 在 GPU 上完成的,所以我不断地将 CPU 内存映射到 GPU 内存。另一方面,纹理坐标是静态的。为了使用 glDrawElements 进行渲染(据我了解),我应该在顶点 VBO 中交错纹理坐标,然后简单地调用 glTexCoordPointer() 和 glEnableClientState()。这不是最优的,因为当我进行 CPU<-->GPU 内存映射时,我需要与我一起绘制所有纹理坐标。

有没有办法安排我的 vbo 以便我可以更新 vbo 中的顶点数据而不接触 vbo 中的纹理数据?下面是我的渲染代码——我目前填充了三个数组:一个索引数组、一个顶点数组和一个纹理数组。

在下面的代码中,indexVbo 已映射到索引数组,而 vbo 已映射到顶点数组。我现在需要合并纹理。任何见解或建议将不胜感激。