光线跟踪是一种基于物理的方法,用于模拟逼真的3D场景。通过所需图像的每个像素从眼睛汲取光线,并且光线与场景的相互作用确定所显示的像素颜色。
注:通过进一步的测试,我意识到编译器的优化可能会引起问题,就像底部记录的时间表可以看到的那样,我的问题仍然存在(为什么
有一种方法可以找出为什么在我的程序生成的3D模型中剔除前脸而不是背面?
const marchingCubes = (scalarField, dims, threshold) => { const geometry = new THREE.BufferGeometry(); const vertices = []; const colors = []; const normals = []; const pA = new THREE.Vector3(); const pB = new THREE.Vector3(); const pC = new THREE.Vector3(); const cB = new THREE.Vector3(); const aB = new THREE.Vector3(); const color = new THREE.Color(); for(let z = 0; z < dims[2] - 1; z++) { for(let y = 0; y < dims[1] - 1; y++) { for(let x = 0; x < dims[0] - 1; x++) { const cube = getCube(scalarField, x, y, z); const cubeIndex = getCubeIndex(cube, threshold); const edges = EdgeMasks[cubeIndex]; if(edges === 0) { continue; } const interpolatedVertices = interpolateEdges(cube, edges, threshold); const triangles = triangleTable[cubeIndex] let i = 0; while(triangles[i] != -1) { const v1 = interpolatedVertices[triangles[i]]; const v2 = interpolatedVertices[triangles[i + 1]]; const v3 = interpolatedVertices[triangles[i + 2]]; pA.set(v1[0], v1[1], v1[2]); pB.set(v2[0], v2[1], v2[2]); pC.set(v3[0], v3[1], v3[2]); cB.subVectors(pC, pB); aB.subVectors(pA, pB); cB.cross(aB); cB.normalize(); const nx = cB.x; const ny = cB.y; const nz = cB.z; const n0 = [nx, ny, nz]; const vx = (x / dims[0]) + 0.5; const vy = (y / dims[1]) + 0.5; const vz = (z / dims[2]) + 0.5; color.setRGB(vx, vy, vz); const c0 = [color.r, color.g, color.b]; vertices.push(...v1, ...v2, ...v3); normals.push(...n0, ...n0, ...n0); colors.push(...c0, ...c0, ...c0); i += 3; } } } } geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)); geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3)); geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3)); geometry.computeBoundingSphere(); return geometry; } const WebApplication = () => { const Ref = useRef(null); const handleButtonClick = async () => { const scene = new THREE.Scene(); scene.add(new THREE.AmbientLight(0x444444, 3)); const light1 = new THREE.DirectionalLight(0xffffff, 1.5); light1.position.set(1, 1, 1); scene.add(light1); const light2 = new THREE.DirectionalLight(0xffffff, 4.5); light2.position.set(0, -1, 0); scene.add(light2); const renderer = new THREE.WebGLRenderer({antialias: true}); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setClearColor(0x000000, 0.5); renderer.setPixelRatio(window.devicePixelRatio); if(Ref.current) { Ref.current.innerHTML = ''; Ref.current.appendChild(renderer.domElement); } const camera = new THREE.PerspectiveCamera(27, window.innerWidth / window.innerHeight, 1, 3500); const controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.dampingFactor = 0.5; controls.update(); . . . const scalarField = generateScalarField(int16Array, dims); const threshold = 0.166666666665; const size = 5; const sigma = 1.0; const kernel = createGaussianKernel(size, sigma); const gaussianFilter = applyGaussianFilter(scalarField, dims, kernel); let geometry = marchingCubes(gaussianFilter, dims, threshold); let material = new THREE.MeshBasicMaterial({color: 0xaaaaaa, specular: 0xffffff, shininess: 250, side: THREE.FrontSide, vertexColors: true}) const cubes = new THREE.Mesh(geometry, material); cubes.position.set(Math.trunc(-(dims[0] / 2)), Math.trunc(-(dims[1] / 2)), Math.trunc(-(dims[2] / 2))); scene.add(cubes); camera.position.z = Math.max(dims[0], dims[1], dims[2]) * 1.5; function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); } return ( <div> <button onClick={handleButtonClick}>vroom vroom</button> <div ref={Ref} style={{ width: "100vw", height: "100vh" }}></div> </div> ); };
我正在尝试将“一个周末的光线追踪”移植到金属计算着色器中。我在我的项目中遇到了这个条带工件: 是因为我的随机生成器不能正常工作吗? 是否...
我正在尝试找出一种方法来检查轴对齐边界框(AABB)是否与金字塔梁相交。是否有已知的算法?有谁知道如何
我一直在关注“一个周末的光线追踪”教程系列,这在学习光线追踪方面似乎相对规范。 我一直在尝试使用 OpenMP 加速代码...
有没有办法遍历OptiX 7加速结构来找到最接近给定点的几何图形?
我知道这不是 OptiX 的主要目标,但当光线行进(球体行进)签名距离场时它是相关的,所以我想我会尝试。我最初为此创建了自己的 BVH,但我很...
我正在寻找在 GLSL 上使用光线追踪来模拟反射效果,但是我找不到与此主题相关的良好参考、示例或教程。当我得到一些有趣的数据时,...
我正在使用 OpenCL 开发 Java RayTracer。我目前使用 JOCL 访问 API。所以,现在我正在尝试让用户与相机交互,我的计划是制作一个相机......
我正在实现一个简单的光线追踪器,现在我正在尝试实现反射。但物体只是变暗,没有反射。这就是它的样子: 我的场景 这是我的反射代码...
如何将 Phong 照明与菲涅尔介电反射/透射实际结合起来?
更新:我回答了我自己关于使用什么照明模型的问题,但现在我需要知道如何计算反射和透射光线的菲涅耳项。 我有一个部分实现的...
我有一个可用的光线追踪器(使用 gl-matrix 在 Node 中编写) 它与球体配合得很好,但现在我添加了通用矩阵变换(平移、旋转、缩放)以支持 o...
我正在用java编写光线追踪器,并且正在尝试实现折射,但是我对在该主题上找到的信息感到困惑。如果我有一个用于入射光线的 3D 矢量,...
VK_KHR_acceleration_struct 和 VK_KHR_raytracing_pipeline 未显示,但它们在 vkconfig (RTX2060) 中可用
我想在我的项目中使用 VK_KHR_acceleration_struct 和 VK_KHR_raytracing_pipeline VkDevice 扩展。问题是 vkPhysicalDeviceExtensionProperties 没有这些扩展,而......
我使用C++从头开始制作了一个光线追踪算法,并实现了一个球体作为测试对象。然而,只有当 FOV 接近 90
引入上/下旋转时,将 3D 旋转转换为方向会产生不正确的结果
我会尽力从我的代码中分离并解释这个问题,对于那些感兴趣的人可以在 Github 上找到该项目。我有一个用 Pygame 编写的体素光线追踪引擎:自创建以来我一直在努力...
我目前正在学习光线投射,我能够使用这样的函数在终端中渲染多个对象(vec3 只是一个带有 xyz 变量的结构): 浮动 hit_sphere(vec3 中心,浮动 rad...
我正在按照《周末光线追踪》一书中的步骤进行操作,但在第 11.3 节“全内反射”中遇到了一些问题。当我尝试创建图像时,我得到以下结果: 这是...