嗨,我正在尝试做某种自定义着色器,但我只想修改顶点位置,而不是材质。 MeshLambert已经具有光照,纹理和我需要的所有东西,但是我确实修改了顶点,确实使对象看起来很自然。
有人可以给我指示吗?
谢谢 !!
有人吗
最简单的方法是创建类似于lambert的自定义ShaderMaterial
,只需将自定义代码添加到顶点着色器即可。
在内部,标准材质使用与ShaderMaterial完全相同的机器,因此您只需要从此处复制和粘贴代码:
https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L1187
嗨@alteredq感谢您的回复。
这就是您所指的?
http://www.interactiveuniverse.net/Shaders.js
我从lambert着色器中提供的数组创建对象,并将它们传递给新的ShaderMaterial实例。
这样做,我得到的是黑色材料,而不受点光源的影响。
差不多好了 ;)
为了使标准材质的功能可以在ShaderMaterial
您还需要设置材质标记(灯光,雾气等):
https://github.com/mrdoob/three.js/blob/master/src/materials/ShaderMaterial.js#L40
shaderMaterial = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
lights: true
});
有效 !!! 非常感谢您,当我完成工作后,我将与大家分享。
@alteredq的最后一个问题是这样做的目的还在于在对象中使用环境贴图,以便为它提供纹理。 我应该如何实现MeshLambertMaterial包含的这种功能?
嗯我认为设置适当的统一( envMap
)应该就足够了,而且您还需要在顶点着色器和片段着色器#define USE_ENVMAP
的顶部停留某个位置。
uniforms[ "envMap" ].texture = myCubeTexture;
vertexShader= [
"#define USE_ENVMAP",
"varying vec3 vLightWeighting;",
THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],
...
fragmentShader = [
"#define USE_ENVMAP",
"uniform float opacity;",
...
请注意,如果您修改了着色器中的顶点位置,则来自静态几何体的法线将不再正确,并且所有内容仍将根据旧位置进行着色。
它工作:D
你们真的很棒,我知道开发人员喜欢看别人用他们的工具做什么,我希望我能尽快完成我的项目(这是我的个人档案,我正在使用websocket在具有球形的空间界面中连接用户(每个人都是一个不同的项目),用户在空间中导航,每个用户都是在我的作品中移动的不同的动态点光源。
引擎功能不错,现在我需要在设计方面做更多的工作。
再次谢谢你!
@maurrubio您是否完成了您的项目:eyes:
最有用的评论
@maurrubio您是否完成了您的项目:eyes: