Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确设置自定义着色器材质的照明_Javascript_Three.js_Glsl - Fatal编程技术网

Javascript 如何正确设置自定义着色器材质的照明

Javascript 如何正确设置自定义着色器材质的照明,javascript,three.js,glsl,Javascript,Three.js,Glsl,我有一个在three.js中使用带有自定义着色器的高度贴图的演示。它(现在)很好用。JSFIDLE是。着色器本身位于此处: <script id="vertexShader" type="x-shader/x-vertex"> uniform sampler2D vTexture; uniform float vScale; uniform vec3 vLut[ 256 ]; varyin

我有一个在three.js中使用带有自定义着色器的高度贴图的演示。它(现在)很好用。JSFIDLE是。着色器本身位于此处:

<script id="vertexShader" type="x-shader/x-vertex">
        uniform sampler2D   vTexture;
        uniform float       vScale;
        uniform vec3        vLut[ 256 ];

        varying vec3        vColor;

        void main() {

            vec4 heightData = texture2D( vTexture, uv );

            // if the map is grayscale it doesn't matter if you use r, g, or b.
            float vAmount = heightData.r;

            // fetch the color from the lookup table so it gets passed to the fragment shader
            int index = int(heightData.r * 255.0);
            vColor = vLut[index];

            // move the position along the normal
            vec3 newPosition = position + normal * vScale * vAmount;

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

    <script id="fragmentShader" type="x-shader/x-vertex">

        varying vec3  vColor;

        void main() {

            gl_FragColor = vec4(vColor, 1.0);
        }
    </script>

均匀的二维纹理;
均匀浮点数;
均匀vec3 vLut[256];
可变vec3颜色;
void main(){
vec4高度数据=纹理2D(V纹理,uv);
//如果贴图是灰度的,则使用r、g或b并不重要。
浮阀安装=高度数据.r;
//从查找表中获取颜色,以便将其传递给片段着色器
int index=int(heightData.r*255.0);
vColor=vLut[索引];
//沿法线移动位置
vec3新位置=位置+正常*vScale*vAmount;
gl_位置=投影矩阵*模型视图矩阵*向量4(新位置,1.0);
}
可变vec3颜色;
void main(){
gl_FragColor=vec4(vColor,1.0);
}
问题是它没有正确的照明,所以阴影等等是不正确的。我怀疑,因为我已经改变了着色器中的顶点位置,我应该以某种方式更新顶点法线,但可能不止这些。我试过各种各样的“*needsUpdating=true”,但都没有用。我已经在three.js文档和web上探索过,但没有找到圣杯


如果您有任何建议或建议,我们将不胜感激。

由于您使用自定义着色器,因此您需要在着色器中自己进行照明计算。这可能会帮助您:

以下是自定义照明()的完整示例:


可变vec2 vUv;
可变vec3 vecPos;
可变的vec3向量正常;
void main(){
vUv=紫外线;
//由于灯光处于摄影机坐标中,
//我还需要摄影机坐标中的顶点位置
vecPos=(modelViewMatrix*vec4(位置,1.0)).xyz;
//这并不是你应该如何改变你的想法
//法线,但这将很好地工作,因为我的模型
//矩阵是非常基本的
vecNormal=(modelViewMatrix*vec4(法线,0.0)).xyz;
gl_位置=投影矩阵*
vec4(vecPos,1.0);
}
高精度浮点;
可变vec2 vUv;
可变vec3 vecPos;
可变的vec3向量正常;
均匀的浮光强度;
均匀取样器;二维纹理取样器;
结构点光源{
vec3颜色;
vec3位置;//灯光位置,以摄影机坐标表示
浮动距离;//用于衰减目的。自
//我们正在编写自己的着色器,它可以
//真的是我们想要的任何东西(只要
//我们把它分配给我们的光
//“距离”字段
};
统一点光源点光源[NUM_POINT_LIGHTS];
真空总管(真空){
//相当基本的朗伯照明。。。
vec4 addedLights=vec4(0.0,
0.0,
0.0,
1.0);
对于(int l=0;l