对于每个可能使用相同着色器/程序但需要将不同数据作为vertexShader
传递给attributes
的每个帧,我碰巧有多个部分。但是,该数据存储在不同的缓冲区中(一个具有GL_STATIC_DRAW
,另一个GL_STREAM_DRAW
)。静态缓冲区有点大,这就是为什么我不想让它从同一个缓冲区流出来。
我的问题:
OpenGL ES 2.0 / WebGL是否能够为相同的属性/着色器设置使用不同的数据(从gpu内存中读取)?
我尝试了什么?
我试图获取attributeLocation,例如a_position_f4
多次(bindBuffer()
用于更改缓冲区)然后再设置vertexAttribPointer()
- 但调试显示属性指示不依赖于绑定缓冲区因此更改绑定缓冲区和启用/禁用vertexAttributes不会导致所需的行为。
答案 0 :(得分:1)
我试图获取attributeLocation,例如a_position_f4多次(用于更改缓冲区的bindBuffer())然后再设置vertexAttribPointer() - 但调试显示属性指示不依赖于绑定缓冲区,因此更改绑定缓冲区和/禁用vertexAttributes不会导致所需的行为。
你的结论是错误的。属性位置与您使用的缓冲区无关。它们在着色器链接时确定,并且不以任何方式绑定到缓冲区对象。然而,顶点属性指针将始终引用当前绑定的GL_ARRAY_BUFFER
(在glVertexAttribPointer
调用时)。所以你应该只查询属性位置一次(每个程序对象),然后可以使用
glBindBuffer(GL_ARRAY_BUFFER, bufID);
glVertexAttribPointer(attrib_loc, ...);
随时指定缓冲区bufID
作为索引为attrib_loc
的属性的属性数据的源。 (正如您在此处所看到的,每个属性数组可能来自不同的缓冲区,或者服务器或所有属性数组都可以来自同一个,这取决于您)。 GL是状态机,此设置将一直保留,直到您再次更改它为止,因此此语句后面的所有绘制调用都将使用该位置来获取该属性。