Javascript 着色器不';在Three.js应用程序中无法工作

Javascript 着色器不';在Three.js应用程序中无法工作,javascript,three.js,Javascript,Three.js,我用Three.js编写了一个程序。我尝试使用着色器,但不幸的是,该应用程序无法工作。我试图从threejs.org定制一个应用程序。代码如下: <html> <head> <title>Test</title> <script type="text/javascript" src="ecma/three.js"></script> <script type="text/javascript"

我用Three.js编写了一个程序。我尝试使用着色器,但不幸的是,该应用程序无法工作。我试图从threejs.org定制一个应用程序。代码如下:

 <html>
<head>
    <title>Test</title>
    <script type="text/javascript" src="ecma/three.js"></script>
    <script type="text/javascript" src="ecma/jquery-1.9.0.js"></script>
    <script type="text/javascript" src="ecma/OrbitControls.js"></script>        
    <style>
        body{ margin: 0; overflow: hidden; }
    </style>
</head>
<body>
    <div id="WebGL-output">
    </div>
    <script id="vertexShader" type="x-shader/x-vertex">
        varying vec2 vUv;

        void main()
        {
            vUv = uv;
            vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
            gl_Position = projectionMatrix * mvPosition;
        }
    </script>

    <script id="fragment_shader1" type="x-shader/x-fragment">
        uniform vec2 resolution;
        uniform float time;
        varying vec2 vUv;

        void main(void)
        {
            vec2 p = -1.0 + 2.0 * vUv;
            float a = time*100.0;
            float d,e,f,g=1.0/40.0,h,i,r,q;

            e=400.0*(p.x*0.5+0.5);
            f=400.0*(p.y*0.5+0.5);
            i=200.0+sin(e*g+a/150.0)*20.0;
            d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
            r=sqrt(pow(i-e,2.0)+pow(d-f,2.0));
            q=f/r;
            e=(r*cos(q))-a/2.0;f=(r*sin(q))-cos(a/2.0);
            d=sin(e*g)*176.0+sin(e*g)*164.0+r;
            h=((f+d)+a/2.0)*g;
            i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
            h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
            h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
            i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
            i=mod(i/5.6,256.0)/64.0;
            if(i<0.0) i+=4.0;
            if(i>=2.0) i=4.0-i;
            d=r/350.0;
            d+=sin(d*d*8.0)*0.52;
            f=(sin(a*g)+1.0)/2.0;
            gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),0.0);
        }
    </script>       

    <script type="text/javascript">
        $(function () {
            var W = window.innerWidth, H = window.innerHeight;
            var plane, planeGeom, planeMat;
            var sphere, sphereGeom, shadedMat;
            var scene, camera, renderer;
            var clock;
            var orbitControls;
            var uniforms1;

            init();     
            makeLights();
            makeFloor();
            makeSphere();
            render();

            function init(){
                scene = new THREE.Scene();
                camera = new THREE.PerspectiveCamera(45, W / H, 0.1, 1000);
                camera.position.set(-40, 30, 0);
                camera.lookAt(new THREE.Vector3(0,0,0));
                renderer = new THREE.WebGLRenderer();
                renderer.setClearColorHex(0xEEEEEE);
                renderer.setSize(W, H);
                renderer.shadowMapEnabled = true;
                orbitControls = new THREE.OrbitControls(camera);
                orbitControls.autoRotate = false;
                clock = new THREE.Clock();                  
            }

            function makeLights(){
                makeAmbientLight();
                makeSpotLight();
            }

            function makeAmbientLight(){
                ambiColor = 0x141414;
                ambientLight = new THREE.AmbientLight(ambiColor);
                scene.add(ambientLight);
            }

            function makeSpotLight(){
                var spotLight = new THREE.SpotLight( 0xffffff );
                spotLight.position.set( -40, 60, -10 );
                spotLight.castShadow = true;
                scene.add( spotLight );
            }

            function makeFloor(){
                planeGeom = new THREE.PlaneGeometry(100,100);
                planeMat = new THREE.MeshLambertMaterial();
                var planeTex = THREE.ImageUtils.loadTexture("picim/checkerboard.jpg");
                planeTex.wrapS = planeTex.wrapT = THREE.RepeatWrapping;
                planeTex.repeat.set(50, 50);
                planeMat.map = planeTex;
                planeMat.side = THREE.DoubleSide;
                plane = new THREE.Mesh(planeGeom, planeMat);
                plane.rotation.x=-0.5*Math.PI;
                plane.position.set(15, 0, 0);
                plane.receiveShadow = true;
                scene.add(plane);
            }

            function makeSphere(){
                sphereGeom = new THREE.SphereGeometry(5,20,20);

                uniforms1 = {
                    time: { type: "f", value: 1.0 },
                    resolution: { type: "v2", value: new THREE.Vector2() }
                };
                shadedMat = new THREE.ShaderMaterial({uniforms: uniforms1, 
                                                      vertexShader: document.getElementById('vertexShader').textContent,
                                                      fragmentShader: document.getElementById('fragment_shader1').textContent,
                                                     });
                sphere = new THREE.Mesh(sphereGeom, shadedMat);
                sphere.position.set(0, 10, 0);
                sphere.castShadow = true;
                scene.add(sphere);
            }

            function render(){
                var delta = clock.getDelta();
                orbitControls.update(delta);                    
                sphere.rotation.y += 0.02;
                requestAnimationFrame(render);
                renderer.render(scene, camera);
            }

            $("#WebGL-output").append(renderer.domElement);
        });
    </script>
