【GAMES101学习笔记】10 - 几何01_简介

1. 纹理的应用

在现代GPU中,

texture = memory + range query (filtering)

纹理 = 内存 + 在内存上的一个区域进行的范围查询(滤波)

  • 将数据引入 片元(fragment) 计算的一般方法。

1.1 环境光照(Environment lighting)

screenShot.png

将窗户的结构在 犹他茶壶(Utah Teapot) 上进行反射,可以用纹理进行描述。

此时有个假设:环境光来自无穷远,即在不同位置下的光源的方向和强度不变。

1.1.1 球型环境贴图(Spherical Environment Map)

screenShot.png

用于渲染真实照明的环境贴图(Environment Map)(左)

screenShot.png

此时我们可以有一个逆向工程,将环境光信息记录在一个反射球体上。之后可以通过这个信息展开成周围实际的环境。这样我们就能通过这种方式来描述来自不同方向上的光照信息。

screenShot.png

然而,当直接展开成周围环境时,会发生扭曲的现象。(顶部和底部部分会显得缩小)

解决方法 —— 立方体贴图(Cube Map)

screenShot.png

使用一个立方体包围盒将球体进行包围。将球面信息存储在一个立方体上。

screenShot.png

展开后的实际效果。

1.2 体现几何表面的细节

1.2.1 凹凸贴图(Bump Mapping)

通过纹理定义某个点在基础表面上沿着法线方向的相对高度。

screenShot.png

此时可以在不改变原始几何信息的情况下,仅仅通过应用一个复杂的纹理,模拟出复杂的几何表面形式。

screenShot.png

通过不同的明暗对比,可以产生一个与之类似的着色结果,欺骗人眼。

1.2.1.1 凹凸贴图的原理

