4

现在我有三个独立的顶点缓冲区: 1. XYZ 缓冲区 2. NX,NY,NZ 缓冲区 3. UV 缓冲区

所以总共有 8 个浮点数。将来还会添加切线和双切线信息,所以 +6 浮动。

这是我为着色器声明它们的方式:

shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");
gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);

shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);

在这里,我将它们传递给着色器程序:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexCoordBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexNormalBuffer);
gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexTextureCoordBuffer);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);

由于缓冲区是独立的,我可以在着色器中将它们定义为 vec3 和 vec2:

attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;
attribute vec2 aTextureCoord;

但是如果我将它们组合成一个每个顶点有 8 个浮点数的缓冲区呢?因此,项目大小将为 8:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexCoordBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 8, gl.FLOAT, false, 0, 0);

但是我如何在着色器中访问它们?vec8 ? 有最大 vec4!那我该怎么办?

4

2 回答 2

5

您可以创建一个单独的缓冲区来保存每个顶点的所有属性,使用 stride 和 offset 参数(您当前设置为 0)来定义交错属性。事实上,我听说你应该这样做来提高每个顶点的内存访问的局部性。

步幅是每个顶点的总字节数(更确切地说,相同属性出现之间的间距),偏移量是特定属性第一次出现的字节索引。因此,要获取示例属性并从单个缓冲区中读取它们:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexAttrBuffer);
var step = Float32Array.BYTES_PER_ELEMENT;
var total = 3 + 3 + 2;
var stride = step * total;
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, stride, 0);
gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, 3, gl.FLOAT, false, stride, step * 3);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, stride, step * 6);

缓冲区将从Float32Array其元素加载

[px1, py1, pz1, nx1, ny1, nz1, u1, v1,
 px2, py2, pz2, nx2, ny2, nz2, u2, v2,
 ...]
于 2013-06-02T23:07:21.047 回答
0

最大值是 vec4,你是对的,也是 webGL 的唯一方法。您可以尝试将数组作为属性传递:GLSL per vertex fixed size array,但 OpenGL ES 2.0 不支持它,因此此选项仅在桌面 OpenGL 中可用。但我不认为真正需要这样做,所以无论你做什么,你都可以使用 vec4,并且传递数组属性是你可能不应该做的事情。

希望这可以帮助。

于 2013-06-02T22:46:41.337 回答