Подтвердить что ты не робот

Пользовательский шейдер текстуры в файле Three.js

Я просто хочу создать очень простой шейдер фрагмента, который рисует указанную текстуру в сетку. Я рассмотрел несколько пользовательских шейдеров фрагментов, которые сделали то же самое, и построили мои собственные шейдеры и поддерживали JS-код вокруг него. Однако он просто не работает. Здесь работает абстракция кода, который я пытаюсь запустить:

Vertex Shader

<script id="vertexShader" type="x-shader/x-vertex">
    varying vec2 vUv;

    void main() {
        vUv = uv;

        gl_Position =   projectionMatrix * 
                        modelViewMatrix * 
                        vec4(position,1.0);
    }
</script>

Фрагментный шейдер

<script id="fragmentShader" type="x-shader/x-fragment">
    uniform sampler2D texture1;

    varying vec2 vUv;

    void main() {
        gl_FragColor = texture2D(texture1, vUv); // Displays Nothing
        //gl_FragColor = vec4(0.5, 0.2, 1.0, 1.0); // Works; Displays Flat Color
    }
</script>

Код сцены

<script>
    // Initialize WebGL Renderer
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    var canvas = document.getElementById('canvas').appendChild(renderer.domElement);

    // Initialize Scenes
    var scene = new THREE.Scene();

    // Initialize Camera
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 100);
    camera.position.z = 10;

    // Create Light
    var light = new THREE.PointLight(0xFFFFFF);
    light.position.set(0, 0, 500);
    scene.add(light);

    // Create Ball
    var vertShader = document.getElementById('vertexShader').innerHTML;
    var fragShader = document.getElementById('fragmentShader').innerHTML;

    var uniforms = {
        texture1: { type: 't', value: 0, texture: THREE.ImageUtils.loadTexture( 'texture.jpg' ) }
    };

    var material = new THREE.ShaderMaterial({
        uniforms: uniforms,
        vertexShader: vertShader,
        fragmentShader: fragShader
    });

    var ball = new THREE.Mesh(new THREE.SphereGeometry(1, 50, 50), material);
    scene.add(ball);

    // Render the Scene
    renderer.render(scene, camera);
</script>

texture.jpg существует и отображается при отображении на MeshLambertMaterial. При переключении моего фрагментарного шейдера на простой цвет (комментарий в коде) он правильно отображает мяч.

Выполнение этого ничего не отображает. Я не получаю никаких ошибок, мяч просто не появляется вообще.

Я знаю, что я должен делать что-то принципиально неправильно, но я просматривал те же примеры, в которых этот код, кажется, работает уже пару дней, и я чувствую, что я бил головой о стену. Любая помощь будет оценена!

Изменить: я использую Редактор 51.

4b9b3361

Ответ 1

Вы все еще используете старый синтаксис для униформы

  var uniforms = {
        texture1: { type: "t", value: 0, texture: THREE.ImageUtils.loadTexture( "texture.jpg" ) }
    };

Это новый синтаксис

var uniforms = {
    texture1: { type: "t", value: THREE.ImageUtils.loadTexture( "texture.jpg" ) }
};