通过添加纹理而不改变几何信息

  • 对每个像素的表面法线进行扰动。(仅仅对于着色计算)
  • 纹理定义的每个点的“高度偏移(Height Shift)”
  • 通过凹凸贴图修改对应的点的法向量。(图中 p → n \bold{p} \to \bold{n} pn

screenShot.png

法线的计算过程

2D 情况:

screenShot.png

  • 原始的表面法线,即在点 p p p 的法线 n ( p ) = ( 0 , 1 ) n(p) = (0, 1) n(p)=(0,1)
  • p p p 处的导数为 d p = c ∗ [ h ( p + 1 ) − h ( p ) ] dp = c * [h(p+1) - h(p)] dp=c[h(p+1)h(p)] ,其中的系数 c c c 用来表示凹凸贴图的影响大小;
  • 扰动法向为 n ( p ) = ( − d p , 1 ) n(p) = (-dp, 1) n(p)=(dp,1) ,之后进行归一化。

3D 情况:

  • 原始曲面法线 n ( p ) = ( 0 , 0 , 1 ) n(\bold{p}) = (0, 0, 1) n(p)=(0,0,1)
  • p的导数(获得对应切线)
    − d p / d u = c 1 ∗ [ h ( u + 1 ) − h ( u ) ] - d\bold{p}/d\bold{u} = c_1 * [h(\bold{u}+1) - h(\bold{u})] dp/du=c1[h(u+1)h(u)]
    − d p / d v = c 2 ∗ [ h ( v + 1 ) − h ( v ) ] - d\bold{p}/d\bold{v} = c_2 * [h(\bold{v}+1) - h(\bold{v})] dp/dv=c2[h(v+1)h(v)]
  • 扰动法线为 n = ( − d p / d u , − d p / d v , 1 ) n = (-d\bold{p}/d\bold{u}, -d\bold{p}/d\bold{v}, 1) n=(dp/du,dp/dv,1) ,注意归一化;
  • 该处均是定义的该点的局部坐标系。

1.2.2 位移贴图(Displacement Mapping)

  • 使用与凹凸贴图中相同的纹理;
  • 但实际上又真的会对顶点进行相应的位移移动。

screenShot.png

  • 图中凹凸贴图的边缘是没有凹凸变化的;
  • 位移贴图自身某个凸点的阴影会投射到相邻的其他凸点;
  • 自然地,模型的几何信息会非常复杂,三角形的大小需要足够细致,才能足以表现该纹理。

1.3 3D空间噪声函数 + 实体建模

screenShot.png

  • 纹理不仅仅指2D的球面信息,有时候也可以是一个3D空间中的噪声信息;
  • 此时可以表示3D空间中任何一个地方的信息。

1.4 存储预先计算的阴影信息

screenShot.png

用纹理记录一些提前计算的信息。

1.5 使用3D纹理记录体积渲染

screenShot.png

存储一些3D信息,常用于医学领域。

2. 几何(简介)

2.1 分类

隐式表示(Implicit)

  • 代数曲面(algebraic surface)
  • 水平集(level sets)
  • 距离函数(distance functions)

显式表示(Explicit)

  • 点云(point cloud)
  • 多边形网格(polygon mesh)
  • 细分,NURBS

2.1.1 隐式表示(Implicit)

基于点集的分类

  • 不会表示实际每个点的信息,但是会表示满足某种特定关系的点集。

例如

  • 球面:三维中的所有点,其中 x 2 + y 2 + z 2 = 1 x^2 + y^2 + z^2 = 1 x2+y2+z2=1
  • 更一般地, f ( x , y , z ) = 0 f(x,y,z) = 0 f(xyz)=0

隐式表示的特点

  • 很难直接通过隐式表示看出实际的图形,需要进行采样;
  • 很容易检测某点是否在该图形上。

f ( x , y , z ) = ( 2 − x 2 + y 2 ) 2 + z 2 − 1 f(x,y,z) = (2 - \sqrt{x^2 + y^2})^2 + z^2 - 1 f(x,y,z)=(2x2+y2 )2+z21

screenShot.png

2.1.2 显式表示(Explicit)

  • 所有点的信息都直接给出;
  • 通过参数映射的方式给出。

g : R 2 → R 3 ; ( u , v ) ↦ ( x , y , z ) g:\Bbb{R}^2 \to \Bbb{R}^3;(u,v) \mapsto (x,y,z) g:R2R3;(u,v)(x,y,z)

screenShot.png

g ( u , v ) = f ( ( 2 + cos ⁡ u ) cos ⁡ v , ( 2 + cos ⁡ u ) sin ⁡ v , sin ⁡ u ) g(u,v) = f((2+\cos{u})\cos{v},(2+\cos{u})\sin{v},\sin{u}) g(u,v)=f((2+cosu)cosv,(2+cosu)sinv,sinu)

screenShot.png

显式表示的特点

  • 很容易直接通过隐式表示看出实际的图形,需要进行采样;
  • 很难检测某点是否在该图形上。

2.2 应用

2.2.1 CSG(Constructive Solid Geometry)(Implicit)

通过对几种基础几何体进行布尔运算,组合出更复杂的几何体。(几何是隐式表示)

screenShot.png

布尔表达式:

screenShot.png

2.2.2 距离函数(Distance Functions)(Implicit)

代替布尔运算,使用 距离函数(Distance Functions) 将曲面逐渐融合在一起:

距离函数(Distance Functions) :指的是空间中的任何一个点与待表述的几何形体上任意一点之间的最小距离,可以是 有符号距离(signed distance)

NOTE:

  • 距离函数的值为零的位置为物体的边界。

screenShot.png

上图中,获得两个物体的距离函数,对距离函数进行融合,之后再恢复成物体,即获得两个物体融合(Blending)后的物体。

示例

screenShot.png

想获得由 A 到 B 运动的中间状态,但在简单的融合之后,实际出现 1/3 黑 1/3 灰 1/3 白,而理论上应该是 1/2 黑 1/2 白。

screenShot.png

此时可以先分别求出 A 和 B 的有符号距离函数,然后再对距离函数进行融合,最后恢复成原图案。

2.2.3 水平集方法(Level Set Methods)(Implicit)

有些时候封闭形式的方程很难描述某些复杂的形状,这时很难求出对应的距离函数;

替代方法:存储一个近似函数的值网格。

screenShot.png

在插值等于零的地方找到曲面对形状提供更明确的控制(如纹理)。

2.2.4 分形(Fractals)(Implicit)

在所有尺度上表现出 自相似性 和细节,类似于递归。

screenShot.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake Warning: Ignoring extra path from command line: "../openMVS" -- Detected version of GNU GCC: 94 (904) Compiling with C++17 CMake Error at /home/xujx/.local/lib/python3.8/site-packages/cmake/data/share/cmake-3.26/Modules/CMakeDetermineCompilerId.cmake:751 (message): Compiling the CUDA compiler identification source file "CMakeCUDACompilerId.cu" failed. Compiler: /usr/bin/nvcc Build flags: Id flags: --keep;--keep-dir;tmp -v The output was: 255 #$ _SPACE_= #$ _CUDART_=cudart #$ _HERE_=/usr/lib/nvidia-cuda-toolkit/bin #$ _THERE_=/usr/lib/nvidia-cuda-toolkit/bin #$ _TARGET_SIZE_= #$ _TARGET_DIR_= #$ _TARGET_SIZE_=64 #$ NVVMIR_LIBRARY_DIR=/usr/lib/nvidia-cuda-toolkit/libdevice #$ PATH=/usr/lib/nvidia-cuda-toolkit/bin:/usr/local/cuda-11.8/bin:/home/xujx/anaconda3/bin:/home/xujx/anaconda3/condabin:/home/xujx/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin #$ LIBRARIES= -L/usr/lib/x86_64-linux-gnu/stubs -L/usr/lib/x86_64-linux-gnu #$ rm tmp/a_dlink.reg.c #$ gcc -D__CUDA_ARCH__=300 -E -x c++ -DCUDA_DOUBLE_MATH_FUNCTIONS -D__CUDACC__ -D__NVCC__ -D__CUDACC_VER_MAJOR__=10 -D__CUDACC_VER_MINOR__=1 -D__CUDACC_VER_BUILD__=243 -include "cuda_runtime.h" -m64 "CMakeCUDACompilerId.cu" > "tmp/CMakeCUDACompilerId.cpp1.ii" #$ cicc --c++14 --gnu_version=90400 --allow_managed -arch compute_30 -m64 -ftz=0 -prec_div=1 -prec_sqrt=1 -fmad=1 --include_file_name "CMakeCUDACompilerId.fatbin.c" -tused -nvvmir-library "/usr/lib/nvidia-cuda-toolkit/libdevice/libdevice.10.bc" --gen_module_id_file --module_id_file_name "tmp/CMakeCUDACompilerId.module_id" --orig_src_file_name "CMakeCUDACompilerId.cu" --gen_c_file_name "tmp/CMakeCUDACompilerId.cudafe1.c" --stub_file_name "tmp/CMakeCUDACompilerId.cudafe1.stub.c" --gen_device_file_name "tmp/CMakeCUDACompilerId.cudafe1.gpu" "tmp/CMakeCUDACompilerId.cpp1.ii" -o "tmp/CMakeCUDACompilerId.ptx" #$ ptxas -arch=sm_30 -m64 "tmp/CMakeCUDACompilerId.ptx" -o "tmp/CMakeCUDACompilerId.sm_30.cubin" ptxas fatal : Value 'sm_30' is not defined for option 'gpu-name' # --error 0xff -- Call Stack (most recent call first): /home/xujx/.local/lib/python3.8/site-packages/cmake/data/share/cmake-3.26/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD) /home/xujx/.local/lib/python3.8/site-packages/cmake/data/share/cmake-3.26/Modules/CMakeDetermineCompilerId.cmake:53 (__determine_compiler_id_test) /home/xujx/.local/lib/python3.8/site-packages/cmake/data/share/cmake-3.26/Modules/CMakeDetermineCUDACompiler.cmake:307 (CMAKE_DETERMINE_COMPILER_ID) CMakeLists.txt:109 (ENABLE_LANGUAGE)是什么问题
最新发布
07-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值