4

今のところ、3 つの個別の頂点バッファーがあります。 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 つの float を持つ単一のバッファーにそれらを結合するとどうなるでしょうか? したがって、アイテムのサイズは 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 に答える