兰州网站推广建设思途建站

bicheng/2026/1/24 2:58:45/文章来源:
兰州网站推广建设,思途建站,山西网站建设推荐咨询,wordpress中文标题404该文章以及代码主要来自 图形学论文解析与复现#xff1a;【论文复现】An Efficient Representation for Irradiance Environment Maps 作者#xff1a;Monica的小甜甜 与原文的不同#xff1a; 对一些有问题的地方进行了修改添加了注释对有疑问的地方添加了疑问点引入了其…该文章以及代码主要来自 图形学论文解析与复现【论文复现】An Efficient Representation for Irradiance Environment Maps 作者Monica的小甜甜 与原文的不同 对一些有问题的地方进行了修改添加了注释对有疑问的地方添加了疑问点引入了其他一些Blog填充了原文中忽略的信息 1、预计算球面谐波函数系数 首先根据上一篇【球谐函数在环境光照中的使用原理】得到的最终公式 我们需要预计算 L l m L_l^m Llm​的值。计算公式为 Ω \Omega Ω为球面积分这里对应对天空盒逐像素积分。 积分代码为 void Harmonics::Evaluate()//求值 {m_Coefs vectorglm::vec3(m_Degree, glm::vec3());//6张图for (int k 0; k 6; k){cv::Mat img m_Images[k];int w m_Images[k].cols;int h m_Images[k].rows;//逐像素for (int j 0; j w; j){for (int i 0; i h; i){// 像素点位置float px (float)i 0.5;float py (float)j 0.5;// 像素点UV 【-1,1】以摄像机正对位置的00float u 2.0 * (px / (float)w) - 1.0;float v 2.0 * (py / (float)h) - 1.0;// 像素间UV的一半的偏移量float d_x 1.0 / (float)w;// (x0,y0)像素左下角 (x1,y1)像素右上角float x0 u - d_x;float y0 v - d_x;float x1 u d_x;float y1 v d_x;// 计算Cubemap的一个像素对应的立体角的大小float d_a surfaceArea(x0, y0) - surfaceArea(x0, y1) - surfaceArea(x1, y0) surfaceArea(x1, y1);// 纹理像素点 转化为 世界坐标点u (float)j / (img.cols - 1);v 1.0f - (float)i / (img.rows - 1);glm::vec3 p CubeUV2XYZ({ k, u, v });// 获取当前像素颜色auto c img.atcv::Vec3f(i, j);glm::vec3 color {c[2], c[1], c[0]};// 得到基函数计算结果列表vectorfloat Y Basis(p);// 计算系数for (int i 0; i m_Degree; i){m_Coefs[i] m_Coefs[i] Y[i] * color * d_a;}}}} }其中 计算Cubemap的一个像素对应的立体角的大小原理可参照 Solid Angle of A Cubemap Texel - 计算Cubemap的一个像素对应的立体角的大小 我们将得到的积分结果保存在一个文件中【SHCoefficients.txt】,用于之后读取。 2、预计算BRDF的LUT图 LUTLook up Table图预计算了任意一个天空盒下已知法线和视口的夹角以及材质粗糙度查找得到Frenel项。 然而这个LUT图和IBL中的LUT有一些不同。 因为IBL中的LUT加入了 n ⋅ w n\cdot w n⋅w 光照衰减项。 而在球谐函数中 n ⋅ w n\cdot w n⋅w 作为 t l 参与运算 t_l参与运算 tl​参与运算因此在球谐函数的IBL中删除了 n ⋅ w n\cdot w n⋅w。 main函数计算 for(int i 0; i N; i){for (int j 0; j N; j){float NoV (i 0.5f) * (1.0f / N);float roughness (j 0.5f) * (1.0f / N);glm::vec2 eval IntegrateBRDF(NoV, roughness);tex.storeglm::vec2({ i, N - j - 1 }, 0, eval);}}其他被调用函数 const float PI 3.14159265358979323846264338327950288;float RadicalInverse_VdC(unsigned int bits) {bits (bits 16u) | (bits 16u);bits ((bits 0x55555555u) 1u) | ((bits 0xAAAAAAAAu) 1u);bits ((bits 0x33333333u) 2u) | ((bits 0xCCCCCCCCu) 2u);bits ((bits 0x0F0F0F0Fu) 4u) | ((bits 0xF0F0F0F0u) 4u);bits ((bits 0x00FF00FFu) 8u) | ((bits 0xFF00FF00u) 8u);return float(bits) * 2.3283064365386963e-10; }glm::vec2 Hammersley(unsigned int i, unsigned int N) {return glm::vec2(float(i) / float(N), RadicalInverse_VdC(i)); }glm::vec3 ImportanceSampleGGX(glm::vec2 Xi, float roughness, glm::vec3 N) {float a roughness * roughness;float phi 2.0 * PI * Xi.x;float cosTheta sqrt((1.0 - Xi.y) / (1.0 (a*a - 1.0) * Xi.y));float sinTheta sqrt(1.0 - cosTheta * cosTheta);// from spherical coordinates to cartesian coordinatesglm::vec3 H;H.x cos(phi) * sinTheta;H.y sin(phi) * sinTheta;H.z cosTheta;// from tangent-space vector to world-space sample vectorglm::vec3 up abs(N.z) 0.999 ? glm::vec3(0.0, 0.0, 1.0) : glm::vec3(1.0, 0.0, 0.0);glm::vec3 tangent normalize(cross(up, N));glm::vec3 bitangent cross(N, tangent);glm::vec3 sampleVec tangent * H.x bitangent * H.y N * H.z;return normalize(sampleVec); }float GeometrySchlickGGX(float NdotV, float roughness) {float a roughness;float k (a * a) / 2.0;float nom NdotV;float denom NdotV * (1.0 - k) k;return nom / denom; }float GeometrySmith(float roughness, float NoV, float NoL) {float ggx2 GeometrySchlickGGX(NoV, roughness);float ggx1 GeometrySchlickGGX(NoL, roughness);return ggx1 * ggx2; }glm::vec2 IntegrateBRDF(float NdotV, float roughness, unsigned int samples 1024) {glm::vec3 V;V.x sqrt(1.0 - NdotV * NdotV);V.y 0.0;V.z NdotV;float A 0.0;float B 0.0;glm::vec3 N glm::vec3(0.0, 0.0, 1.0);for (unsigned int i 0u; i samples; i){glm::vec2 Xi Hammersley(i, samples);glm::vec3 H ImportanceSampleGGX(Xi, roughness, N);glm::vec3 L normalize(2.0f * dot(V, H) * H - V);float NoL glm::max(L.z, 0.0f);float NoH glm::max(H.z, 0.0f);float VoH glm::max(dot(V, H), 0.0f);float NoV glm::max(dot(N, V), 0.0f);if (NoL 0.0){float G GeometrySmith(roughness, NoV, NoL);float G_Vis (G * VoH) / (NoH * NoV) / NoL;float Fc pow(1.0 - VoH, 5.0);A (1.0 - Fc) * G_Vis;B Fc * G_Vis;}}return glm::vec2(A / float(samples), B / float(samples)); }3、将计算数据传入Shader 传入BRDFLUT纹理传入球谐函数系数列表 void CShadingPass::initV() {auto m_LUTTexture std::make_sharedElayGraphics::STexture();loadTextureFromFile(../Textures/BRDFLUT/BRDFLut.dds, m_LUTTexture);getCoefs();ElayGraphics::Camera::setMainCameraFarPlane(100);ElayGraphics::Camera::setMainCameraPos({ -1.57278, 0.244948, 0.367194 });ElayGraphics::Camera::setMainCameraFront({ 0.967832, -0.112856, -0.224865 });ElayGraphics::Camera::setMainCameraMoveSpeed(0.5);m_pShader std::make_sharedCShader(Sponza_VS.glsl, Sponza_FS.glsl);m_pSponza std::dynamic_pointer_castCSponza(ElayGraphics::ResourceManager::getGameObjectByName(Sponza));m_pShader-activeShader();m_pShader-setTextureUniformValue(u_BRDFLut, m_LUTTexture);m_pShader-setMat4UniformValue(u_ModelMatrix, glm::value_ptr(m_pSponza-getModelMatrix()));for (int i 0; i m_Coefs.size(); i){m_pShader-setFloatUniformValue(u_Coef[ std::to_string(i) ], m_Coefs[i].x, m_Coefs[i].y, m_Coefs[i].z);}m_pSponza-initModel(*m_pShader); }4、 Draw #version 430 corein vec3 v2f_FragPosInViewSpace; in vec2 v2f_TexCoords; in vec3 v2f_ViewSpaceNormal; in vec3 v2f_WorldSpaceNormal;layout (location 0) out vec4 Albedo_;const float PI 3.1415926535897932384626433832795; uniform vec3 u_Coef[16]; uniform vec3 u_DiffuseColor; uniform sampler2D u_BRDFLut;vec3 FresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {return F0 (max(vec3(1.0 - roughness), F0) - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } void main() { if((abs(v2f_ViewSpaceNormal.x) 0.0001f) (abs(v2f_ViewSpaceNormal.y) 0.0001f) (abs(v2f_ViewSpaceNormal.z) 0.0001f)){Albedo_ vec4(0, 0, 0, 1);return;}float Basis[9];float x v2f_WorldSpaceNormal.x;float y v2f_WorldSpaceNormal.y;float z v2f_WorldSpaceNormal.z;float x2 x * x;float y2 y * y;float z2 z * z;//这里所有系数应该为乘PI------------------个人认为Basis[0] 1.f / 2.f * sqrt(1.f / PI);Basis[1] 2.0 / 3.0 * sqrt(3.f / 4.f * PI) * z;Basis[2] 2.0 / 3.0 * sqrt(3.f / 4.f * PI) * y;Basis[3] 2.0 / 3.0 * sqrt(3.f / 4.f * PI) * x;Basis[4] 1.0 / 4.0 * 1.f / 2.f * sqrt(15.f * PI) * x * z;Basis[5] 1.0 / 4.0 * 1.f / 2.f * sqrt(15.f * PI) * z * y;Basis[6] 1.0 / 4.0 * 1.f / 4.f * sqrt(5.f * PI) * (-x2 - z2 2 * y2);Basis[7] 1.0 / 4.0 * 1.f / 2.f * sqrt(15.f * PI) * y * x;Basis[8] 1.0 / 4.0 * 1.f / 4.f * sqrt(15.f * PI) * (x2 - z2);vec3 Diffuse vec3(0,0,0);vec3 F0 vec3(0.2,0.2,0.2);float Roughness 0.5;vec3 N normalize(vec4(v2f_ViewSpaceNormal,1.0f)).xyz;//viewMatrix * vec3 V -normalize(v2f_FragPosInViewSpace);//vec3 R reflect(-V, N); F0 FresnelSchlickRoughness(max(dot(N, V), 0.0), F0, Roughness);vec2 EnvBRDF texture(u_BRDFLut, vec2(max(dot(N, V), 0.0), Roughness)).rg;vec3 LUT (F0 * EnvBRDF.x EnvBRDF.y);for (int i 0; i 9; i)Diffuse u_Coef[i] * Basis[i] * (1-LUT);Albedo_ vec4(Diffuse); }结果展示 只有漫反射的效果 只有镜面反射的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c2750服务器做网站行吗大型回合制手游排行榜

