2012-04-04 9 views
1

の異なるテクスチャタイプの休憩のためのテクスチャユニットの再利用、次のテストをチェックアウト:クロム

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

それは、キューブテクスチャの簡単なテストです。また、そこには2Dテクスチャがあり、優れた尺度です。

一部のブラウザでは(これまでのクロム)、2Dテクスチャと同じテクスチャユニットを再利用すると画像が正しく表示されません。

下部には、「球面上のキューブテクスチャには別のテクスチャユニットを使用し、床には2Dテクスチャを使用する」というチェックボックスが表示されています。

これはChromeのコードまたはコードのバグですか?

答えて

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の状態と統一値を確認してください。

オリジナルコードは私にとっては少し難しいです、申し訳ありません。しかし、問題は、texture1cubeTexture0のユニフォームが同じ値で設定されているということです。

3

私はあなたが2つの異なるターゲットに対して同じテクスチャを使用することはできません)あなたのコードが、

1と間違って何も表示されません。言い換えれば、あなたは、これは

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の両方のテクスチャを使用しようとしたシェーダが失敗します。