1

現在のところ、私のコードは.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つの部分)に分割して、次のようにレンダリングすることです。それらが別々のオブジェクトである場合。しかし、コードを変更する前に、これが正しいかどうか、またはこの問題に取り組むための特に良い方法があるかどうかを確認したかったのでしょうか。

正直なところ、どうすればいいのか全くわかりません。助言がありますか?ありがとうございました。

4

1 に答える 1

2

はい、それはほとんどそれが行われている方法です。

通常、プロのゲームでは、2つの100ポリゴンモデルのgl.drawXXXへの2回の呼び出しは、1つの200ポリゴンモデルのgl.drawXXXへの1回の呼び出しよりも遅いため、アーティストはオブジェクトごとに1つのテクスチャを使用する必要があります。

それ以外の場合、一部のチームには、ファイルを読み取り、すべてを1つのテクスチャに変換して、テクスチャを1つのスーパーテクスチャにマージするツールがあります。他のチームには、ポリゴンをテクスチャごとに1つのモデルに並べ替えるツールがあります。

事実上、各ポリゴンについて、ポリゴンがどのテクスチャに属しているかを把握し、それらの頂点をそのテクスチャのバケットに配置します。最後に、テクスチャごとに1つずつ、各バケットを書き出します。

于 2013-01-06T10:20:49.417 に答える