Я пытаюсь визуализировать трехмерный объект так, как он будет выглядеть как голограмма или рентгеновский снимок в webGL с использованием библиотеки three.js. Он должен быть прозрачным в центре (чтобы видеть фон и, возможно, позже некоторые объекты будут внутри этого объема) и иметь яркие непрозрачные цвета по краям. Лица задней скрытой стороны не должны быть обработаны. Я очень новичок в веб-графике, поэтому я не знаю, стоит ли мне работать с шейдером GLSL или играть с параметрами наложения. Извините за глупый вопрос.
Я могу достичь аналогичного результата, используя пользовательский световой шейдер в соответствии с этим учебным пособием . Но это не решает проблему с задними лицами.
Я получил достаточное появление в Blender, создавая шейдер, который устраняет такие грани, ограничивая путь света глубиной прозрачности больше 0,5.
Есть узлов моего материала Blender. Есть ли способ сделать подобное в WebGL?
Скриншоты текущей ситуации и ожидаемой (вторая строка): здесь .
В настоящее время я использую OBJLoader, WebGLRenderer и ShaderMaterial из библиотеки three.js. Материал определяет как следующее.
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 );
}