使用WebGL渲染器和Three.js(67)时,我似乎无法使具有着色器材质的平面穿上它的纹理。无论我怎么做,材质看起来都是黑色的。
目前我的代码非常基本:
在 fragmentShader 方面:
这将导致:
目前我的代码非常基本:
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);
这将导致:
- 黑色材料。
- 控制台没有错误。
- gl_FragColor的值始终为(0.0, 0.0, 0.0, 1.0)。
- 如果只应用自定义纯色,一切都正常。
- 如果我也使用vertexColors和纯色,一切都正常。
- 我的纹理宽度/高度确实是2的幂次方。
- 图像与代码在同一台服务器上。
- 测试了其他结果相同的图像。
- 图像实际上在浏览器调试器中加载。
- 网格的UVS是正确的。
- 调整wrapT、wrapS、minFilter、magFilter。
- 调整网格大小,使纹理具有1:1比例。
- 使用requirejs图像插件预加载图像,并从THREE.Texture()创建纹理,而不是使用THREE.ImageUtils();
- 尝试添加needsUpdate : true;
- 在材质实例化期间尝试添加defines['USE_MAP']。
- 尝试添加material.dynamic = true。
- 我有一个正确的渲染循环(与地形的交互正在工作)。
- 这是使用express + socket.io使用自定义端口的多人游戏。我是否受到任何Webgl安全策略的影响?
- 我目前没有灯光逻辑,这是问题吗?
- 也许着色器材质需要其他“defines”在实例化时?