現在のところ、私のコードは.obj(wavefront)ファイルのロードとそれをWebGLオブジェクト(GLバッファーとレンダリング関数)に変換することをサポートしています。ただし、現在、オブジェクト全体にマップできるのは1つのテクスチャのみです。
私のファイルローダーは1行ずつ読み取り、現在usemtl
.objファイルの行を無視します。私のオブジェクトレンダリング関数は次のようになります(http://learningwebgl.com/blog/?page_id=1217チュートリアルから採用)-まだ完全ではありませんが、完全を期すために、動作する関数全体を投稿しました。
this.render = function(gl){
// push identity to the matrix stack (to apply changes only to this object)
mvPushMatrix();
// apply translations
mat4.translate(mvMatrix, [this.transX, this.transY, this.transZ]);
// apply scaling
mat4.scale(mvMatrix, [this.scaleX, this.scaleY, this.scaleZ]);
// apply rotations
mat4.rotate(mvMatrix, this.rotX, [1, 0, 0]);
mat4.rotate(mvMatrix, this.rotY, [0, 1, 0]);
mat4.rotate(mvMatrix, this.rotZ, [0, 0, 1]);
// load position buffer
gl.bindBuffer(gl.ARRAY_BUFFER, this.positionVertexBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
this.positionVertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
// load normals buffer
gl.bindBuffer(gl.ARRAY_BUFFER, this.normalVertexBuffer);
gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute,
this.normalVertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
// load texture buffer
gl.bindBuffer(gl.ARRAY_BUFFER, this.textureVertexBuffer);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute,
this.textureVertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
// load and apply the texture
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, this.texture);
gl.uniform1i(shaderProgram.samplerUniform, 0);
// if blending is turned on, apply the blending and alpha value
if(this.blending || this.firstRun){
gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
gl.enable(gl.BLEND);
gl.disable(gl.DEPTH_TEST);
gl.uniform1f(shaderProgram.alphaUniform, this.alpha);
}
// otherwise, disable blending mode and render normally
else{
gl.disable(gl.BLEND);
gl.enable(gl.DEPTH_TEST);
gl.uniform1f(shaderProgram.alphaUniform, 1.0);
}
// render with indices IF indices are enabled
if(this.indicesEnabled){
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexVertexBuffer);
setMatrixUniforms();
gl.drawElements(gl.TRIANGLES,
this.indexVertexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
}
// otherwise, render normally
else {
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLES, 0, this.textureVertexBuffer.numItems);
}
// pop the matrix stack
mvPopMatrix();
// unflag first run after first frame rendering
this.firstRun = false;
}
私がやりたいのは、複数のテクスチャを使用するファイルを読み込むことです。これどうやってするの?私の最初の仮定は、.objから1つのテクスチャのすべての面を読み取り、テクスチャが変更されたら、別のバッファの読み取りを開始し、オブジェクトを複数の部分(テクスチャごとに1つの部分)に分割して、次のようにレンダリングすることです。それらが別々のオブジェクトである場合。しかし、コードを変更する前に、これが正しいかどうか、またはこの問題に取り組むための特に良い方法があるかどうかを確認したかったのでしょうか。
正直なところ、どうすればいいのか全くわかりません。助言がありますか?ありがとうございました。