首页 > 其他分享 >Mojo 中的光线追踪

Mojo 中的光线追踪

时间:2024-08-09 23:24:27浏览次数:12  
标签:__ 光线 self Vec3f other data Mojo fn 追踪

本教程基于热门教程《C++ 中的可理解光线追踪》。该教程很好地描述了数学解释,因此在 Mojo 中实现基本光线追踪器时,我们只会向您指出相应的部分以供参考。

步骤 1:基本定义


我们首先定义一个Vec3f结构体,用于表示 3D 空间中的矢量以及 RGB 像素。我们将使用SIMD矢量的表示形式来启用矢量化操作。该SIMD类型是固定大小的矢量,其大小必须是 2 的幂。因此,我们将使用 4 的大小,并始终用 0 填充底层存储。

from math import rsqrt


@register_passable("trivial")
struct Vec3f:
    var data: SIMD[DType.float32, 4]

    @always_inline
    fn __init__(inout self, x: Float32, y: Float32, z: Float32):
        self.data = SIMD[DType.float32, 4](x, y, z, 0)

    @always_inline
    fn __init__(inout self, data: SIMD[DType.float32, 4]):
        self.data = data

    @always_inline
    @staticmethod
    fn zero() -> Vec3f:
        return Vec3f(0, 0, 0)

    @always_inline
    fn __sub__(self, other: Vec3f) -> Vec3f:
        return self.data - other.data

    @always_inline
    fn __add__(self, other: Vec3f) -> Vec3f:
        return self.data + other.data

    @always_inline
    fn __matmul__(self, other: Vec3f) -> Float32:
        return (self.data * other.data).reduce_add()

    @always_inline
    fn __mul__(self, k: Float32) -> Vec3f:
        return self.data * k

    @always_inline
    fn __neg__(self) -> Vec3f:
        return self.data * -1.0

    @always_inline
    fn __getitem__(self, idx: Int) -> SIMD[DType.float32, 1]:
        return self.data[idx]

    @always_inline
    fn cross(self, other: Vec3f) -> Vec3f:
        var self_zxy = self.data.shuffle[2, 0, 1, 3]()
        var other_zxy = other.data.shuffle[2, 0, 1, 3]()
        return (self_zxy * other.data - self.data * other_zxy).shuffle[
            2, 0, 1, 3
        ]()

    @always_inline
    fn normalize(self) -> Vec3f:
        return self.data * rsqrt(self @ self)

我们现在定义Image结构,它将存储图像的 RGB 像素。它还包含一个将此 Mojo 结构转换为 NumPy 图像的方法,该方法将用于实现简单的显示机制。我们还将实现一个从磁盘加载 PNG 文件的函数。

首先安装所需的库:

%%python
from importlib.util import find_spec
import shutil
import subprocess

fix = """
-------------------------------------------------------------------------
fix following the steps here:
    https://github.com/modularml/mojo/issues/1085#issuecomment-1771403719
-------------------------------------------------------------------------
"""

def install_if_missing(name: str):
    if find_spec(name):
        return

    print(f"{
     name} not found, installing...")
    try:
        if shutil.which('python3'): python = "python3"
        elif shutil.which('python'): python = "python"
        else: raise ("python not on path" + fix)
        subprocess.check_call([python, "-m", "pip", "install", name])
    except:
        raise ImportError(f"{
     name} not found" + fix)

install_if_missing("numpy")
install_if_missing("matplotlib")
from python import Python
from python import PythonObject
from memory.unsafe_pointer import UnsafePointer

