在着色器材质上应用简单的纹理
使用Threejs(67)和Webgl渲染器,我似乎无法让搭配着色器材质的飞机穿上其纹理。 不管我做什么,材料都会保持黑色。
我目前的代码看起来很基本:
var grassT = new Three.Texture(grass); // grass is an already loaded image.
grassT.wrapS = grassT.wrapT = Three.ClampToEdgeWrapping;
grassT.flipY = false;
grassT.minFilter = Three.NearestFilter;
grassT.magFilter = Three.NearestFilter;
grassT.needsUpdate = true;
var terrainUniforms = {
grassTexture : { type: "t", value: grassT},
}
然后,我在vertexShader中拥有这个相关部分:
vUv = uv;
在fragmentShader方面:
gl_FragColor = texture2D(grassTexture, vUv);
这导致:
我试过/检查了什么:
我仍然想知道的是:
我想我可以忽略更简单的东西,这就是为什么我要问...谢谢。
我在同一着色器上应用各种效果。 我有一个自定义API,通过使用Three.UniformsUtils.merge()
简单地合并所有不同的效果制服。然而,此功能正在调用纹理上的clone()
方法,并导致在texture到达渲染器之前将needsUpdate
重置为false
。
看起来您应该在达到材质级别时将您的纹理needsUpdate
属性设置为true。 在纹理级别上,如果您设置的制服合并,并因此在过程中稍后进行克隆,则会失去其需要的needsUpdate
属性。
这个问题也在这里详细说明:https://github.com/mrdoob/three.js/issues/3393
在我的情况下,以下不起作用( grassT
是我的纹理):
grassT.needsUpdate = true
而以后在代码中完美运行:
material.uniforms.grassTexture.value.needsUpdate = true;
图像加载是异步的。 最有可能的是,您在渲染纹理图像之前渲染场景。
加载图像后,必须将texture.needsUpdate
标志设置为true
。 three.js有一个实用程序可以为你做到这一点:
var texture = THREE.ImageUtils.loadTexture( "texture.jpg" );
渲染器渲染器将texture.needsUpdate
标志设置为false
。
three.js r.68
链接地址: http://www.djcxy.com/p/33985.html