GLSL:具有自定义着色器的ShaderMaterial不透明

时间:2013-10-11 10:40:38

标签: three.js glsl webgl

我尝试在这样的球体上绘制纹理:

script(type='x-shader/x-vertex')#Vertex
  varying vec2 vUv;
  void main() {
  vUv = uv;
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  }      

script(type='x-shader/x-fragment')#Fragment
  uniform sampler2D baseTexture;
  varying vec2 vUv;

  void main() {                   
    vec4 baseColor = texture2D( baseTexture, vUv );  
    gl_FragColor = baseColor;
  }

this.materials = new THREE.ShaderMaterial( { 
  uniforms: this.uniforms, 
  vertexShader: document.getElementById( 'Vertex' ).textContent, 
  fragmentShader: document.getElementById( 'Fragment' ).textContent,
  transparent: true,
  blending: THREE.AdditiveBlending 
});

这确实可以正常工作,但即使我更改了alpha值,纹理也不透明。纹理中的透明像素只是黑色。

但是如果我写baseColor.a = 0.0,我再也看不到纹理了,但也看不到场景背后的纹理。我想我不知道将纹理与背景混合在一起?

如何使用GLSL在three.js中实现这一目标?

由于

1 个答案:

答案 0 :(得分:1)

我不知道THREE.js是如何在引擎盖下工作但我看到你将混合设置为加法。这不是你想要的alpha混合。Alpha blending使用 这个功能:

 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

添加剂使用时:

  glBlendFunc(GL_ONE, GL_ONE);

因此,请确保使用第一个,并且您的纹理实际上是alpha通道作为RGBA的一个组件。