首页 > 其他分享 >基于C语言设计的全局光照明模型

基于C语言设计的全局光照明模型

时间:2023-07-29 14:31:47浏览次数:34  
标签:照射到 反射 C语言 该点 交点 照明 全局 光照 ray

完整资料进入【数字空间】查看——搜索"writebug"


Part 1 Whitted-Style Ray Tracing

Step 0. 算法流程

为了渲染出一张图片,RayTrace()计算了给定像素点的色彩取值。


根据光路可逆原理,可以从人眼作为出发点,沿着指向该pixel的某一点的方向发出一条ray。


Step1:射线求交 这条ray会碰到一个物体(墙壁、球、灯),所以计算这条ray和所有物体最近的交点,取交点距离ray发射点最近的点,即为这个ray第一次碰到的物体,同时求出交点和平面法向量。


Step2:判断是否被直接光照,做局部Phong Shading 如果该点被一些光线直接照射到(计算该点到光源连线间是否有物体遮挡),可以对所有照射到该点的光线,对该交点进行Bling Phong模型的局部光照模型计算其直接光照的影响。


Step3:递归求间接光照 同时光在该交点还会发生折射和反射(作业中未考虑折射,故后面只考虑反射),受到反射的间接光照影响,等于对从该交点发出沿反射光路径走出的ray,重新到Step1继续求。但是这一步反射的光在该交点会发生能量衰减,这和反射系数相关,然后才照射到人眼中,所以之后计算的间接光照需要累乘一个weight。


考虑递归10次能量衰减的就几乎很小了,故循环次数设为10。


这是Whitted-Style RayTracing实现的主要流程。

基于C语言设计的全局光照明模型_取值

基于C语言设计的全局光照明模型_取值_02

基于C语言设计的全局光照明模型_递归_03

基于C语言设计的全局光照明模型_递归_04

基于C语言设计的全局光照明模型_ci_05

基于C语言设计的全局光照明模型_取值_06

标签:照射到,反射,C语言,该点,交点,照明,全局,光照,ray
From: https://blog.51cto.com/u_16075443/6892790

相关文章

  • c语言学习笔记5
    内存空间在C语言中,内存空间可以被划分为以下几个部分:1.栈(Stack):这部分内存由编译器自动分配和释放,用于存放函数的参数值,局部变量等。其操作方式类似于数据结构中的堆栈,先进后出。2.堆(Heap):堆是用于动态内存分配的。与栈不同,堆的分配和释放必须由程序员自己操作。在C语言中,使用m......
  • 多线程共享全局变量的问题
    线程之间共享全局变量多个线程都是在同一个进程中,多个线程使用的资源都是同一个进程中的资源,因此多线程间是共享全局变量问题示例1importthreading234#全局变量5g_num=0678#对g_num进行加操作9defsum_num1():10foriinrange(......
  • 浙大版《C语言程序设计实验与习题指导(第4版)》题目集(持续更新)
    C语言练习实验1-1HelloWorld!要求:输出一个短句“HelloWorld!”。答案:#include<stdio.h>intmain(){printf("Helloworld!\n");return0;}实验1-2简单求阶乘问题要求:在一行中给出一个不超过12的正整数N,在一行中输出阶乘的值。答案:#in......
  • Git常用命令(Git全局设置、获取Git仓库)
         ......
  • 第三章 指针才是C语言的精髓(嵌入式Linux与物联网软件开发 C语言内核深度解析)
    这仅仅是读《嵌入式Linux与物联网软件开发:C语言内核深度解析》pdf的知识记录 地址:指的都是某个字节的地址。比如inta的空间大小有4个字节,每个字节都有一个地址(也就是有4个地址),但是只有首字节地址才能作为整个a空间的地址。也就是说,整个内存以1个字节为基本单位划分无数个地址,......
  • 初学C语言day06--进程影响及类型限定符
    进程映像:程序:存储在磁盘上的可执行文件(二进制文件、脚本文件)进程:正在系统中运行的程序进程映像:进程的内存分布情况:text代码段存储二进制指令、常量,只读的,如果强行修改会产生段错误data数据段初始化过的全局变量、初始化过的静态局部变量bss静态数据段未初......
  • 【C语言】二分查找算法
    在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低,⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是......
  • 看看Vue中如何封装一个自动化注册全局组件
    在项目的开发过程中,我们常常会去封装一些比较常用的全局组件,但是每添加一个组件就需要手动在main.js引入注册,不仅麻烦还代码量多,着实让人心烦。所以干脆封装一个自动化注册全局组件。1、自定义全局组件文件夹在src下新建一个globalComponents,用于存放全局组件,并新建一个组件,例......
  • 怎么全局设置box-sizing
    box-sizing默认值为content-box,设置border和padding时会改变width和height并且不具有继承性,每次设置border或padding时都需要设置一遍box-sizing:border-box;比较麻烦可以这样子设置,就不需要每次写padding和border时都加box-sizing:border-box;了html{ box-sizing:bord......
  • C语言快速排序及其优化操作
    快速排序原理简述:找到每一轮最大(最小)的数,依次从左到右存入新的数组,就完成了降序(升序)的排列。#include<stdio.h>intmain(void){intn;scanf("%d",&n);inta[n],temp;for(inti=0;i<n;i++){scanf("%d",&a[i]);}for(......