【发布时间】:2019-01-09 03:25:34
【问题描述】:
我打算渲染棱镜和球体,它们都使用相同的着色器,只是它们的数据(顶点位置和法线)的缓冲区不同。
是否可以只编译一个着色器程序并为每种类型的对象使用不同的 VAO?
另外,我的两种对象类型使用不同的属性位置,球体也使用元素数组缓冲区,会不会有什么问题?
【问题讨论】:
标签: opengl
我打算渲染棱镜和球体,它们都使用相同的着色器,只是它们的数据(顶点位置和法线)的缓冲区不同。
是否可以只编译一个着色器程序并为每种类型的对象使用不同的 VAO?
另外,我的两种对象类型使用不同的属性位置,球体也使用元素数组缓冲区,会不会有什么问题?
【问题讨论】:
标签: opengl
是否可以只编译一个着色器程序并为每种类型的对象使用不同的 VAO?
shader 程序对象和vertex array object 之间没有直接链接。
执行绘制调用时,使用当前安装的程序绘制当前绑定的顶点数组对象指定的顶点属性。
所以是的,您可以使用相同的着色器程序来绘制由不同顶点数组对象引用的不同顶点集。
[...] 我的两种对象类型都使用不同的属性位置 [...]
属性索引(位置)是活动程序资源,在链接着色器程序后无法更改。
顶点属性规范(存储在顶点数组对象中)必须尊重程序的活动属性索引,但多个顶点数组对象可以引用同一个顶点数组缓冲区对象。
可以创建不同的顶点数组对象,它们引用(共享)相同的顶点缓冲区对象,但将它们关联到不同的属性位置。但请注意,着色器程序的属性位置不能更改。
[...]球体也使用了元素数组缓冲区,会不会有什么问题?
索引(元素)缓冲区是否用于绘制网格,取决于绘制调用(glDrawArrays 或glDrawElements)
【讨论】: