opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
opengl : can two different vectors bind to the same vertex array object?
我有两个向量,std::vector col和std::矢量位置,
我的着色器如下:
const GLchar* vertexShaderSource = "#version 330 coren"
"layout (location = 0) in vec2 position;n"
"layout (location = 1) in vec3 PColor;n"
"out vec3 color;n"
"void main()n"
"{n"
"gl_Position = vec4(position.x, position.y, 0.0, 1.0);n"
"color = PColor;n"
"} ";
const GLchar* fragmentShaderSource = "#version 330 coren"
"out vec4 color;n"
"in vec4 PColor;n"
"void main()n"
"{n"
"color = PColor;n"
"}n ";
我可以执行以下操作将pos和col绑定到同一VAO 吗
void CreateVertexBuffer()
{
glGenBuffers(1, &posbuffer);
glGenVertexArrays(1, &VAO);
glBindBuffer(GL_ARRAY_BUFFER, posbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(int) * pos.size(), &pos.front(), GL_STATIC_DRAW);
glBindVertexArray(VAO);
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 2 * sizeof(GL_INT), (GLvoid*)0);
glEnableVertexAttribArray(0);
//glBindVertexArray(0); delete
glGenBuffers(1, &colbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT) * col.size(), &col.front(), GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}
我想让我的程序画一个圆圈,但核心被丢弃了,所以我认为我的VAO绑定可能有一些问题。谢谢
-
您应该在生成VBOs之前生成VAO
glGenVertexArrays(1, &vao[object_id]); glBindVertexArray(vao[object_id]); glGenBuffers(1, &vbo[0]); glBindBuffer(target, vbo[0]); glBufferData(target, size, data1, dataType); glEnableVertexAttribArray(h_Attributes[UV]); glVertexAttribPointer(h_Attributes[UV], 2, GL_FLOAT, 0, 0, 0); glGenBuffers(1, &vbo[1]); glBindBuffer(target, vbo[1]); glBufferData(target, size, data2, dataType); glEnableVertexAttribArray(h_Attributes[POSITION]); glVertexAttribPointer(h_Attributes[POSITION], 3, GL_FLOAT, 0, 0, 0);
-
位置矢量必须是float而不是int,因为它在着色器中是vec2
- 我不确定,但如果不放2*sizeof(GL_INT)和3*sizeof(GL_FLOAT),你的数组似乎没有步幅
更新绘制对象时,必须绑定生成的vao
glBindVertexArray(vao[object_id]);
如果不更新数组的任何值,则不需要在渲染循环中绑定任何vbo。但是,如果需要更新顶点的颜色或位置,则必须调用这些函数。
glBindVertexArray(vao[object_id]);
glBindBuffer(target, vbo[object_id]);
glBufferData(GL_ARRAY_BUFFER, sizeof(the_array), &the_array[0], GL_DYNAMIC_DRAW);
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 同一个引用如何绑定不同的对象