Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
imjiangjun
pbrt-v4
提交
30f4c9d0
P
pbrt-v4
项目概览
imjiangjun
/
pbrt-v4
12 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
pbrt-v4
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
30f4c9d0
编写于
8月 22, 2021
作者:
M
Matt Pharr
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
clang-format run in wavefront/
上级
bd0e8574
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
94 addition
and
112 deletion
+94
-112
src/pbrt/wavefront/integrator.cpp
src/pbrt/wavefront/integrator.cpp
+4
-5
src/pbrt/wavefront/intersect.h
src/pbrt/wavefront/intersect.h
+20
-28
src/pbrt/wavefront/media.cpp
src/pbrt/wavefront/media.cpp
+23
-26
src/pbrt/wavefront/subsurface.cpp
src/pbrt/wavefront/subsurface.cpp
+20
-23
src/pbrt/wavefront/surfscatter.cpp
src/pbrt/wavefront/surfscatter.cpp
+20
-22
src/pbrt/wavefront/workitems.h
src/pbrt/wavefront/workitems.h
+7
-8
未找到文件。
src/pbrt/wavefront/integrator.cpp
浏览文件 @
30f4c9d0
...
...
@@ -597,9 +597,8 @@ void WavefrontPathIntegrator::HandleEscapedRays() {
L
[
2
],
L
[
3
],
w
.
beta
[
0
],
w
.
beta
[
1
],
w
.
beta
[
2
],
w
.
beta
[
3
],
Le
[
0
],
Le
[
1
],
Le
[
2
],
Le
[
3
]);
PBRT_DBG
(
"pdf uni %f %f %f %f pdf nee %f %f %f %f"
,
w
.
inv_w_u
[
0
],
w
.
inv_w_u
[
1
],
w
.
inv_w_u
[
2
],
w
.
inv_w_u
[
3
],
w
.
inv_w_l
[
0
],
w
.
inv_w_l
[
1
],
w
.
inv_w_l
[
2
],
w
.
inv_w_l
[
3
]);
w
.
inv_w_u
[
1
],
w
.
inv_w_u
[
2
],
w
.
inv_w_u
[
3
],
w
.
inv_w_l
[
0
],
w
.
inv_w_l
[
1
],
w
.
inv_w_l
[
2
],
w
.
inv_w_l
[
3
]);
if
(
w
.
depth
==
0
||
w
.
specularBounce
)
{
L
+=
w
.
beta
*
Le
/
w
.
inv_w_u
.
Average
();
...
...
@@ -607,8 +606,8 @@ void WavefrontPathIntegrator::HandleEscapedRays() {
// Compute MIS-weighted radiance contribution from infinite light
LightSampleContext
ctx
=
w
.
prevIntrCtx
;
Float
lightChoicePDF
=
lightSampler
.
PMF
(
ctx
,
light
);
SampledSpectrum
inv_w_l
=
w
.
inv_w_l
*
lightChoicePDF
*
light
.
PDF_Li
(
ctx
,
w
.
rayd
,
true
);
SampledSpectrum
inv_w_l
=
w
.
inv_w_l
*
lightChoicePDF
*
light
.
PDF_Li
(
ctx
,
w
.
rayd
,
true
);
L
+=
w
.
beta
*
Le
/
(
w
.
inv_w_u
+
inv_w_l
).
Average
();
}
}
...
...
src/pbrt/wavefront/intersect.h
浏览文件 @
30f4c9d0
...
...
@@ -38,9 +38,9 @@ inline PBRT_CPU_GPU void RecordShadowRayResult(const ShadowRayWorkItem w,
SampledSpectrum
Ld
=
w
.
Ld
/
(
w
.
inv_w_u
+
w
.
inv_w_l
).
Average
();
PBRT_DBG
(
"Unoccluded shadow ray. Final Ld %f %f %f %f "
"(sr.Ld %f %f %f %f inv_w_u %f %f %f %f inv_w_l %f %f %f %f)
\n
"
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
w
.
Ld
[
0
],
w
.
Ld
[
1
],
w
.
Ld
[
2
],
w
.
Ld
[
3
],
w
.
inv_w_u
[
0
],
w
.
inv_w_u
[
1
],
w
.
inv_w_u
[
2
],
w
.
inv_w_u
[
3
],
w
.
inv_w_l
[
0
],
w
.
inv_w_l
[
1
],
w
.
inv_w_l
[
2
],
w
.
inv_w_l
[
3
]);
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
w
.
Ld
[
0
],
w
.
Ld
[
1
],
w
.
Ld
[
2
],
w
.
Ld
[
3
],
w
.
inv_w_u
[
0
],
w
.
inv_w_u
[
1
],
w
.
inv_w_u
[
2
],
w
.
inv_w_u
[
3
],
w
.
inv_w_l
[
0
],
w
.
inv_w_l
[
1
],
w
.
inv_w_l
[
2
],
w
.
inv_w_l
[
3
]);
SampledSpectrum
Lpixel
=
pixelSampleState
->
L
[
w
.
pixelIndex
];
pixelSampleState
->
L
[
w
.
pixelIndex
]
=
Lpixel
+
Ld
;
...
...
@@ -101,10 +101,9 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
PBRT_DBG
(
"Enqueuing into medium transition queue: pixel index %d
\n
"
,
r
.
pixelIndex
);
Ray
newRay
=
intr
.
SpawnRay
(
r
.
ray
.
d
);
nextRayQueue
->
PushIndirectRay
(
newRay
,
r
.
depth
,
r
.
prevIntrCtx
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
lambda
,
r
.
etaScale
,
r
.
specularBounce
,
r
.
anyNonSpecularBounces
,
r
.
pixelIndex
);
nextRayQueue
->
PushIndirectRay
(
newRay
,
r
.
depth
,
r
.
prevIntrCtx
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
lambda
,
r
.
etaScale
,
r
.
specularBounce
,
r
.
anyNonSpecularBounces
,
r
.
pixelIndex
);
return
;
}
...
...
@@ -113,10 +112,9 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
r
.
pixelIndex
);
Ray
ray
=
r
.
ray
;
// TODO: intr.wo == -ray.d?
hitAreaLightQueue
->
Push
(
HitAreaLightWorkItem
{
intr
.
areaLight
,
intr
.
p
(),
intr
.
n
,
intr
.
uv
,
intr
.
wo
,
r
.
lambda
,
r
.
depth
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
prevIntrCtx
,
(
int
)
r
.
specularBounce
,
r
.
pixelIndex
});
hitAreaLightQueue
->
Push
(
HitAreaLightWorkItem
{
intr
.
areaLight
,
intr
.
p
(),
intr
.
n
,
intr
.
uv
,
intr
.
wo
,
r
.
lambda
,
r
.
depth
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
prevIntrCtx
,
(
int
)
r
.
specularBounce
,
r
.
pixelIndex
});
}
FloatTexture
displacement
=
material
.
GetDisplacement
();
...
...
@@ -232,8 +230,8 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
PBRT_DBG
(
"T_ray %f %f %f %f inv_w_l %f %f %f %f inv_w_u %f "
"%f %f %f
\n
"
,
T_ray
[
0
],
T_ray
[
1
],
T_ray
[
2
],
T_ray
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
]);
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
]);
if
(
!
T_ray
)
return
false
;
...
...
@@ -255,27 +253,21 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
PBRT_DBG
(
"Final T_ray %.9g %.9g %.9g %.9g sr.inv_w_u %.9g %.9g %.9g %.9g "
"inv_w_u %.9g %.9g %.9g %.9g
\n
"
,
T_ray
[
0
],
T_ray
[
1
],
T_ray
[
2
],
T_ray
[
3
],
sr
.
inv_w_u
[
0
],
sr
.
inv_w_u
[
1
],
sr
.
inv_w_u
[
2
],
sr
.
inv_w_u
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
]);
sr
.
inv_w_u
[
2
],
sr
.
inv_w_u
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
]);
PBRT_DBG
(
"sr.inv_w_l %.9g %.9g %.9g %.9g inv_w_l %.9g %.9g %.9g %.9g
\n
"
,
sr
.
inv_w_l
[
0
],
sr
.
inv_w_l
[
1
],
sr
.
inv_w_l
[
2
],
sr
.
inv_w_l
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
sr
.
inv_w_l
[
0
],
sr
.
inv_w_l
[
1
],
sr
.
inv_w_l
[
2
],
sr
.
inv_w_l
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
PBRT_DBG
(
"scaled throughput %.9g %.9g %.9g %.9g
\n
"
,
T_ray
[
0
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
1
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
2
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
3
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
());
T_ray
[
0
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
1
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
2
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
(),
T_ray
[
3
]
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
());
if
(
T_ray
)
{
// FIXME/reconcile: this takes inv_w_l as input while
// e.g. VolPathIntegrator::SampleLd() does not...
Ld
*=
T_ray
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
();
Ld
*=
T_ray
/
(
sr
.
inv_w_u
*
inv_w_u
+
sr
.
inv_w_l
*
inv_w_l
).
Average
();
PBRT_DBG
(
"Setting final Ld for shadow ray pixel index %d = as %f %f %f %f
\n
"
,
sr
.
pixelIndex
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
]);
...
...
src/pbrt/wavefront/media.cpp
浏览文件 @
30f4c9d0
...
...
@@ -47,8 +47,8 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
PBRT_DBG
(
"Medium sample beta %f %f %f %f inv_w_u %f %f %f %f "
"inv_w_l %f %f %f %f
\n
"
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
// Sample the medium according to T_maj, the homogeneous
// transmission function based on the majorant.
...
...
@@ -110,8 +110,8 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
using
PhaseFunction
=
typename
std
::
remove_const_t
<
std
::
remove_reference_t
<
decltype
(
*
ptr
)
>>
;
mediumScatterQueue
->
Push
(
MediumScatterWorkItem
<
PhaseFunction
>
{
p
,
w
.
depth
,
lambda
,
beta
,
inv_w_u
,
ptr
,
-
ray
.
d
,
ray
.
time
,
w
.
etaScale
,
ray
.
medium
,
w
.
pixelIndex
});
p
,
w
.
depth
,
lambda
,
beta
,
inv_w_u
,
ptr
,
-
ray
.
d
,
ray
.
time
,
w
.
etaScale
,
ray
.
medium
,
w
.
pixelIndex
});
};
DCHECK_RARE
(
1e-6
f
,
!
beta
);
if
(
beta
&&
inv_w_u
)
...
...
@@ -146,8 +146,8 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
L
[
1
],
L
[
2
],
L
[
3
],
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
]);
PBRT_DBG
(
"Post ray medium sample inv_w_u %f %f %f %f inv_w_l %f %f "
"%f %f
\n
"
,
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
]);
// Add any emission found to its pixel sample's L value.
if
(
L
)
{
...
...
@@ -192,10 +192,9 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
Interaction
intr
(
w
.
pi
,
w
.
n
);
intr
.
mediumInterface
=
&
w
.
mediumInterface
;
Ray
newRay
=
intr
.
SpawnRay
(
ray
.
d
);
nextRayQueue
->
PushIndirectRay
(
newRay
,
w
.
depth
,
w
.
prevIntrCtx
,
beta
,
inv_w_u
,
inv_w_l
,
lambda
,
w
.
etaScale
,
w
.
specularBounce
,
w
.
anyNonSpecularBounces
,
w
.
pixelIndex
);
nextRayQueue
->
PushIndirectRay
(
newRay
,
w
.
depth
,
w
.
prevIntrCtx
,
beta
,
inv_w_u
,
inv_w_l
,
lambda
,
w
.
etaScale
,
w
.
specularBounce
,
w
.
anyNonSpecularBounces
,
w
.
pixelIndex
);
return
;
}
...
...
@@ -204,10 +203,9 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
"Ray hit an area light: adding to hitAreaLightQueue pixel index %d "
"depth %d
\n
"
,
w
.
pixelIndex
,
w
.
depth
);
hitAreaLightQueue
->
Push
(
HitAreaLightWorkItem
{
w
.
areaLight
,
Point3f
(
w
.
pi
),
w
.
n
,
w
.
uv
,
-
ray
.
d
,
lambda
,
w
.
depth
,
beta
,
inv_w_u
,
inv_w_l
,
w
.
prevIntrCtx
,
w
.
specularBounce
,
w
.
pixelIndex
});
hitAreaLightQueue
->
Push
(
HitAreaLightWorkItem
{
w
.
areaLight
,
Point3f
(
w
.
pi
),
w
.
n
,
w
.
uv
,
-
ray
.
d
,
lambda
,
w
.
depth
,
beta
,
inv_w_u
,
inv_w_l
,
w
.
prevIntrCtx
,
w
.
specularBounce
,
w
.
pixelIndex
});
}
FloatTexture
displacement
=
material
.
GetDisplacement
();
...
...
@@ -287,8 +285,8 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
Vector3f
wi
=
ls
->
wi
;
SampledSpectrum
beta
=
w
.
beta
*
w
.
phase
->
p
(
wo
,
wi
);
PBRT_DBG
(
"Phase phase beta %f %f %f %f
\n
"
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
]);
PBRT_DBG
(
"Phase phase beta %f %f %f %f
\n
"
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
]);
// Compute PDFs for direct lighting MIS calculation.
Float
lightPDF
=
ls
->
pdf
*
sampledLight
->
p
;
...
...
@@ -302,16 +300,15 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
// Enqueue shadow ray
shadowRayQueue
->
Push
(
ShadowRayWorkItem
{
ray
,
1
-
ShadowEpsilon
,
w
.
lambda
,
Ld
,
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
w
.
lambda
,
Ld
,
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
PBRT_DBG
(
"Enqueued medium shadow ray depth %d "
"Ld %f %f %f %f inv_w_u %f %f %f %f "
"inv_w_l %f %f %f %f pixel index %d
\n
"
,
w
.
depth
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
w
.
pixelIndex
);
w
.
depth
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
inv_w_u
[
0
],
inv_w_u
[
1
],
inv_w_u
[
2
],
inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
w
.
pixelIndex
);
}
}
...
...
@@ -345,9 +342,9 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
bool
anyNonSpecularBounces
=
true
;
// Spawn indirect ray.
nextRayQueue
->
PushIndirectRay
(
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
inv_w_u
,
inv_w_l
,
w
.
lambda
,
w
.
etaScale
,
specularBounce
,
anyNonSpecularBounces
,
w
.
pixelIndex
);
nextRayQueue
->
PushIndirectRay
(
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
inv_w_u
,
inv_w_l
,
w
.
lambda
,
w
.
etaScale
,
specularBounce
,
anyNonSpecularBounces
,
w
.
pixelIndex
);
PBRT_DBG
(
"Enqueuing indirect medium ray at depth %d pixel index %d
\n
"
,
w
.
depth
+
1
,
w
.
pixelIndex
);
});
...
...
src/pbrt/wavefront/subsurface.cpp
浏览文件 @
30f4c9d0
...
...
@@ -38,9 +38,9 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
pstd
::
optional
<
BSSRDFProbeSegment
>
probeSeg
=
bssrdf
.
SampleSp
(
uc
,
u
);
if
(
probeSeg
)
subsurfaceScatterQueue
->
Push
(
probeSeg
->
p0
,
probeSeg
->
p1
,
w
.
depth
,
material
,
bssrdf
,
lambda
,
w
.
beta
,
w
.
inv_w_u
,
w
.
mediumInterface
,
w
.
etaScale
,
w
.
pixelIndex
);
subsurfaceScatterQueue
->
Push
(
probeSeg
->
p0
,
probeSeg
->
p1
,
w
.
depth
,
material
,
bssrdf
,
lambda
,
w
.
beta
,
w
.
inv_w_u
,
w
.
mediumInterface
,
w
.
etaScale
,
w
.
pixelIndex
);
});
aggregate
->
IntersectOneRandom
(
maxQueueSize
,
subsurfaceScatterQueue
);
...
...
@@ -84,7 +84,8 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
bsdf
.
Sample_f
<
ConcreteBxDF
>
(
wo
,
uc
,
u
);
if
(
bsdfSample
)
{
Vector3f
wi
=
bsdfSample
->
wi
;
SampledSpectrum
beta
=
betap
*
bsdfSample
->
f
*
AbsDot
(
wi
,
intr
.
ns
)
/
bsdfSample
->
pdf
;
SampledSpectrum
beta
=
betap
*
bsdfSample
->
f
*
AbsDot
(
wi
,
intr
.
ns
)
/
bsdfSample
->
pdf
;
SampledSpectrum
indir_inv_w_u
=
inv_w_u
;
PBRT_DBG
(
"%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f
\n
"
,
...
...
@@ -127,9 +128,9 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
LightSampleContext
ctx
(
intr
.
pi
,
intr
.
n
,
intr
.
ns
);
nextRayQueue
->
PushIndirectRay
(
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
indir_inv_w_u
,
inv_w_l
,
lambda
,
etaScale
,
bsdfSample
->
IsSpecular
()
,
anyNonSpecularBounces
,
w
.
pixelIndex
);
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
indir_inv_w_u
,
inv_w_l
,
lambda
,
etaScale
,
bsdfSample
->
IsSpecular
(),
anyNonSpecularBounces
,
w
.
pixelIndex
);
PBRT_DBG
(
"Spawned indirect ray at depth %d. "
"Specular %d T_Hat %f %f %f %f indir_inv_w_u %f %f %f "
...
...
@@ -138,9 +139,8 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
"beta/indir_inv_w_u %f %f %f %f
\n
"
,
w
.
depth
+
1
,
int
(
bsdfSample
->
IsSpecular
()),
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
indir_inv_w_u
[
0
],
indir_inv_w_u
[
1
],
indir_inv_w_u
[
2
],
indir_inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
indir_inv_w_u
[
1
],
indir_inv_w_u
[
2
],
indir_inv_w_u
[
3
],
inv_w_l
[
0
],
inv_w_l
[
1
],
inv_w_l
[
2
],
inv_w_l
[
3
],
SafeDiv
(
beta
,
indir_inv_w_u
)[
0
],
SafeDiv
(
beta
,
indir_inv_w_u
)[
1
],
SafeDiv
(
beta
,
indir_inv_w_u
)[
2
],
...
...
@@ -173,8 +173,8 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
PBRT_DBG
(
"depth %d beta %f %f %f %f f %f %f %f %f ls.L %f %f %f %f ls.pdf "
"%f
\n
"
,
w
.
depth
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
f
[
0
],
f
[
1
],
f
[
2
],
f
[
3
],
ls
->
L
[
0
],
ls
->
L
[
1
],
ls
->
L
[
2
],
ls
->
L
[
3
],
ls
->
pdf
);
w
.
depth
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
f
[
0
],
f
[
1
],
f
[
2
],
f
[
3
],
ls
->
L
[
0
],
ls
->
L
[
1
],
ls
->
L
[
2
],
ls
->
L
[
3
],
ls
->
pdf
);
Float
lightPDF
=
ls
->
pdf
*
sampledLight
->
p
;
// This causes inv_w_u to be zero for the shadow ray, so that
...
...
@@ -186,15 +186,13 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
SampledSpectrum
Ld
=
beta
*
ls
->
L
;
PBRT_DBG
(
"depth %d Ld %f %f %f %f "
PBRT_DBG
(
"depth %d Ld %f %f %f %f "
"new beta %f %f %f %f beta/uni %f %f %f %f Ld/uni %f %f %f %f
\n
"
,
w
.
depth
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
SafeDiv
(
beta
,
inv_w_u
)[
0
],
SafeDiv
(
beta
,
inv_w_u
)[
1
],
SafeDiv
(
beta
,
inv_w_u
)[
2
],
SafeDiv
(
beta
,
inv_w_u
)[
3
],
SafeDiv
(
Ld
,
inv_w_u
)[
0
],
SafeDiv
(
Ld
,
inv_w_u
)[
1
],
SafeDiv
(
Ld
,
inv_w_u
)[
2
],
SafeDiv
(
Ld
,
inv_w_u
)[
3
]);
beta
[
3
],
SafeDiv
(
beta
,
inv_w_u
)[
0
],
SafeDiv
(
beta
,
inv_w_u
)[
1
],
SafeDiv
(
beta
,
inv_w_u
)[
2
],
SafeDiv
(
beta
,
inv_w_u
)[
3
],
SafeDiv
(
Ld
,
inv_w_u
)[
0
],
SafeDiv
(
Ld
,
inv_w_u
)[
1
],
SafeDiv
(
Ld
,
inv_w_u
)[
2
],
SafeDiv
(
Ld
,
inv_w_u
)[
3
]);
Ray
ray
=
SpawnRayTo
(
intr
.
pi
,
intr
.
n
,
time
,
ls
->
pLight
.
pi
,
ls
->
pLight
.
n
);
if
(
haveMedia
)
...
...
@@ -203,8 +201,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
:
w
.
mediumInterface
.
inside
;
shadowRayQueue
->
Push
(
ShadowRayWorkItem
{
ray
,
1
-
ShadowEpsilon
,
lambda
,
Ld
,
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
}
});
...
...
src/pbrt/wavefront/surfscatter.cpp
浏览文件 @
30f4c9d0
...
...
@@ -166,7 +166,8 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
if
(
bsdfSample
)
{
// Compute updated path throughput and PDFs and enqueue indirect ray
Vector3f
wi
=
bsdfSample
->
wi
;
SampledSpectrum
beta
=
w
.
beta
*
bsdfSample
->
f
*
AbsDot
(
wi
,
ns
)
/
bsdfSample
->
pdf
;
SampledSpectrum
beta
=
w
.
beta
*
bsdfSample
->
f
*
AbsDot
(
wi
,
ns
)
/
bsdfSample
->
pdf
;
SampledSpectrum
inv_w_u
=
w
.
inv_w_u
,
inv_w_l
;
PBRT_DBG
(
"%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f
\n
"
,
...
...
@@ -220,12 +221,11 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// NOTE: slightly different than context below. Problem?
LightSampleContext
ctx
(
w
.
pi
,
w
.
n
,
ns
);
nextRayQueue
->
PushIndirectRay
(
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
inv_w_u
,
inv_w_l
,
lambda
,
etaScale
,
bsdfSample
->
IsSpecular
()
,
anyNonSpecularBounces
,
w
.
pixelIndex
);
ray
,
w
.
depth
+
1
,
ctx
,
beta
,
inv_w_u
,
inv_w_l
,
lambda
,
etaScale
,
bsdfSample
->
IsSpecular
(),
anyNonSpecularBounces
,
w
.
pixelIndex
);
PBRT_DBG
(
"Spawned indirect ray at depth %d from w.index %d. "
PBRT_DBG
(
"Spawned indirect ray at depth %d from w.index %d. "
"Specular %d beta %f %f %f %f inv_w_u %f %f %f %f "
"inv_w_l %f %f %f %f
\n
"
,
w
.
depth
+
1
,
w
.
pixelIndex
,
int
(
bsdfSample
->
IsSpecular
()),
...
...
@@ -270,8 +270,8 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
PBRT_DBG
(
"me index %d depth %d beta %f %f %f %f f %f %f %f %f ls.L %f %f %f "
"%f ls.pdf %f
\n
"
,
w
.
pixelIndex
,
w
.
depth
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
f
[
0
],
f
[
1
],
f
[
2
],
f
[
3
],
ls
->
L
[
0
],
ls
->
L
[
1
],
ls
->
L
[
2
],
ls
->
L
[
3
],
ls
->
pdf
);
w
.
pixelIndex
,
w
.
depth
,
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
],
f
[
0
],
f
[
1
],
f
[
2
],
f
[
3
],
ls
->
L
[
0
],
ls
->
L
[
1
],
ls
->
L
[
2
],
ls
->
L
[
3
],
ls
->
pdf
);
Float
lightPDF
=
ls
->
pdf
*
sampledLight
->
p
;
// This causes inv_w_u to be zero for the shadow ray, so that
...
...
@@ -290,14 +290,12 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
:
w
.
mediumInterface
.
inside
;
shadowRayQueue
->
Push
(
ShadowRayWorkItem
{
ray
,
1
-
ShadowEpsilon
,
lambda
,
Ld
,
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
inv_w_u
,
inv_w_l
,
w
.
pixelIndex
});
PBRT_DBG
(
"w.index %d spawned shadow ray depth %d Ld %f %f %f %f "
PBRT_DBG
(
"w.index %d spawned shadow ray depth %d Ld %f %f %f %f "
"new beta %f %f %f %f
\n
"
,
w
.
pixelIndex
,
w
.
depth
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
]);
w
.
pixelIndex
,
w
.
depth
,
Ld
[
0
],
Ld
[
1
],
Ld
[
2
],
Ld
[
3
],
beta
[
0
],
beta
[
1
],
beta
[
2
],
beta
[
3
]);
}
});
}
...
...
src/pbrt/wavefront/workitems.h
浏览文件 @
30f4c9d0
...
...
@@ -351,9 +351,9 @@ class RayQueue : public WorkQueue<RayWorkItem> {
PBRT_CPU_GPU
int
PushIndirectRay
(
const
Ray
&
ray
,
int
depth
,
const
LightSampleContext
&
prevIntrCtx
,
const
SampledSpectrum
&
beta
,
const
SampledSpectrum
&
inv_w_u
,
const
SampledSpectrum
&
inv_w_l
,
const
SampledWavelengths
&
lambda
,
Float
etaScale
,
bool
specularBounce
,
bool
anyNonSpecularBounces
,
int
pixelIndex
);
const
SampledSpectrum
&
inv_w_l
,
const
SampledWavelengths
&
lambda
,
Float
etaScale
,
bool
specularBounce
,
bool
anyNonSpecularBounces
,
int
pixelIndex
);
};
// RayQueue Inline Methods
...
...
@@ -413,8 +413,8 @@ class EscapedRayQueue : public WorkQueue<EscapedRayWorkItem> {
inline
int
EscapedRayQueue
::
Push
(
RayWorkItem
r
)
{
return
Push
(
EscapedRayWorkItem
{
r
.
ray
.
o
,
r
.
ray
.
d
,
r
.
depth
,
r
.
lambda
,
r
.
pixelIndex
,
r
.
beta
,
(
int
)
r
.
specularBounce
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
prevIntrCtx
});
r
.
beta
,
(
int
)
r
.
specularBounce
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
prevIntrCtx
});
}
// GetBSSRDFAndProbeRayQueue Definition
...
...
@@ -500,9 +500,8 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
PBRT_CPU_GPU
int
Push
(
RayWorkItem
r
,
Float
tMax
)
{
return
Push
(
r
.
ray
,
tMax
,
r
.
lambda
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
pixelIndex
,
r
.
prevIntrCtx
,
r
.
specularBounce
,
r
.
anyNonSpecularBounces
,
r
.
etaScale
);
return
Push
(
r
.
ray
,
tMax
,
r
.
lambda
,
r
.
beta
,
r
.
inv_w_u
,
r
.
inv_w_l
,
r
.
pixelIndex
,
r
.
prevIntrCtx
,
r
.
specularBounce
,
r
.
anyNonSpecularBounces
,
r
.
etaScale
);
}
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录