2016-11-30 102 views
2

我有一个非常基本的场景,其中包含一个立方体形状的粒子网格。你可以在这里找到它:https://codepen.io/sungaila/pen/qqVXKMThree.js着色器材质不显示粒子

我的问题是,如果我使用ShaderMaterial,我无法得到要显示的粒子。以下是我的(很简单)shader代码:

<script type = 'x-shader/x-vertex' id = 'vertexShader'> 
void main() { 
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
} 
</script> 

<script type = 'x-shader-x-fragment' id = 'fragmentShader'> 
void main() { 
    gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0); 
} 
</script> 

而下面是相关的JS代码:

geometry = new THREE.BoxBufferGeometry(10,10,10, 5, 5, 5); 

material = new THREE.ShaderMaterial({ 
vertexShader: document.getElementById('vertexShader').textContent, 
fragmentShader: document.getElementById('fragmentShader').textContent 
}); 

particles = new THREE.Points(geometry, material); 

东西我注意到的是,如果我注释掉“物质”的线条,材质将默认为“PointsMaterial”,并显示粒子。此外,即使我觉得我还没有将它们连接在一起,粒子的颜色也会受到着色器代码的影响。

如何使用ShaderMaterial获取粒子显示?

回答

2

您需要在顶点着色器中设置gl_PointSize

<script type = 'x-shader/x-vertex' id = 'vertexShader'> 
void main() { 
    vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); 
    gl_PointSize = 1.0 * (300.0/-mvPosition.z); 
    gl_Position = projectionMatrix * mvPosition; 
} 
</script>