问题标签 [vao]

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 投票
2 回答
432 浏览

c++ - 使用 IBO/EBO 时,程序仅在我调用 glBindBuffer 以在创建 VAO 后绑定 IBO/EBO 时才有效

出于某种原因,该程序仅在我创建 VAO 后再次绑定 IBO/EBO 时才有效。我在网上阅读了多个 SO 帖子,认为 glBindBuffer 仅绑定当前缓冲区,并且不会将其附加到 VAO。我认为 glVertexAttribPointer 是将数据附加到 VAO 的函数。

如果我没有第二个 glBindBuffer,程序就会崩溃。我只想知道为什么我必须在创建 VAO 后再次调用 glBindBuffer,当调用 glBindBuffer 时只会使缓冲区成为其他函数的活动缓冲区。

Pastebin(完整代码)

0 投票
1 回答
133 浏览

opengl - OpenGL - Can't get shader to display vertex colors

So I finally set up opengl window properly and got triangles to show up using vaos, vbos and glDrawElements() etc.

Here is the what i have

But now I have new problem - can't get shaders to work. I don't quite understand them yet. I want fragment shader to show vertex colors which I put into a separate buffer object.

Example code:

And render:

Everything seems to work fine except for shaders. Any help is appreciated :) Thanks.

0 投票
1 回答
2086 浏览

c++ - 使用 VAO/VBO 进行 OpenGL 模型/纹理渲染

我正在尝试使用Assimp渲染带有纹理的 3D 模型。转换非常完美,所有纹理位置以及未加载的内容。我已经通过将纹理图像以 2D 的形式绘制到屏幕上来测试它们。由于某种原因,它不会将纹理渲染到模型。我是 OpenGL 的初学者,所以如果我解释不正确,请原谅我。我基于代码的教程来自这里,但由于我有自己的相机/运动系统,所以我删除了很大一部分。

模型渲染如下:http: //i.stack.imgur.com/5sK9K.png

而使用中的纹理看起来像这样:http: //i.stack.imgur.com/sWGp7.jpg

相关渲染代码如下:

从数据文件生成纹理:

生成 VBO/VAO:

渲染模型:

任何其他相关代码部分都可以在我的开放 github 项目https://github.com/kwek20/StrategyGame/tree/master/Strategy中找到

Mesh.cpp 是相关的,还有 main.cpp 和 Camera.cpp。

据我了解,我很好地遵循了指南,创建了一个 VAO,创建了 VBO,添加了数据并启用了正确的顶点数组属性来渲染场景。

我检查了所有数据变量,一切都按计划填写

这里的任何人都可以发现我犯的错误并或解释它吗?由于我的限制,有些链接的输入很奇怪:(

0 投票
1 回答
477 浏览

c++ - OpenGL - 在渲染循环中创建 VAO 是一个不错的选择吗?

我已经为我在 OpenGL 中设计的内容粘贴了一个伪代码。

我有的:

  • 在下面的函数 createVAOs() 中,我创建了我想要的所有顶点 (VBO),并创建了索引 (EBO) 以绘制一些漂亮的正方形。
  • 然后,在主循环中,在函数 draw_textures() 中绑定纹理并在 VBO 上的顶点上绘制一个带有纹理的元素。

我想要的是:

  • 现在我想动态更改 VAO。让我们想象一下:我想为特定的三角形添加新纹理,甚至删除我的 VAO 上的一些三角形。但是由于 VAO 是在循环之前创建的,所以我有一个问题......我不知道每次在循环内创建 VAO 是“明智的”还是“优化的”......

我的问题:

- 将 VAO(VBO 和 EBO)的创建放在渲染循环中是否明智?如果没有,最好的解决方案是什么?

考虑下面我的伪代码:

0 投票
3 回答
1291 浏览

c++ - OpenGL - Easiest way to draw a square with a texture

Usually I draw a square with a texture like this:

  • Create a VBO with 4 coordinates (A,B,C,D for the square)
  • Create a EBO with 4 indices (A,C,D and B,C,D) telling that I want to draw a square out of 2 triangles.
  • Draw this elements with a texture

Isn't there an easiest way without having a EBO array?

Because it is not very handy to use... If I want to use like this:

VAO = [-0.8f, 0.5f, 0.0f, ...]

EBO = [0, 1, 3, 1, 2, 3, ...]

Then I need to remove a square from my VAO... then I also need to remove the indices from my EBO array and re-arrange it. Is there a better way to do this?

0 投票
1 回答
139 浏览

c++ - OpenGL - 将 VAO 定义与 VBO 和其他缓冲区创建正确分离

运行一个非常简单的绘制三角形示例,我试图找出哪些线专门引用了 VAO 定义,哪些线可以分开。

目前我正在使用这段代码:

缓冲区创建和填充:

VAO定义:

绘图循环

如果在绘图循环中我每帧都包含 VAO 定义,则该示例运行良好,但如果我在开始绘制之前只定义一次 VAO,则它不起作用,所以我猜 VAO 定义缺少一些代码。

我错过了什么?

0 投票
1 回答
220 浏览

c++ - Opengl VAO 被覆盖

我正在学习opengl,目前我正在与VAOs斗争。我想使用 VAO 绘制一个立方体和一个三角形,但不幸的是,只绘制了我稍后创建的对象。这就是我在主循环中所做的:

两者都generateCube()generateTriangle()基本相同的事情:创建顶点,创建 vbo,创建 vao 并设置属性。然后他们返回 vao id。例如generateTriangle()

使用此代码,仅绘制立方体。此外,如果我注释掉这些线条: 主要是glBindVertexArray(cube_vao);glDrawArrays(GL_TRIANGLES, 0, 12*3);三角形被绘制但具有立方体的颜色和位置,这让我发疯。

如果有帮助,我将使用 OSX 和着色器版本 120。

0 投票
1 回答
178 浏览

opengl - 配置 VAO 以处理具有多个网格的 VBO

我正在尝试使用单个 VAO 来表示包含多个网格的单个 VBO。现在我有:

更多来源:http: //pastebin.com/PDuk3fDu

我认为我的问题主要存在于代码段的最后一行。

我以为我可以在同一个 VBO 中填充两个不同的网格?如果我在设置缓冲源时只能设置看似一个的状态,这怎么可能?

我遇到了这个麻烦,因为我读到每个 VBO 都有一个 VAO 效率非常低,因为绑定是一件相对昂贵的事情。我还读到在同一个 VBO 中存储具有相似需求的网格是个好主意。

0 投票
1 回答
115 浏览

c++ - C++/OpenGL:VAO 单独工作,但不能一起工作

尝试使用 C++/OpenGL 实现 VAO 的基本示例,我遇到了一个特殊的问题,在搜索了一段时间后我还没有找到解决方案。我的程序应该将纹理(CT 图像)渲染为正方形,然后在顶部绘制多边形(使用 GL_LINE_LOOP)以勾勒出特定器官的轮廓。首先,我在初始化时为 CT 图像创建一个 VAO:

接下来,我在初始化时为特定轮廓集创建一个 VAO:

这就是事情变得不稳定的地方。我的渲染代码如下:

当我只注释掉轮廓的 glDraw 命令时,CT 图像绘制得很好。同样,当我仅注释掉 CT 图像的 glDraw 命令时,轮廓绘制得很好。但是,当我尝试在同一个函数调用中渲染它们时,轮廓 VAO 会从 CT 图像 VAO 中抓取顶点缓冲区并进行渲染。

我希望我可以插入图片,但我的代表。还不够高……

在查看了几个地方并阅读了 VAO 之后,我很困惑。任何帮助将不胜感激。这是我的比赛。信息:Ubuntu 14.04,Intel i5 CPU,ATI Radeon 显卡,运行 OpenGL 4.3。谢谢!

0 投票
1 回答
109 浏览

opengl - 加载多个索引 VAO 时,它们的几何形状似乎合并

我编写了一个非常基本的 .obj 文件加载器(只加载顶点坐标和三角形面索引)和渲染器。当我一次只加载一个模型时,效果很好。当我加载第二个模型(或更多)时,每个模型都会绘制自己和其他模型的一部分,我绞尽脑汁想弄清楚为什么会这样。

这是一个正在加载和绘制的简单圆柱体

这就是我加载一个立方体和一个圆柱体(首先是立方体)时发生的情况。

一些相关的代码片段:

这是我打开 .obj 文件并从文件中读取顶点坐标和三角形面索引的地方。

在 loadFromFile 方法结束时,我们将索引和顶点向量传递给 model::load() 方法,该方法创建并绑定 VAO、VBO 和 IBO。

加载模型后,它的 VAO id 将存储在类变量中。VAO 在 model::bind() 方法中加载。

并通过调用 glDrawElements() 进行绘制

模型在 level::draw() 方法中绘制:

没有 OpenGL 错误,当我将其打印到控制台时,文件解析会生成正确的值。

如果有人能指出发生这种情况的方式/原因,我将不胜感激。