OpenGL的顶点数组对象是否存储在VRam中?
我真正要问的是:如果我加载一个模型,例如使用Assimp,那么将顶点和indice数据读入顶点数组对象; 我会在Ram中复制数据,还是将其复制到GPU?
我想知道nVidia OpenGL驱动程序中固定管道(没有连接着色器)内的属性位置:
glVertex = 0
glColor = 3
glNormal = ?
glTexCoord = ?
glMultiTexCoord 0..7 = ?
glSecondaryColor = ?
glFog = ?
Run Code Online (Sandbox Code Playgroud)
根据经验,我找到了顶点和主要颜色位置,但仍然很高兴知道它们.
如果你想知道原因,那么出于兼容性的原因,甚至是GLSL调试(只是为了看看我是否在着色器不能正常工作时将正确的数据传递到正确的位置)等等......
环境:OpenGL 3.3 +,C编程,Windows.
我有一个函数加载模型中的所有顶点数据,但只返回VAO id和顶点数.在此过程中,它生成VBO ID并将顶点数组数据传递给缓冲区...但是在函数完成时不会保存VBO ID.实际上他们不需要绘制VAO.
现在我需要访问其中一个VBO来更新一些数据,但我没有存储id.
是否可以从VAO(具有id)检索与其链接的VBO的数量?
我正在尝试在 OpenGL 3.3 的窗口中绘制两个三角形。我正在为窗口系统使用 GLFW 库。
据我所知,我应该有两个 VBO(每个三角形一个)和一个包含这两个 VBO 的VAO。这就是我所做的。
但是,我不知道应该进行哪些调用来呈现这两个 VBO。事实上,无论我做什么,只有第一个VBO(第一个三角形)被绘制。第二个永远不会出现。
int main()
{
GLFWwindow *window = setupWindow();
GLfloat triangle1Vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLfloat triangle2Vertices[] = {
0.f, -0.5f, 0.0f,
0.8f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint vao, vbo[2];
glGenVertexArrays(1, &vao);
glGenBuffers(2, vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(0); …Run Code Online (Sandbox Code Playgroud) 在OpenGL的维基:顶点规格指出:
注:该
GL_ARRAY_BUFFER绑定是不是该VAO的国家的一部分!我知道这很令人困惑,但事实就是如此.
下面是我如何使用VAO,它似乎按预期工作.这有什么不对?我对OpenGL(或OpenGL Wiki),OpenGL驱动程序(OSX 10.9)或OpenGL Wiki的理解?
// ------ Pseudo-code ------
// setup
[...]
glBindVertexArray(vertexArrayObjectIdx1);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBufferId1);
for each vertex attribute
glEnableVertexAttribArray(...);
glVertexAttribPointer(...);
glBindVertexArray(vertexArrayObjectIdx2);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBufferId2);
for each vertex attribute
glEnableVertexAttribArray(...);
glVertexAttribPointer(...);
// rendering
[...]
glBindVertexArray(vertexArrayObjectIdx1);
glDrawElements(...);
glBindVertexArray(vertexArrayObjectIdx2);
glDrawElements(...);
Run Code Online (Sandbox Code Playgroud) 我可以获得更全面/一般的描述吗?
我整个星期都在尝试研究这些东西,但我只涉及超级技术解释或示例。
有人可以解释一下这些 VAO 的总体流程或目标吗?也许概述一下在 OpenGL 中设置 VAO 的“分步”流程图?
我从来都不是一个通过例子学习的人……所以到目前为止,我在网上找到的所有东西都没有什么帮助。
我一直在自学OpenGL,OpenGL中的一些概念让我很困惑。
据我所知,VBO是驻留在服务器端的未描述数据的缓冲区,VAO是VBO的描述,Program是用于在屏幕上显示网格的着色器渲染管道。
让我一直困惑的是它们三者之间的关系,正如我所看到的,在创建并填充VBO之后,VAO是为程序属性规范生成的。这是否意味着每次我们绑定VAO时我们都必须提前使用某个程序?如果这不正确,请纠正我。如果能简单介绍一下这些 OpenGL 概念之间的交互就太好了。
谢谢
当我将不同的顶点属性配置绑定到 VAO 时,我可以轻松更改 VAO 并渲染不同的内容。但那些不同的东西可能也需要不同的纹理。将纹理绑定到 VAO 是否有意义,这样当您更改 VAO 时,相同的纹理索引会填充不同的数据?