Javascript 如何正确设置自定义着色器材质的照明
我有一个在three.js中使用带有自定义着色器的高度贴图的演示。它(现在)很好用。JSFIDLE是。着色器本身位于此处: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
<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