【问题标题】:Three.js-Porting this custom shaderThree.js-移植这个自定义着色器
【发布时间】:2012-10-20 15:49:56
【问题描述】:

我正在将一个 WebGL 项目移植到 Three.js。事实上,我对Shader和Custom Shader不是很熟悉,所以我不能使用这个shader。请帮我在 Three.js 中使用它。

<script id="shader-fs" type="x-shader/x-fragment">
    precision mediump float;
    varying vec4 color;

    void main(void) {
        gl_FragColor = vec4(color.xyz,1);
    } 
</script>

<script id="shader-vs" type="x-shader/x-vertex">        
    attribute vec4 vertex;      
    attribute vec3 normal;              
    uniform mat4 matrix;
    uniform vec3 diffuse_color;
    uniform mat3 matrixIT;
    varying vec4 color;     

    vec3 SpecularColor = vec3(1.0,1.0,1.0);
    void main(void) {
        vec3 toLight = normalize(vec3(0.0,1.0,1.0));
        vec3 normal_cal = normalize(matrixIT*normal);       
        float NDotL = max(dot(normal_cal, toLight), 0.0);
        vec3 eyeDir = vec3(1.0,1.0,1.0);
        float NDotH = 0.0;
        vec3 SpecularLight = vec3(0.0,0.0,0.0);
        if(NDotL > 0.0)
        {
            vec3 halfVector = normalize( toLight + eyeDir);
            float NDotH = max(dot(normal_cal, halfVector), 0.0);
            float specular = pow(NDotH,25.0);
            SpecularLight = specular * SpecularColor;
        }
        color = vec4((NDotL * diffuse_color.xyz) + (SpecularLight.xyz ), 0.5);
        gl_Position = matrix * vertex;
    }
</script>

【问题讨论】:

    标签: three.js


    【解决方案1】:

    这是你的顶点着色器:

        uniform vec3 diffuse_color;
        varying vec4 color;     
    
        vec3 SpecularColor = vec3(1.0,1.0,1.0);
        void main(void) {
            vec3 toLight = normalize(vec3(0.0,1.0,1.0));
            //vec3 normal_cal = normalize(matrixIT*normal);
            vec3 normal_cal = normalMatrix * normal;
            float NDotL = max(dot(normal_cal, toLight), 0.0);
            vec3 eyeDir = vec3(1.0,1.0,1.0);
            float NDotH = 0.0;
            vec3 SpecularLight = vec3(0.0,0.0,0.0);
            if(NDotL > 0.0)
            {
                vec3 halfVector = normalize( toLight + eyeDir);
                float NDotH = max(dot(normal_cal, halfVector), 0.0);
                float specular = pow(NDotH,25.0);
                SpecularLight = specular * SpecularColor;
            }
            color = vec4((NDotL * diffuse_color.xyz) + (SpecularLight.xyz ), 0.5);
            //gl_Position = matrix * vertex;
            vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
            gl_Position = projectionMatrix * mvPosition;
        }
    

    片段着色器可以保持不变

    这是你的着色器材质定义:

    【讨论】:

      【解决方案2】:

      乍一看,它看起来像是某种 Phong 光照着色器。由于您要迁移到 Three.js,因此可能值得尝试其内置功能。 IE。创建一个灯光(可能是THREE.PointLightTHREE.DirectionalLight),将其添加到场景中并为您的对象使用THREE.MeshPhongMaterial

      【讨论】:

      • 我已经使用了 Phong 和 PointLight 但结果不同,这就是我想在这种情况下使用 ShaderMaterial 的原因。
      • @user1787866 - 它看起来是否损坏,或者您是否正在使用以前的解决方案寻找像素完美?您是否正确设置了镜面反射系数 (25.0) 和灯光位置并尝试了不同的灯光类型?恕我直言,在使用自定义解决方案之前可能值得对这些参数和其他参数进行一些试验,因为内置着色器可以保持代码整洁,并且对例如解决奇怪的驱动程序特定错误,因为它们经过更多测试。您还可以发布三个.js 之前和之后的屏幕截图以及您尝试过的新代码(或者更好的是,一个演示)以进行错误发现。
      • 谢谢塔皮奥。我只是不了解着色器及其工作原理。这就是为什么我必须在这里发布它以获得帮助。我尝试了多种光线,但没有镜面反射系数。明天我回去工作时再试一次;)
      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2012-10-12
      • 2019-07-29
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2016-09-20
      • 2017-01-17
      相关资源
      最近更新 更多