Wie können Sie eine Ray-Nachverfolgung zu einer Punktwolke mit einem benutzerdefinierten Vertexshader in three.js durchführen?Raytracing zu einer Punktwolke mit einem benutzerdefinierten Vertexshader in Three.js
Dies ist mein Vertex-Shader
void main() {
vUvP = vec2(position.x/(width*2.0), position.y/(height*2.0)+0.5);
colorP = vec2(position.x/(width*2.0)+0.5 , position.y/(height*2.0) );
vec4 pos = vec4(0.0,0.0,0.0,0.0);
depthVariance = 0.0;
if ((vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>0.0)) {
vec2 smp = decodeDepth(vec2(position.x, position.y));
float depth = smp.x;
depthVariance = smp.y;
float z = -depth;
pos = vec4((position.x/width - 0.5) * z * (1000.0/focallength) * -1.0,(position.y/height - 0.5) * z * (1000.0/focallength),(- z + zOffset/1000.0) * 2.0,1.0);
vec2 maskP = vec2(position.x/(width*2.0), position.y/(height*2.0) );
vec4 maskColor = texture2D(map, maskP);
maskVal = (maskColor.r + maskColor.g + maskColor.b)/3.0 ;
}
gl_PointSize = pointSize;
gl_Position = projectionMatrix * modelViewMatrix * pos;
}
In der Punkte-Klasse wird Raytracing wie folgt umgesetzt:
function testPoint(point, index) {
var rayPointDistanceSq = ray.distanceSqToPoint(point);
if (rayPointDistanceSq < localThresholdSq) {
var intersectPoint = ray.closestPointToPoint(point);
intersectPoint.applyMatrix4(matrixWorld);
var distance = raycaster.ray.origin.distanceTo(intersectPoint);
if (distance < raycaster.near || distance > raycaster.far) return;
intersects.push({
distance: distance,
distanceToRay: Math.sqrt(rayPointDistanceSq),
point: intersectPoint.clone(),
index: index,
face: null,
object: object
});
}
}
var vertices = geometry.vertices;
for (var i = 0, l = vertices.length; i < l; i ++) {
testPoint(vertices[ i ], i);
}
Da ich einen Vertex-Shader verwenden, die geometry.vertices passen Sie nicht zu den Scheitelpunkten auf dem Bildschirm, die verhindert, dass die Ray-Trace funktioniert.
Können wir die Punkte vom Vertex-Shader zurückholen?
Danke !! Ich füge nur für jeden hinzu, der dies in der Zukunft versucht. Im Vertex-Shader können Sie eine Variation festlegen, die Sie dann im Fragment-Shader verwenden können, in dem Sie die Farben der Scheitelpunkte festlegen würden – cjds