密集球光照贴图生成

现在来生成球光照贴图。

上一文的方法对于粗糙的物体是合适的,这个球上有镜面反射产生亮斑。

所以、这里准备以贴图坐标所对应球上点和视点连线为入射光,生成密集的球光照贴图。

双向生成密集球光照图

cpp 复制代码
//以球上的点和视点为入射光,反面使用对称视点(双向)
void 球纹理生成球上点和视点为入射光(vector<Sphere_GLSL> &spheres, std::vector<Triangle_GLSL> &triangles, int Sphere_n) {
	double* image = new double[WIDTH * HEIGHT * 4];
	memset(image, 0.0, sizeof(double) * WIDTH * HEIGHT * 4);

	Sphere_GLSL *s1 = NULL;
	for (int i = 0; i < spheres.size(); i++)
	{
		if (spheres[i].Sphere_n == Sphere_n) {
			s1 = &spheres[i];
			break;
		}
	}
	MaxMin t0 = 计算MaxMin(spheres, Sphere_n);
	
	float zmax, zmin;
	zmin = t0.zmin;
	zmax = t0.zmax;		
	printf("zmin:%.2f\n", zmin);
	printf("zmax:%.2f\n", zmax);
	//反面视点
	vec3 eye = EYE; eye.z = -.9;// zmin - .2f;
	printf("eye.z:%.2f\n", eye.z);

	// 球体的基本参数
	float x0 = s1->O.x, y0 = s1->O.y, z0 = s1->O.z; // 球心坐标
	float r = s1->R; // 球的半径

	std::vector<Ray> Raywh;
	for (int k = 0; k < SAMPLE; k++)
	{
		if (k % 10 == 0)
			printf("\r%d", k);
		double* p = image;


		Raywh.clear();
		//生成入射光组-------------------------------------开始结束
		for (float u = 0; u < WIDTH; u++)
		{
			for (float w = 0; w < HEIGHT; w++)
			{

				float x, y, z;											  

				// 计算球体表面上的点坐标
				求xyz(x0, y0, z0, r, u, w, x, y, z);

				// MSAA
				if (k != SAMPLE - 1) {
					x += (randf() - 0.5f) / float(WIDTH);
					y += (randf() - 0.5f) / float(HEIGHT);
				}

				//以球上的点和视点为入射光
				vec3 direction;

				Ray ray;
				// 计算光线投射方向
				if (z>=s1->O.z)
				{//正面
					direction = normalize(vec3(x, y, z) - EYE);
					ray.startPoint = EYE;
					ray.direction = direction;

					Raywh.push_back(ray);
				}
				else {
					//反面
					direction = normalize(vec3(x, y, z) - eye);
					ray.startPoint = eye;
					ray.direction = direction;
					Raywh.push_back(ray);
				}
				

			}
		}

		//生成入射光组-------------------------------------结束
		std::vector<vec4> color;
		// 路径追踪
		pathTracing_GLSL_TSn(Raywh, color);
		int nc = 0;
		for (int i = 0; i < HEIGHT; i++)
		{
			for (int j = 0; j < WIDTH; j++)
			{
				//复制颜色
				vec4 color0 = color[nc++];

				color0 *= BRIGHTNESS;

				*p += color0.x; p++;  // R 通道
				*p += color0.y; p++;  // G 通道
				*p += color0.z; p++;  // B 通道
				*p += color0.w; p++;  // A 通道
			}
		}

	}printf("\n");
	//像素剪裁0-255
	powClamp0255(image, WIDTH*HEIGHT * 4);

	//保存图像
	char filename[256];
	sprintf_s(filename, "Sphere%d.png", Sphere_n);
	imSave(image, WIDTH, HEIGHT, filename);


}

球1、2、3图:

然后运行opengl程序:

已经完成,后续应该把它制成OBJ,PLY文件,方便交流。

感谢观看!

相关推荐
CG_MAGIC21 小时前
Blender 渲染降噪:Cycles 核心参数与 AI 降噪工具应用
3d·blender·贴图·建模教程·渲云渲染
nnsix7 天前
Unity URP用于 光照贴图(Lightmap)的材质Shader
unity·材质·贴图
CG_MAGIC7 天前
Substance Painter 纹理烘焙:法线贴图与 AO 贴图制作指南
3d·贴图·substance painter·建模教程·渲云渲染
iCan_qi8 天前
【游戏开发】一键式图集合并图集分割工具
python·游戏·工具·贴图
Zomcxj12 天前
PasteLabel 图像编辑器:贴图标注,解决样本采集难题
人工智能·python·编辑器·贴图
CG_MAGIC14 天前
Blender制作水世界烟雾休息
blender·贴图·建模教程·渲云渲染
da_vinci_x14 天前
地编革命:手绘无缝地图太肝?3 分钟量产关卡地块
游戏·prompt·aigc·设计师·贴图·技术美术·游戏美术
__water16 天前
RHK《模型贴图自由更换位置》
unity·贴图·模型贴图·移动不丢失
da_vinci_x16 天前
PS 场景美术革命:3 分钟量产 4K 无缝贴图,从此告别“Offset”去缝加班
人工智能·游戏·prompt·aigc·贴图·技术美术·游戏美术
da_vinci_x22 天前
【场景美术】2D 游戏要做“视差滚动”?智能补全 + 深度切片,5分钟把单图拆成 5 层景深
人工智能·游戏·prompt·aigc·贴图·技术美术·游戏美术