我想创建一个类似于undulating sphere中描述的Aerotwist Tutorial的效果。但是,在教程中,Paul在片段着色器中创建了一个假的GLSL硬编码光 - 而我想将信息从three.js PointLight实例传递到我的着色器,操纵顶点/法线,然后执行Phong着色。
我对在three.js中着色场景时对GPU考虑的各种级别的理解如下(例如,坚持使用Phong):
Q1:上述理解是否准确?
Q2:有没有办法在2级和3级之间做点什么?我希望能够自定义着色器来混淆顶点位置/法线,但是当一个非常好的着色器包含在three.js中时,我不想编写自己的Phong着色器。
问题3:如果2级和3级之间没有这样的中间位置,我需要进入3级,那么最好的方法是什么?我是否将光的位置,强度等作为制服传递,进行顶点/正常修改,然后最后明确写出Phong着色计算?
答案 0 :(得分:3)
用three.js做你要求的事情非常简单
我不确定Q []
中的位置Q1
现在你将如何做到这一点。假设您正在学习本教程,并且您有这个着色器:
// same name and type as VS
varying vec3 vNormal;
void main() {
//this is hardcoded you want to pass it from your environment
vec3 light = vec3(0.5, 0.2, 1.0);//it needs to be a uniform
// ensure it's normalized
light = normalize(light);//you can normalize it outside of the shader, since it's a directional light
// calculate the dot product of
// the light to the vertex normal
float dProd = max(0.0,
dot(vNormal, light));
// feed into our frag colour
gl_FragColor = vec4(dProd, // R
dProd, // G
dProd, // B
1.0); // A
}
以下是您需要做的事情:
GLSL
uniform vec3 myLightPos;//comes in
void main(){
vec3 light = normalize(myLightPos);//but you better do this in javascript and just pass the normalized vec3
}
的Javascript
new THREE.ShaderMaterial({
uniforms:{
myLightPos:{
type:"v3",
value: new THREE.Vector3()
}
},
vertexShader: yourVertShader,
fragmentShader: yourFragmentShader
});
答案 1 :(得分:1)
Q1:正确。虽然,该主板上的一些用户已经发布了针对黑客攻击MeshPhongMaterial
的解决方法,但这不是最初的意图。
Q2和Q3:查看ShaderLib.js
,您将看到“法线贴图着色器”。这是一个完美的模板。是的,您可以复制/重命名并根据自己的喜好进行修改。
它使用基于Phong的照明模型,甚至可以为您访问场景灯。你这样称呼它:
var shader = THREE.ShaderLib[ "normalmap" ];
var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
. . .
var parameters = {
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: uniforms,
lights: true // set this flag and you have access to scene lights
};
var material = new THREE.ShaderMaterial( parameters );
请参阅以下示例:http://threejs.org/examples/webgl_materials_normalmap.html和http://threejs.org/examples/webgl_materials_normalmap2.html。
有关要遵循的编码模式,请参阅ShaderLib.js
和ShaderChunk.js
。
three.js r.67