osg+pbr
文章平均质量分 90
directx3d_beginner
这个作者很懒,什么都没留下…
展开
-
二十二,加上各种贴图
/通过Liblas读取.las文件,并在osg中显示出来,用shader,先在片元着色器指定使用绿色。使用pbr的各种贴图,albedo,金属度,ao,法线,粗糙度,可以更好的控制各个片元。//预过滤HDR环境贴图(第0-4层)其余的不变,运行结果如下。原创 2023-09-28 19:52:19 · 1180 阅读 · 0 评论 -
二十一,结合直射光和间接光绘制小球
与learn opengl中不同的是,预过滤环境贴图没有用Mipmap,而是把五个不同粗糙度的所有纹理都加进来。//通过Liblas读取.las文件,并在osg中显示出来,用shader,先在片元着色器指定使用绿色。走到这一步,可以说,将直接光和间接光都走完了,要把这些结合起来了。//预过滤HDR环境贴图(第0-4层)原创 2023-09-28 17:34:59 · 111 阅读 · 0 评论 -
二十,镜面IBL--打印BRDF积分贴图
比起以往,这节应该是最轻松的了,原创 2023-09-28 17:30:35 · 1164 阅读 · 0 评论 -
十九,镜面IBL--BRDF积分贴图
再看函数vec2 IntegrateBRDF(float NdotV, float roughness) ,可知积分贴图的横坐标是NotV,纵坐标是粗糙度。类似于预过滤环境贴图,也是通过低差异序列进行重要性采样获取采样向量。设置brdf积分贴图为512x512,纹理设置为GL_RG。也就是说,这两部分积分可以获得F0的系数和F0的偏差。再回顾下镜面部分的分割求和近似法。查看这个RG是如何计算的。在对每个采样向量中,原创 2023-09-28 17:23:17 · 483 阅读 · 0 评论 -
十八,镜面IBL-打印预过滤环境贴图
前面打印了各个级别的hdr环境贴图,也能看到预过滤环境贴图,现在进行打印各个级别的预过滤环境贴图。原创 2023-09-28 14:44:29 · 133 阅读 · 0 评论 -
十七,IBL-打印各个Mipmap级别的hdr环境贴图
预滤波环境贴图类似于辐照度图,是预先计算的环境卷积贴图,但这次考虑了粗糙度。因为随着粗糙度的增加,参与环境贴图卷积的采样向量会更分散,导致反射更模糊,所以对于卷积的每个粗糙度级别,我们将按顺序把模糊后的结果存储在预滤波贴图的 mipmap 中。例如,预过滤的环境贴图在其 5 个 mipmap 级别中存储 5 个不同粗糙度值的预卷积结果,如下图所示。所以,可以按照不同Mipmap级别,打印出来各个hdr环境贴图试试。最大尺寸128,逐次减倍,依次是128,64,32,16,8。原创 2023-09-28 14:18:19 · 913 阅读 · 0 评论 -
十六,镜面IBL--预滤波环境贴图
所以,不能只积分一次,而是多次,按照不同粗糙度积分后写到mipmap,或者单独的纹理中。其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似,那么能不能用同样的方法呢?可以看到,镜面反射是绕着出射向量的一个范围(成为波瓣),而漫反射是绕着法线方向均匀分布的。那很自然的想到,积分镜面反射的预滤波环境贴图可以以出射向量为中心,在波瓣范围内积分。然后根据法线方向,粗糙度和低差异序列生成采样向量,该向量大体围绕着预估的波瓣方向。再想想积分辐照度图时,是以法线向量为中心,进行积分的。因为中间范围概率大。原创 2023-09-27 20:02:07 · 195 阅读 · 0 评论 -
osgPBR(十五)镜面IBL--查看不同级别的HDR环境贴图
首先,设置可以使用Mipmap,启用三线性过滤,设置最大级别和最小级别。然后在shader中,用textureLod分别查看各个级别。原创 2023-09-27 18:34:10 · 927 阅读 · 0 评论 -
十四,间接漫反射用到球体中
即vec3 kS = fresnelSchlickRoughness(max(dot(N, V), 0.0), F0,roughness);在间接光漫反射中,模拟菲涅尔方程时,输入参数是视线和法线方向之间的夹角,就要考虑这个粗糙度了。ao是环境光遮蔽,属于环境光特有,比如熟悉的ssao.间接光本来就是环境光,只是更细化了。看似是只与角度和F0相关(即与金属度相关),但是实际上也是与粗糙度相关的。间接光照分为间接漫反射和间接镜面反射。接着看,albedo是颜色,两者共有。辐照度图是用来适用于间接漫反射的。原创 2023-09-27 17:17:25 · 94 阅读 · 0 评论 -
十三,打印辐照度图
现在也进行下打印,和前面打印HDR环境贴图一样,只是由于辐照度图做了平均,失去了大量高频部分,因此,可以用较低分辨率32x32存储。上节HDR环境贴图进行卷积后,得到的就是辐照度图,表示的是周围环境间接漫反射光的积分。原创 2023-09-27 15:23:31 · 105 阅读 · 0 评论 -
十二,HDR环境贴图卷积
由于球的性质,采样不均衡,所以,再加个sin值调节区域采样贡献。采样时,从球面坐标转到3d直角向量,再将该向量从切线空间转到世界空间,然后用该向量采样HDR环境贴图。通过以往经验可知,积分必定要转换为离散和,也就是说,用N个采样数据之和代替积分。每个方向向量可以认为是wi,以前采样的颜色,在这里可以认为是L(p,wi),是间接光不是颜色,是间接光不是颜色,是间接光不是颜色。再细化就是当作球体,经纬度,经度从0到360,纬度是0到90度。似乎看起来很复杂,但是,更复杂的还在后面,镜面IBL,哈哈,原创 2023-09-27 15:00:41 · 62 阅读 · 0 评论 -
十一,从摄像机打印HDR环境贴图
我们很自然地想到,如果把漫游器放在中心打印,是不是就可以打印整个等距柱状投影图了呢?是的,但是,只是要注意的是,立方体贴图的内部和外部尽管一样,但是还是稍微有点模糊,也可以在外部设置漫游器位置六次,打印六次,就像上节那样。但是,这里不考虑这些细节。当然,也可以把osg::Image和osg::TextureCubeMap关联起来。使用osg::TextureCubeMap打印。也就是把漫游器位置设置为。原创 2023-09-27 11:37:22 · 320 阅读 · 0 评论 -
十,从摄像机打印立方体的一个外表面
从摄像机是与主摄像机保持同样的投影矩阵,所以,不用单独设置。如果把漫游器还是在(1,0,0)这个位置,各个从摄像机看向上下左右前后六个面,那么会出现什么现象呢?应该是x正轴打印出来,其他均为空。为了避免上一节出现的宽度方向有背景,所以应该把从摄像机视口设置为正方形,比如512x512。原创 2023-09-27 11:04:02 · 67 阅读 · 0 评论 -
九、完整打印立方体贴图的一个面
答案是:给定投影矩阵的 fov 为 90 度以捕捉整个面,且摄像机距离该面的距离是立方体边长的一半。发现高度是正确的,但是宽度还是太宽,有背景色。这时候就要考虑用其他摄像机了,比如从摄像机。从上一节可以看出,打印出来的图片是有背景色的,也就是摄像机位置不对。原创 2023-09-27 10:48:09 · 68 阅读 · 0 评论 -
八,打印功能
由于要把辐照度文件进行离线处理,这一步有现成的工具可以使用,但是我想用Osg推导一下,所以,先看看如何打印。根据osg最长的一帧,要经过事件回调,更新回调,绘制等几个过程,所以,在每帧结束之后进行。打印的是osg::Image,而osg::Image是与摄像机关联的。原创 2023-09-27 09:53:31 · 50 阅读 · 0 评论 -
七,从等距柱状投影到立方体贴图
前面读取了.hdr,也就是辐射度文件的格式。辐射度文件实际上是一个立方体贴图,只是需要进行一次坐标系转换,也就是绕口的从等距柱状投影到立方体贴图。运行结果如下,果然很神奇。原创 2023-09-27 09:43:53 · 145 阅读 · 0 评论 -
六,使用stbimage库加载.hdr
不改osg的.hdr插件也行,另一种替代方式是stbimage读取后,传递给osg,本质是一样的。原创 2023-09-26 13:43:59 · 125 阅读 · 0 评论 -
五,修改.hdr插件
即在ReaderWriterHDR::readImage()中修改,osg的.hdr插件需要修改,否则格式不对。//转换到RGB16,GL_Float。由于辐照度贴图是.hdr格式,直接把该函数拷贝过来。原创 2023-09-26 13:40:53 · 70 阅读 · 0 评论 -
四,立方体贴图
立方体贴图很简单,就是用方向向量(不一定是单位向量)采样cubeMap的颜色。也就是需要把位置数组传递到shader中,可以用个NodeVisitor。Pbr的间接光用到立方体贴图,所以,先用shader进行立方体贴图。接下来在shader的c++端传递位置数组和纹理。cubeMap需要把六个面的图片都加上,即。随便贴到一个Osg::box就行。也就是在片元着色器中传递。原创 2023-09-21 18:44:07 · 213 阅读 · 0 评论 -
(一)直射光
/通过Liblas读取.las文件,并在osg中显示出来,用shader,先在片元着色器指定使用绿色。算法是来自于learn opengl pbr相关部分,3,视点uniform指针传递给漫游器,在漫游器中改变。为了说明正确性,先把视点设置为原点,按右方向键时正常。1,法线如何从局部坐标系到世界坐标系(逆转置矩阵)可见,面向原点的一半是正确的。//设置视点位置到shader。只考虑如何移植到osg。2,视点通过漫游器获取,//得到当前矩阵和逆矩阵。原创 2023-06-28 09:42:00 · 276 阅读 · 0 评论 -
(二)直射光(半透明)
其实,半透明也简单,一开始和折射率混淆了,折射是偏移光线直线传播的程度,比如,玻璃窗就可以认为没有折射,而玻璃杯是有折射。投射还是要看alpha值,移植到osg时,只要加上alpha值,再设置alpha混合就可以了。原创 2023-08-23 08:15:22 · 102 阅读 · 0 评论 -
osg + pbr(三)Pbr直射光,使用回调函数替代漫游器
/通过Liblas读取.las文件,并在osg中显示出来,用shader,先在片元着色器指定使用绿色。前面,用漫游器表示视点有些太笨重了,实际上也没有必要,用回调函数就可以了。这里顺便把投影坐标系和摄像机坐标系的也加上,(暂时不用。原创 2023-09-20 19:00:54 · 351 阅读 · 5 评论