Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-09-27

WebGL の drawElements の第四引数は「バイト数」

12:36

WebGL 勉強中。実はこれまで3回ぐらい挫折してるんだけど、今回はけっこうすんなり理解できた。

var offset = 0;
materials.forEach(function(material) {

  // ... bindTexture とか ...

  gl.drawElements(gl.TRIANGLES, material.vertexCount, gl.UNSIGNED_SHORT, offset);
  offset += material.vertexCount;
});

↑こういうのを書こうと思ったときに注意することは、offset にはバイト数を与えなければいけないということ。material.vertexCount は要素(頂点)の数。つまり、上のは、

var offset = 0;
materials.forEach(function(material) {

  // ... bindTexture とか ...

  gl.drawElements(gl.TRIANGLES, material.vertexCount, gl.UNSIGNED_SHORT, offset);
  offset += material.vertexCount * 2; // ←ここ!
});

と書かないとダメ。しかし unsigned short のバイト数が2というのは未来永劫当てはまるんだろうか。10年後ぐらいに後悔しないだろうか。

2という数字を書かずに Uint16Array.BYTES_PER_ELEMENT と書いてもいい。これでも unsigned short = uint16 という暗黙の仮定をしてることになるので、後悔しそう度としては同じぐらいかもしれない。つーか TypedArray の仕様も Khronos が作ってるんだから名前を揃えてほしい。。

void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset) (OpenGL ES 2.0 §2.8, man page)

Draw using the currently bound element array buffer. The given offset is in bytes, and must be a valid multiple of the size of the given type or an INVALID_OPERATION error will be generated; see Buffer Offset and Stride Requirements. If count is greater than zero, then a non-null WebGLBuffer must be bound to the ELEMENT_ARRAY_BUFFER binding point or an INVALID_OPERATION error will be generated.

WebGL Specifications

vertexAttribPointestrideoffset もバイト数で指定でした。バイト数指定はこの2つだけっぽい。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20110927
 |