Three.js: 将自定义顶点着色器与MeshLambertMaterial一起使用?

创建于 2011-12-02  ·  9评论  ·  资料来源: mrdoob/three.js

嗨,我正在尝试做某种自定义着色器,但我只想修改顶点位置,而不是材质。 MeshLambert已经具有光照,纹理和我需要的所有东西,但是我确实修改了顶点,确实使对象看起来很自然。

有人可以给我指示吗?

谢谢 !!

Question

最有用的评论

@maurrubio您是否完成了您的项目:eyes:

所有9条评论

有人吗

最简单的方法是创建类似于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:

此页面是否有帮助?
0 / 5 - 0 等级