【发布时间】:2019-10-01 08:54:29
【问题描述】:
我正在尝试使用three.js 库将3D 对象呈现为webGL 中的全息图或X 射线。它需要在中心是透明的(以查看背景,可能稍后一些对象将在此体积内)并且在边缘具有明亮的不透明颜色。不应渲染背面隐藏面的面。我是基于网络的图形的新手,所以我不知道我应该使用 GLSL 着色器还是使用混合选项。对不起,愚蠢的问题。
根据tutorial,我可以使用自定义发光着色器达到类似的结果。但这并不能解决背面的问题。 我在 Blender 中获得了足够的外观,创建了一个着色器,通过大于 0.5 的透明度深度限制光路来消除这些面。 There is 我的 Blender 材质的节点。有没有办法在 webGL 中做类似的事情? 当前情况和预期的截图(第二行)是here。
目前我使用来自three.js 库的OBJLoader、WebGLRenderer 和ShaderMaterial。材料定义如下。 CustomShader.js:
const customBrainShader = () => { return {
uniforms:
{
"c": { type: "f", value: 1.0 },
"p": { type: "f", value: 1.9 },
glowColor: { type: "c", value: new THREE.Color(0xcfdfff) },
viewVector: { type: "v3", value: new Vector3(0, 100, 400) }
},
vertexShader: vertexShaderSource,
fragmentShader: fragmentShaderSource,
side: THREE.FrontSide,
blending: THREE.AdditiveBlending,
depthTest: true,
depthWrite: true,
opacity: 0.5
}};
export { customBrainShader };
片段着色器:
uniform vec3 glowColor;
varying float intensity;
void main()
{
vec3 glow = glowColor * intensity;
gl_FragColor = vec4( glow, 1.0 );
}
顶点着色器:
uniform vec3 viewVector;
uniform float c;
uniform float p;
varying float intensity;
void main()
{
vec3 vNormal = normalize( normalMatrix * normal );
vec3 vCamera = vec3(0.0,0.0,1.0);
intensity = pow( c - dot(vNormal, vCamera), p );
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
【问题讨论】:
-
@gman 不,我已经看过那篇文章,我的认识给出了相同的结果。问题是如何隐藏形状背面的面孔。例如,如何隐藏内部器官。
-
设置透明:false,不透明度:1,?我想我对你想要达到的目标感到困惑
-
这些不只是因为你的vCamera固定在+z坐标上才出现吗?您是否尝试过在每一帧上将其更新为制服,看看是否会发生同样的情况?
-
欢迎来到 Stack Overflow。感谢您分享详细的描述和您的代码。如果我正确理解您的目标,您是否希望达到这样的效果? stackoverflow.com/questions/36947704/…
标签: javascript three.js glsl rendering shader