gpt4 book ai didi

opengl - 如何将模型矩阵包含到 VBO 中?

转载 作者:行者123 更新时间:2023-12-02 08:33:11 24 4
gpt4 key购买 nike

我想发送一个缓冲区列表(到 GPU/顶点着色器),其中包含有关顶点位置、世界位置、颜色、比例和旋转的信息。

如果我的每个 3D 对象在矩阵中都有变换相关信息,我如何通过 VBO(s) 将这个矩阵数组(除了其他顶点数据)传递给 GPU?

已更新请原谅任何错别字:

// bind & set vertices.
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAtribPointer(a_Position, 3, gl.FLOAT, false, stride, 0);

// bind & set vertex normals.
gl.bindBuffer(gl.ARRAY_BUFFER,, vertexNormalsBuffer);
gl.vertexAttribPointer(a_Normal, 3, gl.FLOAT, false, stride, 0);

// becaue i cant pass in a model matrix via VBO, im tryng to pass in my world coordinates.
gl.bindBuffer(gl.ARRAY_BUFFER, worldPositionBuffer);

// not sure why i need to do this, but most tutorials i've read says to do this.
gl.bindBuffer(gl.ARRAY_BUFFER, null);

// bind & draw index buffer.
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vertexIndexBuffer);
gl.drawElements(gl.TRIANGLES, vertexIndexCount, gl.UNSIGNED_SHORT, 0);

请注意,这些缓冲区(vertexBuffervertexNormalsBufferworldPostiionBuffervertexIndexBuffer)是所有我场景中的各个 3D 对象(我通过属性/制服逐个渲染 - 一种更简单、更容易掌握的天真方法,但对于 1000 个对象来说速度非常慢)。

最佳答案

对于在渲染帧时需要频繁更改的任何值,将它们作为 attribute 而不是 uniform 传递到着色器会更有效。这还有一个优点,即如果您愿意,可以将值存储在 VBO 中。请注意,在 VBO 中存储属性不是必需的,它们也可以用 glVertexAttrib[1234]f()glVertexAttrib[1234]fv().

这适用于转换矩阵,就像传递到着色器的任何其他值一样。如果它经常变化,你应该把它作为一个属性。在这种情况下唯一的小问题是我们正在处理一个矩阵,而属性必须是向量。但这很容易克服。通常作为 mat4 传入的内容可以由 3 个 vec4 类型的值表示,其中这 3 个向量是矩阵的列向量。它当然是 4 个向量来表示一个完全通用的 4x4 矩阵,但是变换矩阵中的第 4 列不用于任何常见的变换类型(投影矩阵除外)。

如果您希望在 VBO 中进行转换,您可以再设置 3 个属性,就像您已经为位置和颜色所做的一样。您存储在 VBO 中的属性值是相应变换矩阵的列向量。

然后在顶点着色器中,通过计算变换属性向量与输入位置的点积来应用变换。代码可能如下所示:

attribute vec4 InPosition;
attribute vec4 XTransform;
attribute vec4 YTransform;
attribute vec4 ZTransform;
main() {
vec3 eyePosition = vec3(
dot(XTransform, InPosition),
dot(YTransform, InPosition),
dot(ZTransform, InPosition));
...
}

在完整的 OpenGL 中还有其他方法可以解决此问题,例如使用统一缓冲区对象。但是对于 WebGL 和 OpenGL ES 2.0,我认为这是最好的解决方案。

关于opengl - 如何将模型矩阵包含到 VBO 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com