【发布时间】:2014-09-26 00:50:10
【问题描述】:
将 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);
这会导致:
- 黑色材料。
- 控制台没有错误。
- 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;
- 在材质实例化期间尝试添加定义['USE_MAP']。
- 尝试添加material.dynamic = true。
- 我有一个正确的渲染循环(与地形的交互工作正常)。
我仍然想知道:
- 这是一款多人游戏,使用带有 express + socket.io 的自定义端口。我是否受到任何 Webgl 安全策略的影响?
- 我目前没有灯光逻辑,有问题吗?
- 也许着色器材质在实例化时需要其他“定义”?
我想我忽略了一些更简单的东西,这就是我问的原因...... 谢谢。
【问题讨论】:
-
如果没有你的所有代码,调试起来有点困难——但我肯定会建议在你的场景中添加一个 AmbientLight 来检查模型是否真的有纹理。我发现你通常可以有一个纹理渲染(即草)并且看起来是正确的,只是意识到你做错了并且它忽略了照明。 :)
-
非常感谢您的建议。我检查了灯亮着,并没有更好。我取得了一些进展,但是我的手弄脏了渲染器代码。我发现由于某种原因将 texture.needsUpdate 属性设置为 false !如果我删除第 26278 行的条件检查 -setTexture 函数 - 纹理将被渲染。
-
因此新的问题是:纹理的 needsUpdate 属性在哪里以及为什么可以从 true 设置为 false。