错误的bindTexture(TEXTURE_2D,null);打电话或坏着色器?纹理令人失望与three.ShaderMaterial

时间:2014-02-06 00:23:29

标签: three.js glsl webgl

在两种情况下,我有一个THREE.ShaderMaterial,它没有正确渲染一个对象,省略了它的纹理。 在这两个例子中,中间对象是一个基本的THREE.MeshPhongMaterial

示例1:http://jsfiddle.net/sG9MP/4/最靠近屏幕的对象永远不会显示。 在这一个,它适用于renderer.render(...),但不适用于composer.render(...)。

renderer.render( scene, camera );
//composer.render();  

示例2:http://jsfiddle.net/sG9MP/5/这里我试图复制MeshPhongMaterial着色器作为基础,以便我可以修改它。我试图完美地复制它。我复制了uniform,vert,frag,并复制了对象中的内容。我看不出有什么不同,所以我不明白为什么它不像标准的Three.js phong着色器那样工作。

所以这是我使用THREE.ShaderMaterial并且它没有正确渲染着色器的两种情况,我无法弄清楚原因。在第二个例子(我真的需要修复的那个。第一个是旧的测试),在webGL检查器中我看到场景通常看起来很好,直到有一个“bindTexture(TEXTURE_2D,null);”通过three.js在引擎盖下发生的呼叫。虽然有时它只是没有它。在第一个例子中,它总是在没有它的情况下绘制。

我觉得我必须在渲染器,作曲家或其他东西中遗漏某种旗帜。或者在我的第二个例子中,我试图复制Three.js phong着色器,也许我没有完美地复制一些东西。

这里的目标只是复制phong着色器,这样我就可以修改它上面的uniform,vert和frag。遗憾的是,我不能简单地.clone()它,因为在编译之后不能修改vert和frag。

1 个答案:

答案 0 :(得分:0)

看起来在设置ShaderMaterial.map时,ShaderMaterial.uniforms.map.value未设置一致。

但是,我真的不明白这一点。在某些情况下,我遇到的问题是没有在ShaderMaterial的顶层设置东西。其他情况我没有设置制服的问题。

在我的资料中,我刚刚加入了这个:

    for(var k in phongMat){
        if( typeof phongMat.uniforms[k] != 'undefined' ){
            phongMat.uniforms[k].value = phongMat[k];
        }
    }