光线追踪 10秒钟学会贴图纹理

在这里插入图片描述

首先把一张图片改名1.jpg 放在C盘

下面就是SOIL2库 读入图片 保存在 图片纹理 变量
SOIL2库 https://share.weiyun.com/EWOP778A

#define STB_IMAGE_IMPLEMENTATION
#include "SOIL2\stb_image.h" //包含头
#pragma comment(lib,"SOIL2.lib") //包含库
unsigned char* 图片纹理;//图片内存
int nx, ny, nn;

int main()
{
	图片纹理 = stbi_load("C:\\1.jpg", &nx, &ny, &nn, 0);

``//....`

 


下面是计算UV贴图的取出材质图片颜色 2个函数

//输入u和v,输出对应图片像素的rgb值
vec3 取uv对应图片颜色(float u, float v) //p为命中终点坐标
{
	int i = int((u)* nx);//求出像素索引
	int j = int((1 - v)*ny - 0.001f);
	if (i < 0) i = 0;
	if (j < 0) j = 0;
	if (i > nx - 1) i = nx - 1;
	if (j > ny - 1) j = ny - 1;
	float r = int(图片纹理[3 * i + 3 * nx*j]) / 255.0f;
	float g = int(图片纹理[3 * i + 3 * nx*j + 1]) / 255.0f;
	float b = int(图片纹理[3 * i + 3 * nx*j + 2]) / 255.0f;
	return vec3(r,g,b);
}


#define pi 3.1415926f
//输入命中点p的坐标,输出纹理坐标u,v
void 计算UV坐标(const vec3& p, double& u, double& v) {
	auto phi = atan2(p.z, p.x);
	auto theta = asin(p.y);
	u = 1 - (phi + pi) / (2 * pi);
	v = (theta + pi / 2) / pi;
}

怎么调用这2个函数
在光线求交函数中得到 光线和三角形顶点 交点

		double u,v;
		计算UV坐标(res.光线命中点, u, v);//光线命中点 求出 返回uv坐标
		res.material.color = 取uv对应图片颜色(u, v);//这里没有对应三角形的贴图, 多个图片 自己读入模型 进行区分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容介绍在成像领域,我们有很多手段。比如你可以通过照相机的光学元件,也可以通过像电脑游戏中的那样,通过GPU的一套渲染管线来实现成像。当然除此之外是不是就没有其他的成像方式了呢?当然答案是否定的。 在我们不去使用计算机图形学那套去成像的时候,最土鳖和最容易理解的成像方式就是光线追踪了。这里同学们应该理解到的有一个点,第一光线追踪不是唯一的成像方式,第二它与传统的GPU成像或者说 计算机图形学里说的那些光栅化之类的从思路上就有区别,第三光线追踪是最简单的成像方式之一,大概你学完高中数学就可以实现光线追踪,写完两三个C++类足以做成非常优质的画面。所以同学们要对光线追踪有一个 清晰的认识,不要认为你学完这一套就无敌了,其实你学完了才会发现,这比OpenGL那些一套一套的规则简单多了。 大部分情况下,由于光线追踪不是按照图形学那边的那些管线来做的,所以它不讲究效率,而是遵循物理意义上的画质最佳。所以基本上你学会光线追踪,且不从事电影行业或者不学习引擎内核去研发高端引擎,那么这块知识估计你会带进坟墓。适合人群光线追踪适合于那些探究画质的同学,你可以轻松的把你的思维应用到你的算法中,但大概率无法转化成为实时算法,也就是无法转化成传统渲染管线这边的一套一套的东西。因为仿真从算法出发点上就是不考虑效率的。 你可以用光线追踪去渲染一些精致的画面,如果你是学习了游戏引擎了的话,你可以尝试自己写一个光线追踪的渲染器,来执行烘焙场景的操作。大部分情况下,通用引擎会使用AutoDesk的Beast SDK,比如Unity3D 里面就有beast.exe。如果你是游戏引擎的内核程序员,那么你有可能将你光线追踪和离线渲染学来的知识通过烘焙场景的方式来应用到你的实际工作中。光线追踪的地位在实时渲染领域中使用光线追踪的算法的探索当然也有人在做,这其中最厉害的当然就是Unreal,值得我们学习。如果你在你的引擎内核里使用了像vulkan这样的高级别渲染器,兼容性会差一点,但是你此时 就可以学习Unreal做光线追踪的思路,在实时渲染中,去或多或少加一点光线追踪。我们可以来思考这样的一个问题,实时渲染追求的是速度与性能,离线渲染追求的是极限画质。于是乎那些大神,或许未来你 就是这些大神中的某一个,你们做的操作莫过于把离线渲染算法中的某一部分比较烧性能的环节,比如通过IBL的方式事先通过离线渲染把所有渲染数据存储到一张图像里去,然后在实时渲染的时候把这张图片 中的数据取出来直接运算,就可以得到比实时渲染好,但是比离线渲染差那么一点点画质。这里之所以无法让实时渲染和离线渲染的画质完全一致是因为我们的3D世界就如同我们的眼球一样精度是很高的。如果你的 图片的分辨率不够大,离线渲染的时候存储的数据都是比较粗糙的采样数据,无法描绘出一个精致的世界。课程安排在我们的课程中,我们来通过最简单的方式,依然是最简单的方式来理解光线追踪是怎么玩出来的。画面或许很好看,但都是简单的高中几何数学,即便我们认为你没写过程序都能看懂意思。我们课程里面不涉及 物理渲染,我们使用的依然是经典的lambert这样的光照模型。物理渲染的方式既可以在实时渲染里实现,也可以在离线渲染里实现。大体的框架不会变,只是计算光的时候算法会变,那部分估计也不是美术可以听懂的了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值