我要渲染棱镜和球体,并且都使用相同的着色器,但它们的数据(顶点位置和法线)仅使用不同的缓冲区。
是否可以只编译一个着色器程序并对每种对象使用不同的VAO?
此外,我的两种对象类型都使用不同的属性位置,并且球体也使用元素数组缓冲区,这会引起任何问题吗?
答案 0 :(得分:1)
是否可以只编译一个着色器程序并对每种对象使用不同的VAO?
shader程序对象和vertex array object之间没有直接链接。
执行绘制调用时,将使用当前安装的程序绘制由当前绑定的顶点数组对象指定的顶点属性。
因此,可以的,您可以使用相同的着色器程序绘制由不同顶点数组对象引用的不同顶点集。
[...]我的两种对象类型都使用不同的属性位置[...]
属性索引(位置)是活动的程序资源,在链接着色器程序后无法更改。
顶点属性规范(存储在顶点数组对象中)必须遵守程序的活动属性索引,但是多个顶点数组对象可以引用同一顶点数组缓冲区对象。
可以创建不同的顶点数组对象,这些对象引用(共享)相同的顶点缓冲区对象,但是将它们关联到不同的属性位置。但是请注意,着色器程序的属性位置无法更改。
[...]球体也使用元素数组缓冲区,会引起任何问题吗?
是否使用索引(元素)缓冲区绘制网格,取决于绘制调用(glDrawArrays
或glDrawElements
)