three.js: 在着色器中使用纹理 material 添加到对象加载器加载的对象
three.js: use texture in shader material added to object loaded by object loader
当我尝试在着色器中使用纹理时遇到问题 material 用于由对象加载器加载的搅拌器对象 THREE.OBJLoader
。
这个简单的代码工作正常,它正在加载纹理并将其应用于加载的对象。
var manager = new THREE.LoadingManager();
var texture = new THREE.Texture();
var imageLoader = new THREE.ImageLoader(manager);
var objLoader = new THREE.OBJLoader(manager);
imageLoader.load("texture.png", function (image) {
texture.image = image;
texture.needsUpdate = true;
});
var material = new THREE.MeshBasicMaterial({ map: texture});
objLoader.load("blenderObject.obj", function (object) {
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.material = material;
}
});
scene.add(object);
但我想使用我的 ShaderMaterial
而不是 MeshBasicMaterial
。这个着色器 material 与我在我的项目中使用的其他对象一起工作。这是我的着色器的初始化 material:
var uniforms = {
texture: { type: "t", value: THREE.ImageUtils.loadTexture("texture.png") },
}
var shader = THREE.ShaderLib["shader"];
var material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader,
depthTest: true,
});
所以当我使用这个 material 而不是 MeshBasicMaterial
时,我没有错误,但对象只是全黑。我想知道在着色器 material 中使用由 THREE.OBJLoader
创建的对象的纹理的正确方法是什么。当我将此着色器应用于其他对象时,它的工作方式与应有的完全一样。提前感谢任何答案。
所有纹理生而平等。创建对象的方式没有区别。
您的代码存在的问题是,当您分配 uniforms
变量时,您的纹理值将为空,因为 THREE.ImageUtils.loadTexture()
是异步的。使用 THREE.TextureLoader()
的正确方法记录在:http://threejs.org/docs/#Reference/Loaders/TextureLoader
当我尝试在着色器中使用纹理时遇到问题 material 用于由对象加载器加载的搅拌器对象 THREE.OBJLoader
。
这个简单的代码工作正常,它正在加载纹理并将其应用于加载的对象。
var manager = new THREE.LoadingManager();
var texture = new THREE.Texture();
var imageLoader = new THREE.ImageLoader(manager);
var objLoader = new THREE.OBJLoader(manager);
imageLoader.load("texture.png", function (image) {
texture.image = image;
texture.needsUpdate = true;
});
var material = new THREE.MeshBasicMaterial({ map: texture});
objLoader.load("blenderObject.obj", function (object) {
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.material = material;
}
});
scene.add(object);
但我想使用我的 ShaderMaterial
而不是 MeshBasicMaterial
。这个着色器 material 与我在我的项目中使用的其他对象一起工作。这是我的着色器的初始化 material:
var uniforms = {
texture: { type: "t", value: THREE.ImageUtils.loadTexture("texture.png") },
}
var shader = THREE.ShaderLib["shader"];
var material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader,
depthTest: true,
});
所以当我使用这个 material 而不是 MeshBasicMaterial
时,我没有错误,但对象只是全黑。我想知道在着色器 material 中使用由 THREE.OBJLoader
创建的对象的纹理的正确方法是什么。当我将此着色器应用于其他对象时,它的工作方式与应有的完全一样。提前感谢任何答案。
所有纹理生而平等。创建对象的方式没有区别。
您的代码存在的问题是,当您分配 uniforms
变量时,您的纹理值将为空,因为 THREE.ImageUtils.loadTexture()
是异步的。使用 THREE.TextureLoader()
的正确方法记录在:http://threejs.org/docs/#Reference/Loaders/TextureLoader