2.怎么鉴别程序是10.5还是10.51 ?* 作为商业用户,升级完全没有这个担心,但是这次升级从全局来看清晰度不是很高,不像10.5的升级后台UI都变化了!你说有漏洞但是我没遇到过 所以我也不知道升级了啥只能看版本数字是无法区…

个人网站建设论文中期报告简单网页模板下载

一、题目 1、题目描述 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例1: 输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-1…

做网站还挣钱吗辽宁网站建设fengyan

构建一种完全可实现、可操作的开放源代码信息收集系统,帮助记者完成工作任务。采编人员仅需输入所收集到的网址及题目即可迅速启动收集工作并进行信息归类。 2.根据新的数据收集要求,采用云计算技术实现新的收集器的迅速部署。对于资料采集点的改版&…

网站受到攻击会怎么样在线网页刷新

热点随笔: 是时候开始用C#快速开发移动应用了(腾飞(Jesse)) C#码农的大数据之路 - 使用C#编写MR作业(hystar) 人人网面试经历(少年张翠山) 数据库表设计,没有最好只有最…

在哪里可以学到做网站儿童产品网站建设

在实际生产开发中,我们都知道,DB是影响响应速度的主要原因之一,因此都会选择尽可能减少操作DB的次数,所以在批量操作数据库时,都会选择一些方式去尽可能优化。 一、实体类和mapper 实体类为: @Data public class User {private Long userId;private String name;priva…

软件自学网站中国建设信号工证网站

前言 本篇博客介绍在查看日志的场景中,grep管道命令的使用,并给出了具体的案例。 以下为Linux相关的博客文章列表: Linux——认识Linux的目录结构 & 常用命令 & vim命令 & 权限及其控制 & 防火墙命令 & 自定义命令 &a…

杭州做网站哪家最好怎么自己做投票网站

对于企业而言服务器至关重要,它几乎链接着企业的业务,也是员工业务沟通的桥梁,为了保持服务器稳定持续的工作,很多企业都很关心服务器双线的问题,相对来说现在大部分企业使用的都是服务器双线,那服务器双线…

网站建设论文文献海口cms模板建站

我们每入手一款开发板,一般配套的固件系统都会默认运行相应厂商定制的桌面环境(在一些桌面环境上定制的)。这个时候有些同学可能不喜欢厂商定制的桌面系统想要安装其他桌面系统比如我们虚拟机上常用的Ubuntu标准桌面系统(不建议因…

电子商务网站设计中影响客户体验的元素有wordpress底部排

目录 1.typedef对整型指针进行重命名 2.typedef对数组指针进行重命名 3.typedef对函数指针进行重命名 总结:所有重新命名的函数名必须写在*号旁边。 1.typedef对整型指针进行重命名 代码如下: typedef int* pint; int main() {int* p NULL;pint p…

贸易公司如何做英文网站邢台立享网络

前言 想弄一个跨服,目前这篇文章是边测试边写的,两个子服都是在同一个机器上运行的 如果两个子服在不同的网络,跨服的延迟就会比较高 两个子服 s1 和 s2 都是使用folia核心 版本1.20.1s1 端口: 25565s2 端口 : 25566 1.下载 Waterfall W…

怎么做化妆品网站内容规划品牌营销管理

用IIS 发布网站,不能访问且出现错误: HTTP 错误 401.3 - Unauthorized 由于Web服务器上此资源的访问控制列表(ACL)配置或加密设置。您无权查看此目录或页面 解决办法: 1.打开IIS界面,选中发布的网站,右键—>编辑…

个人怎么做ckmov解析网站哈尔滨seo

Redis 内核级请求处理流程 Redis Server 其实就是 Linux 服务器中的一个进程 主要还是下图的流程 应用先和 server 端建立 TCP 连接建立连接之后,server 端就会有一个与该客户端通信的 socket,客户端的读写请求发送到服务端的 socket那么通过 IO 多路…

湖北二师网站建设排名p2p系统网站开发

在迁移学习中,要使用预训练权重。在训练好的网络权重中,使用的是1000类的分类任务。而我们自己的分类任务中没有1000类,需要修改网络。如果将MobileNetV2(num_classes5),我们的网络在最后输出是5类,与1训练好的1000类不…

做教育网站制作链接的步骤

Mac 使用 U盘或移动固态硬盘制作可引导的安装器(以 Monterey 为例) 本教程参考 Apple 官网相关教程 创建可引导 Mac OS 安装器 重新安装 Mac OS 相关名词解释 磁盘分区会将其划分为多个单独的部分,称为分区。分区也称为容器,不同…

简约的网站设计依博罗阀门北京有限公司

前言 在面试中如果问TS的话,经常会问的一个问题就是interface和type有什么区别,这里做个记录 interface和type的区别 Interface 支持声明合并:如果你有两个相同名称的接口,TypeScript会合并它们 interface User {name: string…

没钱怎么做网站网站引流.

各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ 💡spr…

电子商务网站建设(论文php网站开发能挣多钱

这是一个 Linux 命令,用于复制文件或目录到远程服务器。更具体地说,scp -r ./dist root你的IP:/root/www/website/ 这条命令将当前目录下的 ./dist 文件夹以递归方式复制到远程服务器的 /root/www/website/ 目录下。 解释一下各个参数和选项的含义&…

上海网站建设信息网 上色的网站下载免费

文章目录 前言一、BRDF 中的 IBL二、解析一下其中的参数1、光照衰减系数 :surfaceReduction2、GI镜面反射在不同角度下的强弱 :gi.specular * FresnelLerp (specColor, grazingTerm, nv);在BRDF中,IBL(Image Based Light&#xff…

php 可以自己做网站吗目前主流的跨境电商平台有哪些

这阵子碰到一个数据库上的问题,一个刚上线不到一周的 NodeJs 接口服务里所有的查询全部都挂掉了,接口一直处于 pending 状态,看了下 pm2 的日志发现了报错:Cantt create more than max_prepared_stmt_count statements&#xff0c…

114网站建设河南建设信息网首页

对于相同变量名的变量,CPP会覆盖作用域大的变量,而使用作用域小的变量,如果想在函数体内使用全局的变量可以在变量名前加上::加以区分,比如warm3会使得局部的warm变量等于3,而::warm3会使得全局的warm3 。 存储描述持…