0

次のテストを確認してください。

http://binks.knobbits.org/webgl/texture3.html

立方体テクスチャの簡単なテストです。また、適切な測定のためにそこに 2D テクスチャがあります。

一部のブラウザ(これまではクロム)で、立方体テクスチャを描画するために2Dテクスチャと同じテクスチャユニットを再利用すると、画像が正しく表示されないことがわかりました。

これを示す「球体の立方体テクスチャと床の 2D テクスチャに別々のテクスチャ ユニットを使用する」とマークされたチェックボックスが下部にあります。

これはクロムまたは私のコードのバグですか?

4

2 に答える 2

2

あなたのコードには何も問題はありませんが、

1) 2 つの異なるターゲットに同じテクスチャを使用することはできません。言い換えれば、あなたはこれを行うことはできません

tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);

2) テクスチャ ユニットで TEXTURE_2D と CUBE_MAP の両方を同時に使用することはできません。

両方を割り当てることができますが、レンダリングするときは、シェーダーでそれらの 1 つしか参照できません。言い換えると。

gl.activeTexture(gl.TEXTURE0);
tex1 = gl.createTexture();
tex2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex1);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex2);

大丈夫ですが、テクスチャ ユニット 0 の両方のテクスチャを使用しようとしたシェーダーは失敗します。

于 2012-04-05T01:52:27.747 に答える
1

描画関数のコードを少し注文しましたが、現在は機能しています。

四角:

TexturedSquare.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.v);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(gl.va_tex1pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,10*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,10*4,4*4);
    gl.vertexAttribPointer(gl.va_tex1pos,2,gl.FLOAT,false,10*4,4*8);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,this.texture);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,null);

    gl.uniform1i(shader.textures,1);
    gl.uniform1i(shader.texture1,0);
    gl.uniform1i(shader.cube_textures,0);
    gl.uniform1i(shader.cubeTexture0,1);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.e);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_tex1pos);
}

球体:

GLHTexturedSphere.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.vbuf);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(this.va_cubetex0pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,8*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,8*4,4*4);
    gl.vertexAttribPointer(this.va_cubetex0pos,4,gl.FLOAT,false,8*4,4*4);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,null);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,this.texture);

    gl.uniform1i(shader.textures,0);
    gl.uniform1i(shader.texture1,1);
    gl.uniform1i(shader.cube_textures,1);
    gl.uniform1i(shader.cubeTexture0,0);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.ebuf);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_cubetex0pos);
}

どちらも現在使用中TEXTURE0です。WebGL の状態と均一な値を確認してください。

元のコードは私には少し難しいです。申し訳ありません。texture1でも問題は、cubeTexture0ユニフォームが同じ値に設定されていることだと思います。

于 2012-04-04T17:13:15.740 に答える