Javascript 使用着色器材质复制MeshLambertMaterial会忽略纹理

Javascript 使用着色器材质复制MeshLambertMaterial会忽略纹理,javascript,opengl-es,three.js,webgl,shader,Javascript,Opengl Es,Three.js,Webgl,Shader,我注意到THREE.js在内部使用着色器来创建核心材质“例如MeshLambertMaterial”,因此我决定将lambert着色器从THREE.js代码复制到一个新的着色器中并在其上构建 这是我得到的代码(忠实地复制自Three.js r66) 这是我用来设置制服和创建材质的代码 var textureUsed = 'rock_1'; var texture = THREE.ImageUtils.loadTexture( texturePath + textureUsed + "/diffu

我注意到THREE.js在内部使用着色器来创建核心材质“例如MeshLambertMaterial”,因此我决定将lambert着色器从THREE.js代码复制到一个新的着色器中并在其上构建

这是我得到的代码(忠实地复制自Three.js r66)

这是我用来设置制服和创建材质的代码

var textureUsed = 'rock_1';
var texture = THREE.ImageUtils.loadTexture( texturePath + textureUsed + "/diffuse.png");
texture.wrapS   = THREE.RepeatWrapping;
texture.wrapT   = THREE.RepeatWrapping;
texture.repeat.x = 128;
texture.repeat.y = 128;
var shaderUniforms = THREE.UniformsUtils.clone( THREE.MyShader.uniforms );
shaderUniforms[ "map" ].value = texture;
var material =  new THREE.ShaderMaterial({
                    name: "TerrainShader",
                    uniforms    : shaderUniforms,
                    vertexShader: THREE.MyShader.vertexShader,
                    fragmentShader: THREE.MyShader.fragmentShader,
                    fog:false,
                    lights:true
                });
问题是,当我使用这些参数创建MeshLambertMaterial时,我得到了正确的照明和纹理重复,当我使用它创建ShaderMaterial时,灯光和阴影似乎在工作,但纹理贴图没有加载,为了解决这个问题,我通过代码挖掘并通过添加这个丑陋的“hack”来加载贴图到我的代码,就在材质定义之后

material.map = true;
现在纹理已加载并显示,但看起来纹理坐标混乱,着色器似乎忽略了我提供的重复值,而不是重复


为什么我需要那个黑客来处理我的纹理,我能做些什么来获得正确的纹理重复?

three.js的设计是为了易于使用,而不容易修改。这在将来可能会改变

您需要设置
材质。定义如下:

var defines = {};

defines[ "USE_MAP" ] = "";. 
然后在材质构造函数中指定
定义

var material =  new THREE.ShaderMaterial({
   name: "TerrainShader",
   defines     : defines,
   uniforms    : shaderUniforms,
   vertexShader: THREE.MyShader.vertexShader,
   fragmentShader: THREE.MyShader.fragmentShader,
   fog:false,
   lights:true
});
关于纹理重复,您需要将重复添加到制服中:

shaderUniforms[ "offsetRepeat" ].value.set( 0, 0, 2, 2 );

three.js r.66

three.js的设计目的是易于使用,而不是易于修改。这在将来可能会改变。。。首先,尝试添加
material.defines
如下:
var defines={};定义[“使用地图”]=“”。在材质构造函数中指定
defines:defines
,看看这是否有帮助。谢谢,您的修改与我使用的“materials.map”hack具有相同的效果。加载纹理贴图,但重复不是
shaderUniforms[“offsetRepeat”].value.set(0,0,2,2)
解决了问题,但我似乎无法将其标记为solvedI为您创建了答案。这仍然是向着色器材质(r92)添加阴影支持的首选方法吗?@Hobbes是的---
shaderUniforms[ "offsetRepeat" ].value.set( 0, 0, 2, 2 );