</body>
</html>

试验
正文{边距:0;溢出:隐藏;}
可变vec2 vUv;
void main()
{
vUv=紫外线;
vec4 mvPosition=modelViewMatrix*vec4(位置,1.0);
gl_位置=投影矩阵*mvPosition;
}
均匀vec2分辨率;
均匀浮动时间;
可变vec2 vUv;
真空总管(真空)
{
vec2p=-1.0+2.0*vUv;
浮动a=时间*100.0;
浮点数d,e,f,g=1.0/40.0,h,i,r,q;
e=400.0*(p.x*0.5+0.5);
f=400.0*(p.y*0.5+0.5);
i=200.0+sin(e*g+a/150.0)*20.0;
d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
r=sqrt(功率(i-e,2.0)+功率(d-f,2.0));
q=f/r;
e=(r*cos(q))-a/2.0;f=(r*sin(q))-cos(a/2.0);
d=正弦(e*g)*176.0+正弦(e*g)*164.0+r;
h=((f+d)+a/2.0)*g;
i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
i=mod(i/5.6256.0)/64.0;
如果(i=2.0)i=4.0-i;
d=r/350.0;
d+=sin(d*d*8.0)*0.52;
f=(sin(a*g)+1.0)/2.0;
gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),0.0);
}
$(函数(){
var W=window.innerWidth,H=window.innerHeight;
var平面、planeGeom、planeMat;
var sphere、sphereGeom、shadedMat;
var场景、摄影机、渲染器;
无功时钟;
var控制;
var uniforms1;
init();
makeLights();
makeFloor();
makeSphere();
render();
函数init(){
场景=新的三个。场景();
摄像机=新的三个透视摄像机(45,宽/高,0.11000);
摄像机位置设置(-40,30,0);
摄像机。注视(新三个。矢量3(0,0,0));
renderer=new THREE.WebGLRenderer();
renderer.setClearColorHex(0xEEEE);
渲染器。设置大小(W,H);
renderer.shadowMapEnabled=true;
轨道控制=新的三个轨道控制(摄像机);
orbitControls.autoRotate=false;
时钟=新的三个时钟();
}
函数makeLights(){
makeAmbientLight();
makeSpotLight();
}
函数makeAmbientLight(){
ambiColor=0x141414;
ambientLight=新的三个。ambientLight(ambiColor);
场景。添加(环境光);
}
函数makeSpotLight(){
var spotLight=新的三个聚光灯(0xffffff);
聚光灯位置设置(-40,60,-10);
spotLight.castShadow=true;
场景。添加(聚光灯);
}
函数makeFloor(){
planeGeom=新的三个平面几何体(100100);
planeMat=新的三个。MeshLambertMaterial();
var planeTex=3.ImageUtils.loadTexture(“picim/checkboard.jpg”);
planeTex.wrapps=planeTex.wrapT=3.wrapp;
planeTex.重复设置(50,50);
planeMat.map=planeTex;
planeMat.side=3.DoubleSide;
平面=新的三个网格(planeGeom、planeMat);
plane.rotation.x=-0.5*Math.PI;
平面位置集(15,0,0);
plane.receiveShadow=true;
场景。添加(平面);
}
函数makeSphere(){
sphereGeom=新的三个。球度法(5,20,20);
uniforms1={
时间:{type:“f”,值:1.0},
解析:{type:“v2”,值:new THREE.Vector2()}
};
shadedMat=new THREE.ShaderMaterial({uniforms:uniforms1,
vertexShader:document.getElementById('vertexShader').textContent,
fragmentShader:document.getElementById('fragment_shader1').textContent,
});
sphere=新的三点网格(sphereGeom、shadedMat);
球面位置设置(0,10,0);
sphere.castShadow=true;
场景。添加(球体);
}
函数render(){
var delta=clock.getDelta();
轨道控制。更新(增量);
球体旋转y+=0.02;
请求动画帧(渲染);
渲染器。渲染(场景、摄影机);
}
$(“#WebGL输出”).append(renderer.doElement);
});
应用程序必须显示使用着色器的地板和球体。但该应用程序显示了一个明亮的白色球体。你能帮我找出错误吗

谢谢


Ee

如果您看到一个白色球体带有这些疯狂的着色器,那么这意味着着色器不工作

如果你问为什么。。。着色器(这是一个相当不错的着色器)渲染白色,而不是所有的数学运算,很难说有人能帮助您处理呈现的代码


您可以添加类似gl_FragColor.xyz=cos(gl_FragColor.xyz)*.5+.5;您将看到白色是否真的有更大的含义。

您能为它创建一个JSFIDLE吗?我必须承认我不知道怎么做。也许