微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 2 个或更多VBO 推送到单个 Opengl 的顶点属性“位置”

如何解决将 2 个或更多VBO 推送到单个 Opengl 的顶点属性“位置”

是否可以将 2 个(或更多)VBO 推送/上传到单个 Opengl 的顶点属性 location

enter image description here

这是我当前的代码。如果我每 1 VBO 次最多推送 1 location,它会起作用。

glBindBuffer(GL_ARRAY_BUFFER,VBO); 
...
glBindVertexArray(VAO);  // (VAO-scope)
glEnabLevertexAttribArray(gl_location);
glVertexAttribPointer(
gl_location,numOfFloat_usually1to4,GL_FLOAT,GL_FALSE,amountOfSpace_inByte_betweenAttribute_usually0,(void*)(stripN.stepOffset* sizeof(float)));  
glVertexAttribDivisor(gl_location,var_0IfPerVertex_1IsPerInstance);

我不想使用 2 个 location。每个location都是宝贵的资源。

按照 Opengl 的规范是不可能的吗?

解决方法

单个顶点着色器输入位置(又名:顶点属性)代表多达 4 个标量值的数据。不能超过 4。

从数据的 OpenGL API 方面来看,每个属性的最多 4 个元素的格式是通过对该属性位置的单个 glVertexAttribFormat/Pointer 调用来定义的。尝试使用该 VAO 中相同位置的后续调用将覆盖之前的格式规范。

从接收数据的 GLSL 端来看,从位置到变量的映射并不是那么严格。一些变量类型自然会占用多个位置; layout(location = 0) in mat4 matrix; 将消耗 4 个属性位置 (0-3)。

同样,对于元素少于 4 个的基本类型或向量,multiple input variables can share the same location through the component layout qualifier

layout(location = 0,component = 0) in vec2 first_two;
layout(location = 0,component = 2) in float third;
layout(location = 0,component = 3) in float fourth;

所有 3 个变量都使用相同的属性位置,但它们使用不同的部分first_two 使用位置的前两个组件,third 来自第三个组件,fourth 来自第四个组件。

从 API 方面来看,它仍然只是使用 glVertexAttribFormat(0,4,...); 的格式,这 4 个组件只是提供了 3 个单独的变量。

当然有限制。使用相同位置的两个不同变量的分量不允许重叠。此外,对于使用相同位置的所有变量,它们的基本类型(浮点数、双精度数或整数)必须相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。