Estoy tratando de crear una nube de puntos en Three.js r133 donde las partículas se colocan en la superficie de una esfera virtual. Este es el código que estoy usando:
const particlesGeometry = new THREE.SphereGeometry(...) const particlesMaterial = new THREE.ShaderMaterial({ depthWrite: false, vertexColors: true, transparent: true, vertexShader: particleVertexShader, fragmentShader: particleFragmentShader, })En el sombreador de vértices, solo aumento el tamaño de los puntos y tomo en cuenta la atenuación del tamaño:
gl_Position = projectedPosition; gl_PointSize = 20.0; // size attenuation gl_PointSize *= (1.0 / - viewPosition.z);El sombreador de fragmentos es bastante básico pero da resultados extraños (para mí). este codigo
vec3 color = vec3(gl_PointCoord, 1.0); gl_FragColor = vec4(color, 0.5);produce esta salida:
¿Por qué no se respeta la transparencia? Los puntos comienzan a ser transparentes solo cuando se usa 0.3 o menos como el valor del canal alfa.
El otro problema es que, incluso si las partículas tienen un color opaco, todavía podemos ver los objetos en el fondo sobre los que están en primer plano.
Para resolver esto, pensé que agregar blending: THREE.AdditiveBlending en los parámetros ShaderMaterial debería haber resuelto el problema, pero este es el resultado:
¿Por qué se cambian los colores? Parece que las coordenadas llegan a 1 vía antes de llegar a la esquina inferior derecha, ¿podría ser causado por el aumento del tamaño de mis partículas?
Un último comportamiento extraño que encontré:
float strength = distance(gl_PointCoord, vec2(0.5)); strength = 1.0 - strength; vec3 color = vec3(1.0, 0.5, 0.5); gl_FragColor = vec4(color, strength);genera esto:
mientras que debería representar una partícula con un color sólido en el centro que se vuelve (casi) transparente cerca de los bordes.
De todos modos, obtengo el resultado esperado al calcular la fuerza como 0.5 - strength y deshabilitar la mezcla aditiva. Mantenerlo encendido da como resultado esto:
¿Es la mezcla aditiva la verdadera fuente de problemas aquí? ¿Por qué, incluso después de habilitarlo, todavía puedo ver partículas que no deberían ser visibles? ¿Y por qué las coordenadas de las partículas parecen estar fuera del rango (0.0, 1.0)?