Games101-系列课程笔记-Lecture-10

Games101-系列课程笔记


本篇博客内容为Games-101系列课程的 Lecture 10 Geometry 1内容,有兴趣的小伙伴可前往GAMES101官网下载相关内容。GAMES101官网


纹理应用

现代GPU中,纹理(texture)=内存(memory)+范围查询(range query)

环境映射

环境映射
左图是环境光(纹理),右图是利用该纹理渲染出的犹他茶壶。
那么这个纹理应该如何得到呢?

  • 球型映射
    环境纹理
    如上图,我们用完全光滑的透明球体反射四周环境,我们可以把球的表面完全展开,得到的二维图像就是环境纹理。
    纹理畸变
    然而,将纹理完全展开后发现在纹理顶部和底部出现了明显的畸变,这是因为球型物体映射出的环境纹理,"纬度"越高,纹理越向"两级"聚拢,而"纬度"低的地方则不易出现这种情况。解决这一问题的方式是立方体映射。
  • 立方体映射
    立方体映射
    我们用一个立方体盒子包裹这个球体,这样由球心出发,朝球面任意一点方向射出的射线都会投影在立方体六个面的其中一个面上,最终效果如下:
    立方体映射最终效果

凹凸贴图(Bump Texture)

凹凸贴图效果
上图是凹凸贴图的效果图,在不改变几何特征的情况下,通过几何表面高度变化改变渲染点的法线方向,从而改变最终的渲染效果,造成物体表面凹凸有致的假象(因为我们并没有增加三角形个数,改变几何特征)。
原理1
如上图所示,黑色曲线代表原本光滑的几何表面,黄色曲线为人为定义的几何表面高度曲线(高度值可通过凹凸贴图获得,凹凸贴图如下图所示,黑色区域代表高度值低的地方,白色区域代表高度值高的地方)。那么接下来如何计算出法线方向?
凹凸贴图
计算法线方向
先假设在一个二维平面中,曲线上每一点的法线方向都是(0,1)T,现在加入凹凸贴图,曲线发生了变化,曲线上每一点的斜率都发生了改变,我们计算某一点的斜率dp,dp可以利用差分计算出来,那么在引入凹凸贴图后该点的法线就可以表示为(-dp,1)。
我们从二维平面扩展到三维空间,法线的计算方式如下图所示:
三维法线计算
当然,我们一开始假设了初始法线方向永远是垂直向上的(0,0,1),但是这无疑不符合真实情况。因此我们对每个渲染点,都定义了一个局部坐标系,在这个局部坐标系里法线方向是(0,0,1),最终将计算出的法线方向通过坐标变换从局部坐标系变换到世界坐标中。

位移贴图(Displacement Map)

位移贴图
位移贴图不同于凹凸贴图,位移贴图是真实改变了网格剖分后的顶点位置,从而更真实地反映物体表面的凹凸性(在边缘和阴影上表现得尤为明显)。上图直观展现了凹凸贴图与纹理贴图的区别。但位移贴图要求分割出来的三角形足够细,细到要高于纹理定义的频率,这对于采样频率提出了更高的要求。


几何

分类

  • 隐式几何:用一个关系式描述三维空间一个点的坐标应该满足的关系,如球:x2+y2+z2=1,可以用f(x,y,z)=0表示。
    • 优点:易判断某一点在不在这个面上,负值表示点在几何内,0表示在几何表面上,正值表示在几何外。
    • 缺点:很难画出这样的几何体,不容易找到所有点。
  • 显式几何:直接给出或利用参数映射给出
    • 参数映射:通过一个函数,把二维空间上的点坐标当做参数,映射到三维空间上。如:f(u,v)=((2+cosu)cosv,(2+cosu)sinv,sinu)
    • 优缺点和隐式几何恰恰相反

更多隐式表示

  • 几何表面
  • CSG(Constructive Solid Geometry)(即几何的布尔运算)
  • 距离函数(Distance Function)(可以用于求两个物体融合的过程)
  • 水平集(Level Set Methods)
  • 分形(Fractals)(在物体内部展现出自相似型,类似于递归的过程)

参考

[1]. GAMES101_Lecture_10.pdf
[2]. Shirley P , Marschner S R . Fundamentals of Computer Graphics[M]. AK Peters, 2005.

在这部分的课程中,我们将专注于使用光线追踪来渲染图像。在光线追踪中 最重要的操作之一就是找到光线与物体的交点。一旦找到光线与物体的交点,就 可以执行着色并返回像素颜色。在这次作业中,我们需要实现两个部分:光线的 生成和光线与三角的相交。本次代码框架的工作流程为: 1. 从 main 函数开始。我们定义场景的参数,添加物体(球体或三角形)到场景 中,并设置其材质,然后将光源添加到场景中。 2. 调用 Render(scene) 函数。在遍历所有像素的循环里,生成对应的光线并将 返回的颜色保存在帧缓冲区(framebuffer)中。在渲染过程结束后,帧缓冲 区中的信息将被保存为图像。 3. 在生成像素对应的光线后,我们调用 CastRay 函数,该函数调用 trace 来 查询光线与场景中最近的对象的交点。 4. 然后,我们在此交点执行着色。我们设置了三种不同的着色情况,并且已经 为你提供了代码。 你需要修改的函数是: • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个 顶点, orig 是光线的起点, dir 是光线单位化的方向向量。 tnear, u, v 是你需 要使用我们课上推导的 Moller-Trumbore 算法来更新的参数。
在给itextpdf文档添加水印时,可以选择添加一个带背景的水印。首先,我们需要创建一个PdfGState对象,使用setFillOpacity()方法设置透明度,然后将该对象应用到PdfContentByte对象中。接下来,我们可以使用showTextAligned()方法将水印文本添加到页面上。为了添加背景,我们可以使用Rectangle对象创建一个矩形,并使用setFillOpacity()方法设置透明度,在PdfContentByte对象中使用rectangle()方法绘制这个矩形。然后,我们可以使用fillStroke()方法填充和描边矩形以添加背景。最后,我们可以使用beginText()方法重新开始文本流,并使用setTextMatrix()方法设置文本位置和旋转角度。最后,我们使用showText()方法将文本添加到页面上。 同时,请注意,这里的"复杂度"一词是指添加水印的过程中的图像处理复杂度,而不是指水印本身的复杂度。在添加水印时,可能会涉及到像素深度的比较和替换,以及对图像的滤波等操作。例如,可能需要比较水印区域的像素深度并进行替换,或者根据频率滤除低频和高频区域。这些复杂度与水印添加的具体操作和效果有关。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [GAMES101现代计算机图形学入门-闫令琪-随堂笔记-Lecture 06 Rasterization 2 (Antialiasing and Z-...](https://blog.csdn.net/weixin_44848751/article/details/127883469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值