简体   繁体   English

着色器中的Three.js纹理

[英]Three.js Texture in shaderMaterial

I could not load texture to my shader material, only what I see are just black dot. 我无法将纹理加载到着色器材质中,只有看到的只是黑点。 This is my shader.js 这是我的shader.js

THREE.ShaderLib['cloud'] = {

    uniforms: {
        texture: { type: "t", value: THREE.ImageUtils.loadTexture("img/cloud.png") }
    },

    vertexShader: [
        "varying vec2 vUv;",
        "void main() {",
            "vUv = uv;",
            "gl_PointSize = 8.0;",
            "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}",
    ].join("\n"),

    fragmentShader: [
            "varying vec2 vUv;",
            "uniform sampler2D texture;",
            "void main() {",
                "gl_FragColor = texture2D(texture, vUv);",
            "}",
    ].join("\n")
};

and this is how I'm trying to load and use it: 这就是我试图加载和使用它的方式:

var cloudShader = THREE.ShaderLib["cloud"];
var uniforms = THREE.UniformsUtils.clone(cloudShader.uniforms);

var texture = THREE.ImageUtils.loadTexture("img/cloud.png", undefined, function () {

   uniforms.texture.value = texture;
   texture.needsUpdate = true;

   var _material = new THREE.ShaderMaterial({
      fragmentShader: cloudShader.fragmentShader,
      vertexShader: cloudShader.vertexShader,
      uniforms: uniforms                   
   });                    
   _material.uniforms.texture.value.needsUpdate = true;
   var _geometry = new THREE.Geometry();
   _geometry.vertices.push(new THREE.Vector3(0, 0, 0));
   var _mesh = new THREE.Points(_geometry, _material);
   scene.add(_mesh);

 });

As You can see I'm trying to set update texture value two times, before and after material is created. 如您所见,我正在尝试在创建材质之前和之后两次设置更新纹理值。 It's really simpy example but I have no idea why it is not working in the way that I'm using it. 这确实是一个简单的示例,但是我不知道为什么它不能以我使用它的方式工作。 There is no errors in debug console. 调试控制台中没有错误。

I'm using THREE.Points class, because I'm using it to generate clouds as a particle groups. 我正在使用THREE.Points类,因为我正在使用它来生成作为粒子组的云。

Thanks in advance for any help. 在此先感谢您的帮助。

So, after some time I have found a solution for this specific problem. 因此,一段时间后,我找到了针对此特定问题的解决方案。 I need to move my uniforms from shader.js directly to place where i'm creating shader material. 我需要将我的制服从shader.js直接移动到我创建着色器材质的地方。 This is enough to fix problem with my texture, but still I don't know why previous code doesn't work. 这足以解决我的纹理问题,但是我仍然不知道为什么以前的代码不起作用。 Working shader material looks like this: 可用的着色器材质如下所示:

 var _material = new THREE.ShaderMaterial({
      fragmentShader: cloudShader.fragmentShader,
      vertexShader: cloudShader.vertexShader,
      uniforms: uniforms: {
        texture: { type: "t", value: THREE.ImageUtils.loadTexture("img/cloud.png") }
      },
 });   

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM