How can I map a texture image onto a shader geometry?












1















I have 2 scenes, in one of them I have mapped a texture image to a plane geometry and I have simply rendered it, in the other scene I have a cube with shader material, now I want the image texure shown in hte first scene to be mapped to the cube surface, but I dont know how can I do it, can anyone help?



actually there is not enough documentation on what I want to do and I am somehow new to three.js so I have no idea what should I do in my HTML file's vertex and fragment shaders, only have done what I mentioned earlir.



here are my texture image and plane geometry in the first scene and the cube in the other, and also my fragment and vertex shader:



this.vertShader = document.getElementById('vertexShader').innerHTML;
this.fragShader = document.getElementById('fragmentShader').innerHTML;
var geometry = new THREE.BoxGeometry( 0.5, 0.5 );

var material = new THREE.MeshLambertMaterial( { color: "blue", wireframe:
true} );
this.mesh = new THREE.Mesh( geometry, material );
this.scene.add( this.mesh );

var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');
var texMaterial = new THREE.MeshBasicMaterial( { map: texture } );
var texGeometry = new THREE.PlaneGeometry(1, 1);
this.texmesh = new THREE.Mesh(texGeometry, texMaterial);
this.texmesh.position.set(0,0,0);
this.texScene.add(this.texmesh);


vertex shader:
varying vec2 vUv;



void main() {
vUv = uv;

gl_Position = projectionMatrix * modelViewMatrix *
vec4(position,1.0);
}


fragment shader:
uniform sampler2D texture;



varying vec2 vUv;

void main() {
gl_FragColor = texture2D(texture, vUv);
}


I woud like the cube to be covered with the texture image.










share|improve this question




















  • 1





    Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

    – Rabbid76
    Jan 1 at 23:26











  • @Rabbid76 A very informative example :)

    – prisoner849
    Jan 2 at 1:13
















1















I have 2 scenes, in one of them I have mapped a texture image to a plane geometry and I have simply rendered it, in the other scene I have a cube with shader material, now I want the image texure shown in hte first scene to be mapped to the cube surface, but I dont know how can I do it, can anyone help?



actually there is not enough documentation on what I want to do and I am somehow new to three.js so I have no idea what should I do in my HTML file's vertex and fragment shaders, only have done what I mentioned earlir.



here are my texture image and plane geometry in the first scene and the cube in the other, and also my fragment and vertex shader:



this.vertShader = document.getElementById('vertexShader').innerHTML;
this.fragShader = document.getElementById('fragmentShader').innerHTML;
var geometry = new THREE.BoxGeometry( 0.5, 0.5 );

var material = new THREE.MeshLambertMaterial( { color: "blue", wireframe:
true} );
this.mesh = new THREE.Mesh( geometry, material );
this.scene.add( this.mesh );

var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');
var texMaterial = new THREE.MeshBasicMaterial( { map: texture } );
var texGeometry = new THREE.PlaneGeometry(1, 1);
this.texmesh = new THREE.Mesh(texGeometry, texMaterial);
this.texmesh.position.set(0,0,0);
this.texScene.add(this.texmesh);


vertex shader:
varying vec2 vUv;



void main() {
vUv = uv;

gl_Position = projectionMatrix * modelViewMatrix *
vec4(position,1.0);
}


fragment shader:
uniform sampler2D texture;



varying vec2 vUv;

void main() {
gl_FragColor = texture2D(texture, vUv);
}


I woud like the cube to be covered with the texture image.










share|improve this question




















  • 1





    Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

    – Rabbid76
    Jan 1 at 23:26











  • @Rabbid76 A very informative example :)

    – prisoner849
    Jan 2 at 1:13














1












1








1








I have 2 scenes, in one of them I have mapped a texture image to a plane geometry and I have simply rendered it, in the other scene I have a cube with shader material, now I want the image texure shown in hte first scene to be mapped to the cube surface, but I dont know how can I do it, can anyone help?



actually there is not enough documentation on what I want to do and I am somehow new to three.js so I have no idea what should I do in my HTML file's vertex and fragment shaders, only have done what I mentioned earlir.



here are my texture image and plane geometry in the first scene and the cube in the other, and also my fragment and vertex shader:



this.vertShader = document.getElementById('vertexShader').innerHTML;
this.fragShader = document.getElementById('fragmentShader').innerHTML;
var geometry = new THREE.BoxGeometry( 0.5, 0.5 );

var material = new THREE.MeshLambertMaterial( { color: "blue", wireframe:
true} );
this.mesh = new THREE.Mesh( geometry, material );
this.scene.add( this.mesh );

var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');
var texMaterial = new THREE.MeshBasicMaterial( { map: texture } );
var texGeometry = new THREE.PlaneGeometry(1, 1);
this.texmesh = new THREE.Mesh(texGeometry, texMaterial);
this.texmesh.position.set(0,0,0);
this.texScene.add(this.texmesh);


vertex shader:
varying vec2 vUv;



void main() {
vUv = uv;

gl_Position = projectionMatrix * modelViewMatrix *
vec4(position,1.0);
}


fragment shader:
uniform sampler2D texture;



varying vec2 vUv;

void main() {
gl_FragColor = texture2D(texture, vUv);
}


I woud like the cube to be covered with the texture image.










share|improve this question
















I have 2 scenes, in one of them I have mapped a texture image to a plane geometry and I have simply rendered it, in the other scene I have a cube with shader material, now I want the image texure shown in hte first scene to be mapped to the cube surface, but I dont know how can I do it, can anyone help?



actually there is not enough documentation on what I want to do and I am somehow new to three.js so I have no idea what should I do in my HTML file's vertex and fragment shaders, only have done what I mentioned earlir.



here are my texture image and plane geometry in the first scene and the cube in the other, and also my fragment and vertex shader:



this.vertShader = document.getElementById('vertexShader').innerHTML;
this.fragShader = document.getElementById('fragmentShader').innerHTML;
var geometry = new THREE.BoxGeometry( 0.5, 0.5 );

var material = new THREE.MeshLambertMaterial( { color: "blue", wireframe:
true} );
this.mesh = new THREE.Mesh( geometry, material );
this.scene.add( this.mesh );

var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');
var texMaterial = new THREE.MeshBasicMaterial( { map: texture } );
var texGeometry = new THREE.PlaneGeometry(1, 1);
this.texmesh = new THREE.Mesh(texGeometry, texMaterial);
this.texmesh.position.set(0,0,0);
this.texScene.add(this.texmesh);


vertex shader:
varying vec2 vUv;



void main() {
vUv = uv;

gl_Position = projectionMatrix * modelViewMatrix *
vec4(position,1.0);
}


fragment shader:
uniform sampler2D texture;



varying vec2 vUv;

void main() {
gl_FragColor = texture2D(texture, vUv);
}


I woud like the cube to be covered with the texture image.







javascript three.js glsl






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 2 at 21:39









Rabbid76

39.7k123250




39.7k123250










asked Jan 1 at 23:22









navid_ashrafinavid_ashrafi

185




185








  • 1





    Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

    – Rabbid76
    Jan 1 at 23:26











  • @Rabbid76 A very informative example :)

    – prisoner849
    Jan 2 at 1:13














  • 1





    Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

    – Rabbid76
    Jan 1 at 23:26











  • @Rabbid76 A very informative example :)

    – prisoner849
    Jan 2 at 1:13








1




1





Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

– Rabbid76
Jan 1 at 23:26





Three.js - Vertex Shader UV variable return only 0,0 contains an example with a shader and a texture.

– Rabbid76
Jan 1 at 23:26













@Rabbid76 A very informative example :)

– prisoner849
Jan 2 at 1:13





@Rabbid76 A very informative example :)

– prisoner849
Jan 2 at 1:13












1 Answer
1






active

oldest

votes


















0














In the fragment shader has to be declared a uniform variable of type sampler2D:



Vertex Shader:



varying vec2 vUv;

void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}


Fragment Shader:



precision highp float;

uniform sampler2D u_texture; // <---------------------------------- texture sampler uniform

varying vec2 vUv;

void main(){
gl_FragColor = texture2D(u_texture, vUv);
}


With the shaders a THREE.ShaderMaterial can be created.



First load the texture:



var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');


Then specify the set of Uniforms (in this case there is the texture uniform only):



var uniforms = {
u_texture: {type: 't', value: texture}
};


Finally create the material:



var material = new THREE.ShaderMaterial({  
uniforms: uniforms,
vertexShader: document.getElementById('vertex-shader').textContent,
fragmentShader: document.getElementById('fragment-shader').textContent
});


The material can be used in the same manner as any other material, see the example:






(function onLoad() {
var loader, camera, scene, renderer, orbitControls;

init();
animate();

function createModel() {

var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

var uniforms = {
u_texture: {type: 't', value: texture}
};

var material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: document.getElementById('vertex-shader').textContent,
fragmentShader: document.getElementById('fragment-shader').textContent
});

var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);
}

function init() {
renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
document.body.appendChild(renderer.domElement);

camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, 1, -2);

loader = new THREE.TextureLoader();
loader.setCrossOrigin("");

scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
scene.add(camera);
window.onresize = resize;

orbitControls = new THREE.OrbitControls(camera);

addGridHelper();
createModel();
}

function addGridHelper() {

var helper = new THREE.GridHelper(100, 100);
helper.material.opacity = 0.25;
helper.material.transparent = true;
scene.add(helper);

var axis = new THREE.AxesHelper(1000);
scene.add(axis);
}

function resize() {

var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}

function animate() {
requestAnimationFrame(animate);
orbitControls.update();
render();
}

function render() {
renderer.render(scene, camera);
}
})();

<script type='x-shader/x-vertex' id='vertex-shader'>
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
</script>

<script type='x-shader/x-fragment' id='fragment-shader'>
precision highp float;
uniform sampler2D u_texture;
varying vec2 vUv;
void main(){
gl_FragColor = texture2D(u_texture, vUv);
}
</script>

<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>








share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53999716%2fhow-can-i-map-a-texture-image-onto-a-shader-geometry%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    In the fragment shader has to be declared a uniform variable of type sampler2D:



    Vertex Shader:



    varying vec2 vUv;

    void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }


    Fragment Shader:



    precision highp float;

    uniform sampler2D u_texture; // <---------------------------------- texture sampler uniform

    varying vec2 vUv;

    void main(){
    gl_FragColor = texture2D(u_texture, vUv);
    }


    With the shaders a THREE.ShaderMaterial can be created.



    First load the texture:



    var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');


    Then specify the set of Uniforms (in this case there is the texture uniform only):



    var uniforms = {
    u_texture: {type: 't', value: texture}
    };


    Finally create the material:



    var material = new THREE.ShaderMaterial({  
    uniforms: uniforms,
    vertexShader: document.getElementById('vertex-shader').textContent,
    fragmentShader: document.getElementById('fragment-shader').textContent
    });


    The material can be used in the same manner as any other material, see the example:






    (function onLoad() {
    var loader, camera, scene, renderer, orbitControls;

    init();
    animate();

    function createModel() {

    var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

    var uniforms = {
    u_texture: {type: 't', value: texture}
    };

    var material = new THREE.ShaderMaterial({
    uniforms: uniforms,
    vertexShader: document.getElementById('vertex-shader').textContent,
    fragmentShader: document.getElementById('fragment-shader').textContent
    });

    var geometry = new THREE.BoxGeometry( 1, 1, 1 );
    var mesh = new THREE.Mesh(geometry, material);

    scene.add(mesh);
    }

    function init() {
    renderer = new THREE.WebGLRenderer({
    antialias: true,
    alpha: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMap.enabled = true;
    document.body.appendChild(renderer.domElement);

    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
    camera.position.set(0, 1, -2);

    loader = new THREE.TextureLoader();
    loader.setCrossOrigin("");

    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xffffff);
    scene.add(camera);
    window.onresize = resize;

    orbitControls = new THREE.OrbitControls(camera);

    addGridHelper();
    createModel();
    }

    function addGridHelper() {

    var helper = new THREE.GridHelper(100, 100);
    helper.material.opacity = 0.25;
    helper.material.transparent = true;
    scene.add(helper);

    var axis = new THREE.AxesHelper(1000);
    scene.add(axis);
    }

    function resize() {

    var aspect = window.innerWidth / window.innerHeight;
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = aspect;
    camera.updateProjectionMatrix();
    }

    function animate() {
    requestAnimationFrame(animate);
    orbitControls.update();
    render();
    }

    function render() {
    renderer.render(scene, camera);
    }
    })();

    <script type='x-shader/x-vertex' id='vertex-shader'>
    varying vec2 vUv;
    void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
    </script>

    <script type='x-shader/x-fragment' id='fragment-shader'>
    precision highp float;
    uniform sampler2D u_texture;
    varying vec2 vUv;
    void main(){
    gl_FragColor = texture2D(u_texture, vUv);
    }
    </script>

    <script src="https://threejs.org/build/three.min.js"></script>
    <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>








    share|improve this answer






























      0














      In the fragment shader has to be declared a uniform variable of type sampler2D:



      Vertex Shader:



      varying vec2 vUv;

      void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
      }


      Fragment Shader:



      precision highp float;

      uniform sampler2D u_texture; // <---------------------------------- texture sampler uniform

      varying vec2 vUv;

      void main(){
      gl_FragColor = texture2D(u_texture, vUv);
      }


      With the shaders a THREE.ShaderMaterial can be created.



      First load the texture:



      var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');


      Then specify the set of Uniforms (in this case there is the texture uniform only):



      var uniforms = {
      u_texture: {type: 't', value: texture}
      };


      Finally create the material:



      var material = new THREE.ShaderMaterial({  
      uniforms: uniforms,
      vertexShader: document.getElementById('vertex-shader').textContent,
      fragmentShader: document.getElementById('fragment-shader').textContent
      });


      The material can be used in the same manner as any other material, see the example:






      (function onLoad() {
      var loader, camera, scene, renderer, orbitControls;

      init();
      animate();

      function createModel() {

      var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

      var uniforms = {
      u_texture: {type: 't', value: texture}
      };

      var material = new THREE.ShaderMaterial({
      uniforms: uniforms,
      vertexShader: document.getElementById('vertex-shader').textContent,
      fragmentShader: document.getElementById('fragment-shader').textContent
      });

      var geometry = new THREE.BoxGeometry( 1, 1, 1 );
      var mesh = new THREE.Mesh(geometry, material);

      scene.add(mesh);
      }

      function init() {
      renderer = new THREE.WebGLRenderer({
      antialias: true,
      alpha: true
      });
      renderer.setPixelRatio(window.devicePixelRatio);
      renderer.setSize(window.innerWidth, window.innerHeight);
      renderer.shadowMap.enabled = true;
      document.body.appendChild(renderer.domElement);

      camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
      camera.position.set(0, 1, -2);

      loader = new THREE.TextureLoader();
      loader.setCrossOrigin("");

      scene = new THREE.Scene();
      scene.background = new THREE.Color(0xffffff);
      scene.add(camera);
      window.onresize = resize;

      orbitControls = new THREE.OrbitControls(camera);

      addGridHelper();
      createModel();
      }

      function addGridHelper() {

      var helper = new THREE.GridHelper(100, 100);
      helper.material.opacity = 0.25;
      helper.material.transparent = true;
      scene.add(helper);

      var axis = new THREE.AxesHelper(1000);
      scene.add(axis);
      }

      function resize() {

      var aspect = window.innerWidth / window.innerHeight;
      renderer.setSize(window.innerWidth, window.innerHeight);
      camera.aspect = aspect;
      camera.updateProjectionMatrix();
      }

      function animate() {
      requestAnimationFrame(animate);
      orbitControls.update();
      render();
      }

      function render() {
      renderer.render(scene, camera);
      }
      })();

      <script type='x-shader/x-vertex' id='vertex-shader'>
      varying vec2 vUv;
      void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
      }
      </script>

      <script type='x-shader/x-fragment' id='fragment-shader'>
      precision highp float;
      uniform sampler2D u_texture;
      varying vec2 vUv;
      void main(){
      gl_FragColor = texture2D(u_texture, vUv);
      }
      </script>

      <script src="https://threejs.org/build/three.min.js"></script>
      <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>








      share|improve this answer




























        0












        0








        0







        In the fragment shader has to be declared a uniform variable of type sampler2D:



        Vertex Shader:



        varying vec2 vUv;

        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }


        Fragment Shader:



        precision highp float;

        uniform sampler2D u_texture; // <---------------------------------- texture sampler uniform

        varying vec2 vUv;

        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }


        With the shaders a THREE.ShaderMaterial can be created.



        First load the texture:



        var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');


        Then specify the set of Uniforms (in this case there is the texture uniform only):



        var uniforms = {
        u_texture: {type: 't', value: texture}
        };


        Finally create the material:



        var material = new THREE.ShaderMaterial({  
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });


        The material can be used in the same manner as any other material, see the example:






        (function onLoad() {
        var loader, camera, scene, renderer, orbitControls;

        init();
        animate();

        function createModel() {

        var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

        var uniforms = {
        u_texture: {type: 't', value: texture}
        };

        var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });

        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var mesh = new THREE.Mesh(geometry, material);

        scene.add(mesh);
        }

        function init() {
        renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
        });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true;
        document.body.appendChild(renderer.domElement);

        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
        camera.position.set(0, 1, -2);

        loader = new THREE.TextureLoader();
        loader.setCrossOrigin("");

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xffffff);
        scene.add(camera);
        window.onresize = resize;

        orbitControls = new THREE.OrbitControls(camera);

        addGridHelper();
        createModel();
        }

        function addGridHelper() {

        var helper = new THREE.GridHelper(100, 100);
        helper.material.opacity = 0.25;
        helper.material.transparent = true;
        scene.add(helper);

        var axis = new THREE.AxesHelper(1000);
        scene.add(axis);
        }

        function resize() {

        var aspect = window.innerWidth / window.innerHeight;
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = aspect;
        camera.updateProjectionMatrix();
        }

        function animate() {
        requestAnimationFrame(animate);
        orbitControls.update();
        render();
        }

        function render() {
        renderer.render(scene, camera);
        }
        })();

        <script type='x-shader/x-vertex' id='vertex-shader'>
        varying vec2 vUv;
        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
        </script>

        <script type='x-shader/x-fragment' id='fragment-shader'>
        precision highp float;
        uniform sampler2D u_texture;
        varying vec2 vUv;
        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }
        </script>

        <script src="https://threejs.org/build/three.min.js"></script>
        <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>








        share|improve this answer















        In the fragment shader has to be declared a uniform variable of type sampler2D:



        Vertex Shader:



        varying vec2 vUv;

        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }


        Fragment Shader:



        precision highp float;

        uniform sampler2D u_texture; // <---------------------------------- texture sampler uniform

        varying vec2 vUv;

        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }


        With the shaders a THREE.ShaderMaterial can be created.



        First load the texture:



        var texture = new THREE.TextureLoader().load ('js/textures/earth.jpg');


        Then specify the set of Uniforms (in this case there is the texture uniform only):



        var uniforms = {
        u_texture: {type: 't', value: texture}
        };


        Finally create the material:



        var material = new THREE.ShaderMaterial({  
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });


        The material can be used in the same manner as any other material, see the example:






        (function onLoad() {
        var loader, camera, scene, renderer, orbitControls;

        init();
        animate();

        function createModel() {

        var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

        var uniforms = {
        u_texture: {type: 't', value: texture}
        };

        var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });

        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var mesh = new THREE.Mesh(geometry, material);

        scene.add(mesh);
        }

        function init() {
        renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
        });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true;
        document.body.appendChild(renderer.domElement);

        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
        camera.position.set(0, 1, -2);

        loader = new THREE.TextureLoader();
        loader.setCrossOrigin("");

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xffffff);
        scene.add(camera);
        window.onresize = resize;

        orbitControls = new THREE.OrbitControls(camera);

        addGridHelper();
        createModel();
        }

        function addGridHelper() {

        var helper = new THREE.GridHelper(100, 100);
        helper.material.opacity = 0.25;
        helper.material.transparent = true;
        scene.add(helper);

        var axis = new THREE.AxesHelper(1000);
        scene.add(axis);
        }

        function resize() {

        var aspect = window.innerWidth / window.innerHeight;
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = aspect;
        camera.updateProjectionMatrix();
        }

        function animate() {
        requestAnimationFrame(animate);
        orbitControls.update();
        render();
        }

        function render() {
        renderer.render(scene, camera);
        }
        })();

        <script type='x-shader/x-vertex' id='vertex-shader'>
        varying vec2 vUv;
        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
        </script>

        <script type='x-shader/x-fragment' id='fragment-shader'>
        precision highp float;
        uniform sampler2D u_texture;
        varying vec2 vUv;
        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }
        </script>

        <script src="https://threejs.org/build/three.min.js"></script>
        <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>








        (function onLoad() {
        var loader, camera, scene, renderer, orbitControls;

        init();
        animate();

        function createModel() {

        var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

        var uniforms = {
        u_texture: {type: 't', value: texture}
        };

        var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });

        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var mesh = new THREE.Mesh(geometry, material);

        scene.add(mesh);
        }

        function init() {
        renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
        });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true;
        document.body.appendChild(renderer.domElement);

        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
        camera.position.set(0, 1, -2);

        loader = new THREE.TextureLoader();
        loader.setCrossOrigin("");

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xffffff);
        scene.add(camera);
        window.onresize = resize;

        orbitControls = new THREE.OrbitControls(camera);

        addGridHelper();
        createModel();
        }

        function addGridHelper() {

        var helper = new THREE.GridHelper(100, 100);
        helper.material.opacity = 0.25;
        helper.material.transparent = true;
        scene.add(helper);

        var axis = new THREE.AxesHelper(1000);
        scene.add(axis);
        }

        function resize() {

        var aspect = window.innerWidth / window.innerHeight;
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = aspect;
        camera.updateProjectionMatrix();
        }

        function animate() {
        requestAnimationFrame(animate);
        orbitControls.update();
        render();
        }

        function render() {
        renderer.render(scene, camera);
        }
        })();

        <script type='x-shader/x-vertex' id='vertex-shader'>
        varying vec2 vUv;
        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
        </script>

        <script type='x-shader/x-fragment' id='fragment-shader'>
        precision highp float;
        uniform sampler2D u_texture;
        varying vec2 vUv;
        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }
        </script>

        <script src="https://threejs.org/build/three.min.js"></script>
        <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>





        (function onLoad() {
        var loader, camera, scene, renderer, orbitControls;

        init();
        animate();

        function createModel() {

        var texture = new THREE.TextureLoader().load( 'https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/Gominolas.png' );

        var uniforms = {
        u_texture: {type: 't', value: texture}
        };

        var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: document.getElementById('vertex-shader').textContent,
        fragmentShader: document.getElementById('fragment-shader').textContent
        });

        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var mesh = new THREE.Mesh(geometry, material);

        scene.add(mesh);
        }

        function init() {
        renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
        });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true;
        document.body.appendChild(renderer.domElement);

        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
        camera.position.set(0, 1, -2);

        loader = new THREE.TextureLoader();
        loader.setCrossOrigin("");

        scene = new THREE.Scene();
        scene.background = new THREE.Color(0xffffff);
        scene.add(camera);
        window.onresize = resize;

        orbitControls = new THREE.OrbitControls(camera);

        addGridHelper();
        createModel();
        }

        function addGridHelper() {

        var helper = new THREE.GridHelper(100, 100);
        helper.material.opacity = 0.25;
        helper.material.transparent = true;
        scene.add(helper);

        var axis = new THREE.AxesHelper(1000);
        scene.add(axis);
        }

        function resize() {

        var aspect = window.innerWidth / window.innerHeight;
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = aspect;
        camera.updateProjectionMatrix();
        }

        function animate() {
        requestAnimationFrame(animate);
        orbitControls.update();
        render();
        }

        function render() {
        renderer.render(scene, camera);
        }
        })();

        <script type='x-shader/x-vertex' id='vertex-shader'>
        varying vec2 vUv;
        void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }
        </script>

        <script type='x-shader/x-fragment' id='fragment-shader'>
        precision highp float;
        uniform sampler2D u_texture;
        varying vec2 vUv;
        void main(){
        gl_FragColor = texture2D(u_texture, vUv);
        }
        </script>

        <script src="https://threejs.org/build/three.min.js"></script>
        <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Jan 2 at 9:34

























        answered Jan 2 at 9:18









        Rabbid76Rabbid76

        39.7k123250




        39.7k123250
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53999716%2fhow-can-i-map-a-texture-image-onto-a-shader-geometry%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Monofisismo

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas