- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 openGL,并试图了解 VBO 和 VAO 之间的关系。
据我所知,VBO 就是一个数据缓冲区,仅此而已。为了将该数据传递到 OpenGL 管道,我需要将该 VBO 数据绑定(bind)到 VAO。
这可以通过大量的 glVertexAttrib*
函数来实现。或者,您可以将 VAO 设置为通过一组 glVertexArray*
函数自动从 VBO 上传数据,最后调用 glEnableVertexArrayAttrib
。现在,每当我更改某些 VBO 中的数据时,我所要做的就是在我的 VAO 上调用 glBindVertexArray
以将数据从 VBO 上传到 VAO。
对吧?
至少,我是这样理解发生了什么的。但是,当我尝试在代码中实现它时,我没有看到预期的结果(一个三角形在屏幕周围变形)。
这是我创建 VAO 和 VBO 的代码:
void startup()
{
static const GLfloat positions[] =
{
1.00f, -0.25f, 0.0f, 1.0f,
1.00f, -0.25f, 0.0f, 1.0f ,
1.00f, -0.25f, 0.0f, 1.0f
};
m_renderingProgram = compile_shaders();
//Create VAO and VBO
glCreateVertexArrays(1, &m_VAO);
glCreateBuffers(1, &m_VBO);
//Set the VAO to automatically update it's data with VBO when it is bound
glNamedBufferStorage(m_VBO, sizeof(positions), positions, 0);
glVertexArrayVertexBuffer(m_VAO, 0, m_VBO, 0, 4);
glVertexArrayAttribFormat(m_VAO, 0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(m_VAO, 0, 0);
glEnableVertexArrayAttrib(m_VAO, 0);
//Create a named buffer, so we can change the data within easily
glNamedBufferData(m_VBO, sizeof(positions), positions, GL_MAP_WRITE_BIT);
//Upload the data to the VAO
glBindVertexArray(m_VAO);
}
这是我的 Update() 函数代码:
void render(double currentTime)
{
const GLfloat red[] = { (float)sin(currentTime) * 0.5f + 0.5f,
(float)cos(currentTime) * 0.5f + 0.5f,
(float)sin(currentTime) * 0.5f + 0.5f,
1.0f };
const GLfloat newPosition[] =
{
sin(currentTime) * 1.00, sin(currentTime) * -0.25, 0.0, 1.0,
tan(currentTime) * 1.00, tan(currentTime) * -0.25, 0.0, 1.0 ,
cos(currentTime) * 1.00, cos(currentTime) * -0.25, 0.0, 1.0
};
const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glViewport(sin(currentTime) * 0.4f, cos(currentTime) * 0.5f, 800, 600);
glClearBufferfv(GL_COLOR, 0, black);
//Copy the new position to the buffer
glNamedBufferSubData(m_VBO, 0, sizeof(newPosition), newPosition);
//Use the shader program program
glUseProgram(m_renderingProgram);
glVertexAttrib4fv(1, red);
//Update the VAO with the updated VBO
glBindVertexArray(m_VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
我希望看到的是一个三角形围绕屏幕变形并改变颜色,但我看到的只是一个静态三角形改变颜色。
最佳答案
As far as I know, a VBO is a buffer of data and that's all.
A buffer object是数据缓冲区。术语“VBO”指的是(当前)用作顶点属性源的缓冲区对象。 Buffer objects can be used for many other things , 你可以用多种不同的方式使用同一个缓冲区。
In order to pass that data into the OpenGL Pipeline, I need to bind that VBO data to a VAO.
技术术语是将缓冲区对象“附加”到 VAO。您将一个对象“附加”到另一个对象;您将对象“绑定(bind)”到上下文。
现在我们已经弄清楚了我们的术语,让我们来谈谈您的代码哪里出错了。
//Create a named buffer, so we can change the data within easily
glNamedBufferData(m_VBO, sizeof(positions), positions, GL_MAP_WRITE_BIT);
你不能那样做。您已经使用 glNamedBufferStorage
为该缓冲区对象创建了存储。更重要的是,您为其创建了不可变存储。这意味着一旦为缓冲区对象创建了不可变存储,就无法返回并创建新存储。
哪个好;事实上,这一行完全是多余的,因为您已经创建了存储并上传到它。只需删除此多余的行即可。
//Copy the new position to the buffer
glNamedBufferSubData(m_VBO, 0, sizeof(newPosition), newPosition);
这是我们开始遇到更严重问题的地方。
看,您是这样创建缓冲区的存储空间的:
glNamedBufferStorage(m_VBO, sizeof(positions), positions, 0);
那个0就是flags字段;它指定 the ways in which you can modify the contents of the storage from the CPU (除其他事项外)。也就是说,不可变存储并不意味着您不能再次将内容复制到其中。这只是意味着您无法重新分配存储空间。
但是您传递了 0。这意味着您创建的缓冲区是完全静态的。您告诉 OpenGL 您不想通过 CPU 进程更改缓冲区的内容。这对于静态缓冲区来说很好,但这显然不是您想要的。
因此,您应该传递一个适当的标志,而不是 0。允许 glNamedBufferSubData
工作的标志称为 GL_DYNAMIC_STORAGE_BIT
。
关于c++ - glBindVertexArray 时 VAO 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39946386/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!