opengl es着色器程序ID和vbo缓冲区ID相同

Posted

技术标签:

【中文标题】opengl es着色器程序ID和vbo缓冲区ID相同【英文标题】:opengl es shader program id and vbo buffer id are same 【发布时间】:2013-11-14 06:31:43 【问题描述】:

我正在使用 vbo 在 opengl es 2.0 中绘制 2 个三角形。

程序句柄(hProgramHandle)

hProgramHandle = glCreateProgram(); // value is 210003

与 iVertBuffId 相同

glGenBuffers(1, &iVertBuffId1); // for vertices   // 70001
    ...
    ...
glGenBuffers(1, &iVertBuffId2); // for color   // 140002
    ...
    ...
glGenBuffers(1, &iVertBuffId3); // for texture  // 210003

我创建了 3 个缓冲区(每个缓冲区用于位置、颜色和纹理)。 为纹理生成缓冲区时出现上述问题。

我没有得到输出。

opengl 会为程序 id 和 vbo 缓冲区 id 生成相同的数字吗?

【问题讨论】:

【参考方案1】:

这取决于您正在运行的特定 OpenGL ES 驱动程序的实现,但是是的,值可以相同,因为它们是不同类型对象的句柄,不一定是内存指针。将它们视为不同数据结构的索引。

【讨论】:

【参考方案2】:

OpenGL 返回的 ID 实际上是指其内部存储的名称。 内部OpenGL存储是按专业划分的,因此可以随意优化其内存访问。 这与直觉相反的是,id 实际上不是唯一的,而是取决于您对 OpenGL 的讨论:例如当前绑定的内容。

OpenGL 给你相同的 id 是绝对正确的,只要它们引用不同的东西:纹理 id 和缓冲区 id 可以重叠,这不是问题。

注意它们可能重叠也可能不重叠,并按顺序从 0 开始,或者只是给您看似随机的数字,这取决于实现。

【讨论】:

以上是关于opengl es着色器程序ID和vbo缓冲区ID相同的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?

聚合 VBO

OpenGL 基本 IBO/VBO 不工作

OpenGL ES之如何传输一个超大数组给着色器程序

带和不带着色器的 VBO OpenGL C++

从固定管线到可编程管线:十段代码入门OpenGL