三个JS透明与着色器材料
Three JS transparancy with ShaderMaterial
我正在绘制两个相邻的几何图形并让它们旋转。问题是第一个绘制的阻碍了第二个,透明度应该生效。这两个对象应具有相同的透明度,无论谁先绘制。这就是打开混合和关闭深度测试的原因。以下是图片:
两种几何形状都是使用THREE的点云。着色器材质如下:
var shaderMaterial = new THREE.ShaderMaterial({
uniforms: uniforms,
attributes: attributes,
vertexShader: document.getElementById('vertexshader').textContent,
fragmentShader: document.getElementById('fragmentshader').textContent,
blending: THREE.NormalBlending,
depthTest: false,
transparent: true
});
哪里
// attributes
attributes = {
size: { type: 'f', value: null },
alpha: { type: 'f', value: [] },
customColor: { type: 'c', value: null }
};
// uniforms
uniforms = {
color: { type: "c", value: new THREE.Color(0x00ff00) },
texture: { type: "t", value: THREE.ImageUtils.loadTexture("../textures/sprites/circle.png") }
};
和
<script type="x-shader/x-vertex" id="vertexshader">
attribute float alpha;
attribute float size;
attribute vec3 customColor;
varying float vAlpha;
varying vec3 vColor;
void main() {
vAlpha = alpha;
vColor = customColor;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_PointSize = size * ( 120.0 / length( mvPosition.xyz ));
gl_Position = projectionMatrix * mvPosition;
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
uniform vec3 color;
uniform sampler2D texture;
varying float vAlpha;
varying vec3 vColor;
void main() {
gl_FragColor = vec4( vColor, vAlpha );
gl_FragColor = gl_FragColor * texture2D( texture, gl_PointCoord );
}
</script>
具有 2 个纹理的示例代码,但也可以使用一个纹理:
<script id="fragmentShaderLoader" type="x-shader/x-fragment">
uniform float percent;
uniform sampler2D texture1;
uniform sampler2D texture2;
varying vec2 vUv;
void main() {
gl_FragColor = texture2D( texture1, vUv);
vec4 tex2 = texture2D( texture2, vUv );
if(tex2.a - percent < 0.0) {
gl_FragColor.a = 0.0;
//or without transparent = true use
//discard;
}
}
</script>
<script id="vertexShaderLoader" type="x-shader/x-vertex">
varying vec2 vUv;
void main()
{
vUv = uv;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_Position = projectionMatrix * mvPosition;
}
</script>
然后对于初始化:
uniformsMove = {
percent: { type: "f", value: 1.0 },
texture1: { type: "t", value: (new THREE.TextureLoader()).load( "govr/loader-test.png" ) },
texture2: { type: "t", value: (new THREE.TextureLoader()).load( "govr/loader-mask2.png" ) }
};
material = new THREE.ShaderMaterial( {
uniforms: uniformsMove,
vertexShader: document.getElementById( 'vertexShaderLoader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShaderLoader' ).textContent
} );
material.transparent = true;
相关文章:
- 无法读取属性'材料'未定义的Three.js
- 从 JS 更新角度材料输入值
- 三.js 使用按钮更改 .obj 文件的材料
- 三个JS透明与着色器材料
- 阴影捕手在三个.js/阴影在透明材料上
- 透明材料与三JS
- node.js & mongo schema,寻找一些介绍材料,也许是教程
- 在 Ember.js 应用程序中初始化引导材料设计
- 如何在js中创建材料设计对话框
- 自定义材料设计CSS&JS组件
- 试图在A-Frame中通过three.js编辑材料的侧面属性会导致不正确的渲染
- Three.js合并网格,但保留单独的材料
- js -材料不加载对象
- 我想加载一个.obj文件,并在运行时通过按钮点击使用three.js改变它的纹理/材料
- js使用背景材料
- three.js:如何为一个网格获得多个材料
- 在three.js中合并模型和材料的问题
- js:是否有一种方法可以从子模板中访问材料前端内容?
- js无法加载材料(无法读取属性'length'未定义)
- JS中材料设计应用程序中的空屏幕