当前位置: 首页 > news >正文

Introduction To Raymarching

在二维上我们画一个圆实际上就是定义一个pos 然后 周围的uv判断是否在圆内

三维上我们画一个球,实际上就是三维的坐标到某个pos来判断是否在球内

看一下作者的做法

float3 rayOrigin = viewDir - worldPos;
float3 offset = viewDir * 1;

float result = 0.0f;
for(int i = 0; i < 256; i++)
{
    float dist = length(rayOrigin - sphereCenter) - sphereRadius;
    if (dist < 0.01f)
    {
        return float3(1.0f, 0.0f, 0.0f);
    }
    rayOrigin += offset;
}
return float3(0.0f, 0.0f, 0.0f);

我们需要知道的是,这个球实际上还是我们在物体的表面上形成的视觉欺骗的效果,我们设置为平面并且设置为rayOrigin的颜色

float3 rayOrigin = viewDir - worldPos;
float3 offset = viewDir * 1;

float result = 0.0f;
for(int i = 0; i < 256; i++)
{
    float dist = length(rayOrigin - sphereCenter) - sphereRadius;
    if (dist < 0.01f)
    {
        return rayOrigin;
    }
    rayOrigin += offset;
}
return float3(0.0f, 0.0f, 0.0f);

其实我还是不是很理解这个球怎么算的,我的感觉就是作者的做法是为了让它立体

problem

因为这里是相对于worldpossition来偏移的,当我们在世界中使用的时候无法显示

获取obj的中心坐标然后减去像素的世界坐标让它变成相对obj的局部坐标

然后就可以得到世界空间的效果

通过增加输出转换为不透明遮罩得到一个比较不错的三维球体

float3 rayOrigin = viewDir - worldPos;
float3 offset = viewDir * 1;

float result = 0.0f;
for(int i = 0; i < 256; i++)
{
    float dist = length(rayOrigin - sphereCenter) - sphereRadius;
    if (dist < 0.01f)
    {
        mask = 1.0;
        return rayOrigin;
    }
    rayOrigin += offset;
}
mask = 0.0;
return float3(0.0f, 0.0f, 0.0f);

加入diffuse light

float3 rayOrigin = worldPos - viewDir;
float3 offset = viewDir * -1;

float result = 0.0f;
for(int i = 0; i < 256; i++)
{
    float dist = length(rayOrigin - sphereCenter) - sphereRadius;
    if (dist < 0.01f)
    {
        mask = 1.0;
        float3 normal = normalize(rayOrigin - sphereCenter);
        float3 diffuse = max(dot(normal, lightPos), 0.0f);
        return float3(1.0f, 0.0f, 0.0f) * diffuse;
    }
    rayOrigin += offset;
}
mask = 0.0;
return float3(0.0f, 0.0f, 0.0f);

记得把原本的颜色去掉

Specular

float3 rayOrigin = worldPos - viewDir;
float3 offset = viewDir * -1;

float result = 0.0f;
for(int i = 0; i < 256; i++)
{
    float dist = length(rayOrigin - sphereCenter) - sphereRadius;
    if (dist < 0.01f)
    {
        mask = 1.0;
        float3 normal = normalize(rayOrigin - sphereCenter);
        float diffuse = max(dot(normal, lightPos), 0.0f);
        
        float3 h = normalize((viewDir + lightPos));
        float spec = pow(max(dot(normal, h), 0.0f), specRate);
        return float3(1.0f, 0.0f, 0.0f) * diffuse + float3(1.0f, 1.0f, 1.0f) * spec;
    }
    rayOrigin += offset;
}
mask = 0.0;
return float3(0.0f, 0.0f, 0.0f);

相关文章:

  • AI结合VBA提升EXCEL办公效率尝试
  • SQL:Relationship(关系)
  • 类似东郊到家的上门按摩预约服务系统小程序APP源码全开源
  • 3.5 字典补充
  • Google 官方提示工程 (Prompt Engineering)白皮书 总结
  • ESP32与STM32哪种更适合初学者?
  • Qt触摸屏隐藏鼠标指针
  • Python数组(array)学习之旅:数据结构的奇妙冒险
  • DRM(Digital Rights Management)生态以及架构介绍
  • 自动驾驶技术-相机_IMU时空标定
  • NI的LABVIEW工具安装及卸载步骤说明
  • 博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯
  • 【多模态大模型实战】使用LoRA微调Qwen2.5-VL
  • ESP32+Arduino入门(三):连接WIFI获取当前时间
  • 埃隆·马斯克与开源:通过协作重塑创新
  • Python 中 `__init__` 方法的深入解析
  • Java工具类-assert断言
  • 嵌入式人工智能应用-第三章 opencv操作3 图像平滑操作 下
  • Linux 内存调优之系统内存全面监控
  • 教程:在Typora中显示拼音——附处理工具
  • 拼车网站的建设雨实现/企业网站模板 免费
  • 行业网站建设详解/自己开网店怎么运营
  • 如何做vip微信电影网站/营销推广工作内容
  • 怎么注册公司教程/域名查询seo
  • 杭州哪里做网站好/小程序设计
  • 客服外包网站/网站托管