import{_ as l,c as a,b as Q,a as m,d as n,o as t}from"./app-DZszAu6D.js";const s="/assets/ibl_01-fcR9UjtL.png",d={},e={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},o={style:{"vertical-align":"-2.028ex"},xmlns:"http://www.w3.org/2000/svg",width:"46.687ex",height:"5.107ex",role:"img",focusable:"false",viewBox:"0 -1361 20635.8 2257.4","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},p={style:{"vertical-align":"-2.028ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.098ex",height:"5.107ex",role:"img",focusable:"false",viewBox:"0 -1361 14629.5 2257.4","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},H={style:{"vertical-align":"-2.028ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.416ex",height:"5.107ex",role:"img",focusable:"false",viewBox:"0 -1361 9023.7 2257.4","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},c={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"38.1ex",height:"2.48ex",role:"img",focusable:"false",viewBox:"0 -846 16840.4 1096","aria-hidden":"true"},i={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},L={style:{"vertical-align":"-12.603ex"},xmlns:"http://www.w3.org/2000/svg",width:"42.323ex",height:"26.336ex",role:"img",focusable:"false",viewBox:"0 -6070.3 18706.7 11640.6","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},M={style:{"vertical-align":"-4.69ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.974ex",height:"10.511ex",role:"img",focusable:"false",viewBox:"0 -2573 4850.4 4646","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},Z={style:{"vertical-align":"-2.819ex"},xmlns:"http://www.w3.org/2000/svg",width:"28.933ex",height:"6.74ex",role:"img",focusable:"false",viewBox:"0 -1733 12788.3 2978.9","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{position:"relative"}},x={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.262ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2768 1000","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{position:"relative"}},y={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.348ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 596 899","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{position:"relative"}},b={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.816ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2570.7 1000","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{position:"relative"}},j={style:{"vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.061ex",height:"1.618ex",role:"img",focusable:"false",viewBox:"0 -705 469 715","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{position:"relative"}},O={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.947ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 3070.7 1000","aria-hidden":"true"},R={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},B={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"29.382ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 12986.8 1000","aria-hidden":"true"},A={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},X={style:{"vertical-align":"-13.611ex"},xmlns:"http://www.w3.org/2000/svg",width:"46.284ex",height:"28.353ex",role:"img",focusable:"false",viewBox:"0 -6516 20457.4 12532","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},N={style:{"vertical-align":"-2.933ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.517ex",height:"6.998ex",role:"img",focusable:"false",viewBox:"0 -1796.5 3764.5 3093","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{position:"relative"}},F={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.991ex",height:"2.057ex",role:"img",focusable:"false",viewBox:"0 -704 438 909","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},P={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.429ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 13891.8 1000","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},G={style:{"vertical-align":"-13.611ex"},xmlns:"http://www.w3.org/2000/svg",width:"39.033ex",height:"28.353ex",role:"img",focusable:"false",viewBox:"0 -6516 17252.6 12532","aria-hidden":"true"},I={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},z={style:{"vertical-align":"-2.036ex"},xmlns:"http://www.w3.org/2000/svg",width:"17.803ex",height:"5.204ex",role:"img",focusable:"false",viewBox:"0 -1400 7869 2300","aria-hidden":"true"};function q(U,T){return t(),a("div",null,[T[45]||(T[45]=Q("h1",{id:"环境光渲染-一",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#环境光渲染-一"},[Q("span",null,"环境光渲染(一)")])],-1)),T[46]||(T[46]=Q("hr",null,null,-1)),T[47]||(T[47]=Q("h2",{id:"_1-定义",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#_1-定义"},[Q("span",null,"1. 定义")])],-1)),T[48]||(T[48]=Q("p",null,"使用一张HDR环境图片作为环境光源,每个像素表示一个光源和入射方向,回顾一下渲染方程",-1)),Q("mjx-container",e,[(t(),a("svg",o,T[0]||(T[0]=[m('',1)]))),T[1]||(T[1]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"o")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"o")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"Ω")])]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("msub",null,[Q("mi",null,"k"),Q("mi",null,"d")]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"c"),Q("mi",null,"π")])]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"f"),Q("mi",null,"s")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",null,","),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"o")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{"data-mjx-texclass":"CLOSE"},")")]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"ω"),Q("mo",{stretchy:"false"},"→")])]),Q("mi",null,"i")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"n"),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")])])],-1))]),T[49]||(T[49]=Q("p",null,"显然在实时渲染系统中,针对环境贴图做完整的积分运算代价非常昂贵,所以需要做预处理",-1)),T[50]||(T[50]=Q("h2",{id:"_2-漫反射部分",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#_2-漫反射部分"},[Q("span",null,"2.漫反射部分")])],-1)),T[51]||(T[51]=Q("h3",{id:"_2-1-原理",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#_2-1-原理"},[Q("span",null,"2.1 原理")])],-1)),T[52]||(T[52]=Q("p",null,"只考虑渲染方程中的漫反射部分",-1)),Q("mjx-container",r,[(t(),a("svg",p,T[2]||(T[2]=[m('',1)]))),T[3]||(T[3]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msub",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"o"),Q("mi",null,"d")])]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"o")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"k"),Q("mi",null,"d")]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"c"),Q("mi",null,"π")])]),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"Ω")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"ω"),Q("mo",{stretchy:"false"},"→")])]),Q("mi",null,"i")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"n"),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")])])],-1))]),T[53]||(T[53]=Q("p",null,"将其中之和光照贴图相关的部分做一个预计算,针对所有球面方向,每个方向做一个半球积分",-1)),Q("mjx-container",g,[(t(),a("svg",H,T[4]||(T[4]=[m('',1)]))),T[5]||(T[5]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"Ω")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"ω"),Q("mo",{stretchy:"false"},"→")])]),Q("mi",null,"i")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"n"),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")])])],-1))]),T[54]||(T[54]=Q("p",null,"将结果存成一张新的环境贴图Irradiance,那么最终实时渲染时,漫反射部分可以这个贴图来计算",-1)),Q("mjx-container",h,[(t(),a("svg",c,T[6]||(T[6]=[m('',1)]))),T[7]||(T[7]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msub",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"o"),Q("mi",null,"d")])]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"o")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mtext",null,"TexCube"),Q("mo",{stretchy:"false"},"("),Q("mtext",null,"IrrMap"),Q("mo",null,","),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"n"),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"∗"),Q("msub",null,[Q("mi",null,"k"),Q("mi",null,"d")]),Q("mo",null,"∗"),Q("mi",null,"c")])],-1))]),T[55]||(T[55]=m('

2.2 漫反射环境贴图的生成

2.2.1 球坐标积分

将立体角转换为球坐标

',4)),Q("mjx-container",i,[(t(),a("svg",L,T[8]||(T[8]=[m('',1)]))),T[9]||(T[9]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"Ω")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"ω"),Q("mo",{stretchy:"false"},"→")])]),Q("mi",null,"i")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mover",null,[Q("mi",null,"n"),Q("mo",{stretchy:"false"},"→")])]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("msub",null,[Q("mi",null,"ω"),Q("mi",null,"i")])])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"ϕ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"2"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"θ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"π"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"ϕ"),Q("mo",null,","),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("mi",null,"θ"),Q("mi",null,"d"),Q("mi",null,"ϕ")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"≈")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mrow",null,[Q("mn",null,"2"),Q("mi",null,"π")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mrow",null,[Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mrow",null,[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])])])])],-1))]),T[56]||(T[56]=Q("p",null,"其中:",-1)),Q("mjx-container",u,[(t(),a("svg",M,T[10]||(T[10]=[m('',1)]))),T[11]||(T[11]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right",columnspacing:"",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,"="),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"j"),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("mn",null,"2"),Q("mi",null,"π")])]),Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",null,"="),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"i"),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mn",null,"2")])])])])])])],-1))]),T[57]||(T[57]=m(`

代码:

vec3 irradiance = vec3(0.0);  

// tangent space calculation from origin point(x'=up, y'=N, z'=left)(left-hand)
vec3 up    = vec3(0.0, 1.0, 0.0);   //x'
vec3 left = cross(up, N);			//z'
up         = cross(N, left);		//x'

float sampleDelta = 0.025;
float nrSamples = 0.0; 
for(float phi = 0.0; phi < 2.0 * PI; phi += sampleDelta)
{
    for(float theta = 0.0; theta < 0.5 * PI; theta += sampleDelta)
    {
        float cosTheta = cos(theta);
        float sinTheta = sin(theta);
    
        // spherical to cartesian (in tangent space)
        vec3 tangentSample = vec3(cos(phi) * sinTheta, cosTheta, sin(phi) * sinTheta);
        // tangent space to world
        vec3 sampleVec = tangentSample.x * up + tangentSample.y * N + tangentSample.z * left; 

        irradiance += texture(environmentMap, sampleVec).rgb * cosTheta * sinTheta;
        nrSamples++;
    }
}
irradiance = PI * irradiance * float(nrSamples);

2.2.2 蒙特卡洛估算

使用蒙特卡洛采样估算积分

`,4)),Q("mjx-container",f,[(t(),a("svg",Z,T[12]||(T[12]=[m('',1)]))),T[13]||(T[13]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"a")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"b")])]),Q("mi",null,"f"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"x"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("mi",null,"x"),Q("mo",null,"≈"),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"N")])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"N")])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"f"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"X"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")]),Q("mrow",null,[Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"X"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])])])])])],-1))]),Q("p",null,[T[24]||(T[24]=n("其中")),Q("mjx-container",V,[(t(),a("svg",x,T[14]||(T[14]=[m('',1)]))),T[15]||(T[15]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"x"),Q("mo",{stretchy:"false"},")")])],-1))]),T[25]||(T[25]=n("函数是采样时使用的概率分布函数。 方法1: 对于要计算的这个二维积分,如果使用的随机采样是")),Q("mjx-container",D,[(t(),a("svg",y,T[16]||(T[16]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D719",d:"M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z"})])])],-1)]))),T[17]||(T[17]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"ϕ")])],-1))]),T[26]||(T[26]=n("在")),Q("mjx-container",w,[(t(),a("svg",b,T[18]||(T[18]=[m('',1)]))),T[19]||(T[19]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"["),Q("mn",null,"0"),Q("mo",null,","),Q("mn",null,"2"),Q("mi",null,"π"),Q("mo",{stretchy:"false"},"]")])],-1))]),T[27]||(T[27]=n("之间均匀分布,")),Q("mjx-container",k,[(t(),a("svg",j,T[20]||(T[20]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D703",d:"M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z"})])])],-1)]))),T[21]||(T[21]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"θ")])],-1))]),T[28]||(T[28]=n("在")),Q("mjx-container",v,[(t(),a("svg",O,T[22]||(T[22]=[m('',1)]))),T[23]||(T[23]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"["),Q("mn",null,"0"),Q("mo",null,","),Q("mi",null,"π"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2"),Q("mo",{stretchy:"false"},"]")])],-1))]),T[29]||(T[29]=n("之间均匀分布,那么"))]),Q("mjx-container",R,[(t(),a("svg",B,T[30]||(T[30]=[m('',1)]))),T[31]||(T[31]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"ϕ"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mi",null,"π"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mn",null,"2"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mi",null,"π")])],-1))]),Q("mjx-container",A,[(t(),a("svg",X,T[32]||(T[32]=[m('',1)]))),T[33]||(T[33]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"ϕ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"2"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"θ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"π"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"ϕ"),Q("mo",null,","),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("mi",null,"θ"),Q("mi",null,"d"),Q("mi",null,"ϕ")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mrow",null,[Q("mn",null,"2"),Q("mi",null,"π")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mrow",null,[Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mrow",null,[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mi",null,"N")])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"N")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"i")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])])])])],-1))]),T[58]||(T[58]=Q("p",null,"其中",-1)),Q("mjx-container",C,[(t(),a("svg",N,T[34]||(T[34]=[m('',1)]))),T[35]||(T[35]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"i")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mn",null,"2"),Q("mi",null,"π"),Q("mi",null,"ξ")])]),Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mi",null,"π"),Q("mn",null,"2")])]),Q("mi",null,"ξ")])])])])],-1))]),Q("p",null,[Q("mjx-container",E,[(t(),a("svg",F,T[36]||(T[36]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D709",d:"M268 632Q268 704 296 704Q314 704 314 687Q314 682 311 664T308 635T309 620V616H315Q342 619 360 619Q443 619 443 586Q439 548 358 546H344Q326 546 317 549T290 566Q257 550 226 505T195 405Q195 381 201 364T211 342T218 337Q266 347 298 347Q375 347 375 314Q374 297 359 288T327 277T280 275Q234 275 208 283L195 286Q149 260 119 214T88 130Q88 116 90 108Q101 79 129 63T229 20Q238 17 243 15Q337 -21 354 -33Q383 -53 383 -94Q383 -137 351 -171T273 -205Q240 -205 202 -190T158 -167Q156 -163 156 -159Q156 -151 161 -146T176 -140Q182 -140 189 -143Q232 -168 274 -168Q286 -168 292 -165Q313 -151 313 -129Q313 -112 301 -104T232 -75Q214 -68 204 -64Q198 -62 171 -52T136 -38T107 -24T78 -8T56 12T36 37T26 66T21 103Q21 149 55 206T145 301L154 307L148 313Q141 319 136 323T124 338T111 358T103 382T99 413Q99 471 143 524T259 602L271 607Q268 618 268 632Z"})])])],-1)]))),T[37]||(T[37]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"ξ")])],-1))]),T[38]||(T[38]=n("表示均匀分布在[0,1]之间的随机变量"))]),T[59]||(T[59]=Q("p",null,"方法2: 上面的采样方法在极点位置会比较密集,在赤道位置比较稀疏,由于漫反射是均匀分布的,如果采样点也是均匀分布在半球面上的,收敛速度会比较快,这种情况下",-1)),Q("mjx-container",S,[(t(),a("svg",P,T[39]||(T[39]=[m('',1)]))),T[40]||(T[40]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"ϕ"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mi",null,"π"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("mtext",null,"pdf"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")")])],-1))]),Q("mjx-container",J,[(t(),a("svg",G,T[41]||(T[41]=[m('',1)]))),T[42]||(T[42]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"ϕ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"2"),Q("mi",null,"π")])]),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"θ"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"π"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"ϕ"),Q("mo",null,","),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"sin"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"θ"),Q("mo",{stretchy:"false"},")"),Q("mi",null,"d"),Q("mi",null,"θ"),Q("mi",null,"d"),Q("mi",null,"ϕ")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("mi",null,"π")])]),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mrow",null,[Q("mn",null,"2"),Q("mi",null,"π")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"1"),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"2"),Q("mrow",null,[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")]),Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"1")])])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"n"),Q("mn",null,"2")])])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"j")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"=")]),Q("mtd",null,[Q("mstyle",{displaystyle:"true",scriptlevel:"0"},[Q("mfrac",null,[Q("mn",null,"2"),Q("mi",null,"N")])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"="),Q("mn",null,"0")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"N")])]),Q("msub",null,[Q("mi",null,"L"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"i")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")"),Q("mi",null,"cos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")]),Q("mo",{stretchy:"false"},")")])])])])],-1))]),T[60]||(T[60]=Q("p",null,"其中",-1)),Q("mjx-container",I,[(t(),a("svg",z,T[43]||(T[43]=[m('',1)]))),T[44]||(T[44]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"ϕ"),Q("mi",null,"i")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mn",null,"2"),Q("mi",null,"π"),Q("mi",null,"ξ")])]),Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"θ"),Q("mi",null,"i")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mi",null,"arccos"),Q("mo",{"data-mjx-texclass":"NONE"},"⁡"),Q("mo",{stretchy:"false"},"("),Q("mn",null,"1"),Q("mo",null,"−"),Q("mi",null,"ξ"),Q("mo",{stretchy:"false"},")")])])])])],-1))]),T[61]||(T[61]=m(`
vec3 irradiance = vec3(0.0);  

vec3 up = vec3(0.0, 1.0, 0.0); //x'
vec3 left = cross(up, N);	//z'
up = cross(N, left);	//x'

for(uint i=0; i<sampleCounts; i++)
{
    //http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
    vec2 uv = Hammersley(i, totalCounts);

    // tangent space sample point
    float phi = uv.y * 2.0 * PI;
    float cosTheta = 1.0 - uv.x;
    float sinTheta = sqrt(1-cosTheta*cosTheta);
    vec3 tangentSample = vec3(cos(phi) * sinTheta, cosTheta, sin(phi) * sinTheta);

    // tangent space to world
    vec3 sampleVec = tangentSample.x * up + tangentSample.y * N + tangentSample.z * left; 

    irradiance += texture2D(s_texSkybox, sampleVec).rgb * cosTheta;
}

irradiance = 2*irradiance / float(sampleCounts);
`,1))])}const W=l(d,[["render",q],["__file","ibl_01.html.vue"]]),Y=JSON.parse('{"path":"/note/graphics/image_based_lighting/ibl_01.html","title":"环境光渲染(一)","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"1. 定义","slug":"_1-定义","link":"#_1-定义","children":[]},{"level":2,"title":"2.漫反射部分","slug":"_2-漫反射部分","link":"#_2-漫反射部分","children":[{"level":3,"title":"2.1 原理","slug":"_2-1-原理","link":"#_2-1-原理","children":[]},{"level":3,"title":"2.2 漫反射环境贴图的生成","slug":"_2-2-漫反射环境贴图的生成","link":"#_2-2-漫反射环境贴图的生成","children":[]}]}],"git":{},"filePathRelative":"note/graphics/image_based_lighting/ibl_01.md"}');export{W as comp,Y as data};