我尝试使用three.js渲染透明物体的两侧。位于透明物体内部的其他物体也应该显示出来。不幸的是,我得到了一些似乎无法处理的伪影。以下是一个测试页面:https://dl.dropbox.com/u/3778149/webgl_translucency/test.html
这里有一个所述伪影的图像。它们似乎来自于潜在的球体几何形状。
有趣的是,当混合模式为THREE.SubtractiveBlending = 2时,这些伪影不可见。
感谢任何帮助!
Alex
Alex
在WebGL和three.js中,自身透明度特别困难。您需要真正理解问题,然后调整代码以实现所需效果。
使用一个技巧,您可以在three.js中实现双面透明球的外观:您需要渲染两个透明球 -- 一个使用 material.side = THREE.BackSide
,另一个使用 material.side = THREE.FrontSide
。
如果您想要自身透明度而不产生伪影,尤其是当允许摄像机或对象移动时,则通常需要使用这种方法。
three.js r.143
gl.enable(gl.CULL_FACE);
gl.cullFace(gl.CW);
drawSphere(); // draws the back of the sphere
drawCube(); // draws the back of the cube
gl.cullFace(gl.CCW);
drawCube(); // draws the front of the cube.
drawSphere(); // draws the front of the sphere.
制作原网格的克隆并翻转其法线;然后为每个克隆网格创建两个相同的“单面”材质,但名称不同。虽然不是最优雅的方法,但它完全可行。我曾经也遇到过同样的问题,这就是我所做的 :P
.json文件看起来像这样:
{
"materials":[
{ "name":"ext", "texture":"f_03.jpg", "ambient":[255.0,255.0,255.0], "diffuse":[255.0,255.0,255.0], "specular":[255.0,255.0,255.0], "opacity":0.7 },
{ "name":"int", "texture":"f_03.jpg", "ambient":[255.0,255.0,255.0], "diffuse":[255.0,255.0,255.0], "specular":[255.0,255.0,255.0], "opacity":0.7 }
],
"meshes":[
{
"name":"Cylinder001",
"material":"ext", ...
{
"name":"Cylinder002",
"material":"int", ...