struct Image:
    # reference count used to make the object efficiently copyable
    var rc: UnsafePointer[Int]
    # the two dimensional image is represented as a flat array
    var pixels: UnsafePointer[Vec3f]
    var height: Int
    var width: Int

    fn __init__(inout self, height: Int, width: Int):
        self.height = height
        self.width = width
        self.pixels = UnsafePointer[Vec3f].alloc(self.height * self.width)
        self.rc = UnsafePointer[Int].alloc(1)
        self.rc[] = 1

    fn __copyinit__(inout self, other: Self):
        other._inc_rc()
        self.pixels = other.pixels
        self.rc = other.rc
        self.height = other.height
        self.width = other.width

    fn __del__(owned self):
        self._dec_rc()

    fn _dec_rc(self):
        if self.rc[] > 1:
            self.rc[] -= 1
            return
        self._free()

    fn _inc_rc(self):
        self.rc[] += 1

    fn _free(self):
        self.rc.free()
        self.pixels.free()

    @always_inline
    fn set(self, row: Int, col: Int, value: Vec3f) -> None:
        self.pixels[self

标签:__,光线,self,Vec3f,other,data,Mojo,fn,追踪
From: https://blog.csdn.net/j610152753/article/details/141059577

相关文章

  • 快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 分布式链路追踪篇(ClickHouse
    引言在ClickHouse,我们认为可观测性仅仅是另一个实时分析问题。作为一款高性能的实时分析数据库,ClickHouse被用于多种场景,包括时间序列数据的实时分析。其应用场景的多样性推动了大量分析函数的发展,这些函数有助于查询大多数数据类型。这些查询特性和高压缩率使得越来越多的用户......
  • 传知代码-动态键值记忆网络解决知识追踪(论文复现)
    代码以及视频讲解本文所涉及所有资源均在传知代码平台可获取1.论文概述复现论文:DynamicKey-ValueMemoryNetworksforKnowledgeTracing(DKVMN)知识追踪(KT)是追踪学生在一系列学习活动中知识状态演变的任务。其目的是个性化地指导学生的学习,帮助他们高效地掌握知识概......
  • 修改.gitignore里面曾经追踪过的文件变成不追踪
    .gitignore 只能忽略那些原来没有被追踪(tracked)的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的解决方法就是,先把本地缓存删除(改成未track状态),然后再提交:gitrm-r--cached.gitadd.gitcommit-m'update.gitignore'gitpush 具体步骤如下......
  • 蒙特卡洛模拟(5)————导弹追踪问题
    本章会介绍如何用数值模拟的方法解决导弹追踪问题目录一、问题提出二、建立示意图三、模型建立1.建立坐标轴(1)建立B船坐标(2)建立导弹坐标2.设置delta_t,进行模拟四、代码求解1.预备知识(1)mod(m,n)(2)axis([mnpq])(3)text(m,n,'xxx')2.变量初始化3.初始化画图参数4.进入循环,开始模拟(1)进......
  • 将 Mojo 与 Python 结合使用
    Mojo允许您访问整个Python生态系统,但环境可能会因Python的安装方式而异。花些时间准确了解Python中的模块和包的工作原理是值得的,因为有一些复杂情况需要注意。如果您以前在调用Python代码时遇到困难,这将帮助您入门。Python中的模块和包让我们从Python开始,如......
  • Mojo和Python中的类型详解
    调用Python方法时,Mojo需要在原生Python对象和原生Mojo对象之间来回转换。大多数转换都是自动进行的,但也有一些情况Mojo尚未处理。在这些情况下,您可能需要进行显式转换,或调用额外的方法。Python中的Mojo类型Mojo基本类型隐式转换为Python对象。目前支持的......
  • Mojo中集成Python详解及问题说明
    官方的长期目标是让Mojo成为Python的超集(即让Mojo与现有的Python程序兼容)。Python程序员应该能够立即使用Mojo,并能够访问当今庞大的Python包生态系统。然而,Mojo仍处于早期开发阶段,许多Python功能尚未实现。目前,您无法在Mojo中编写所有可以用Python编写的......
  • Mojo 不安全指针 详解
    该UnsafePointer类型创建对内存中某个位置的间接引用。您可以使用UnsafePointer来动态分配和释放内存,或指向由其他代码分配的内存。您可以使用这些指针编写与低级接口交互的代码,与其他编程语言交互,或构建某些类型的数据结构。但顾名思义,它们本质上是不安全的。例如,当使用不......
  • 目标检测,目标跟踪,目标追踪
    个人专做目标检测,目标跟踪,目标追踪,deepsort。YOLOv5yolov8yolov7yolov3运行指导、环境配置、数据集配置等(也可解决代码bug),cpu,gpu,可直接运行,本地安装或者远程连接服务器等。可做目标检测对比实验ssdfasterrcnnyoloxdetr均可支持定制qt界面-------------------------......
  • 探索Mojo编程语言在实时通信领域的应用
    在当今快速发展的技术世界中,实时通信已成为许多应用程序的核心需求。无论是在线游戏、协作工具还是实时数据流应用,WebSockets和其他实时通信协议都扮演着至关重要的角色。本文将深入探讨一种假想的编程语言——Mojo——在实现这些实时通信功能方面的潜力和应用。1.引言实......