ZhangZhihui's Blog  

对于一个Sun类型的光源,当选中了Temperature后下面的Tint还起作用吗?

 

依然起作用。

在 Blender 中勾选 Temperature(色温) 后,下方的 Tint(色调) 并没有被禁用,而是会与色温共同叠加计算最终的光照颜色。

  • Temperature 决定了基础的黑体辐射色温(通过开尔文数值控制冷暖,如日光的 5500K、烛光的 1800K 等)。

  • Tint 则在此基础之上提供额外的色彩偏移补偿(类似于摄影中用于修正绿/红倾向的色调微调,或进行局部的色彩倾向修饰)。

两者的效果会结合在一起共同影响太阳光(Sun)的最终输出颜色。

 

 

 

在Blender中,我做了一株䓍,䓍叶的厚度为0.001m,材质是用图片做的UV Mapping,Subsurface用的Random Walk,weight为1,RGB radius都为1,scale为0.001。Sky Texture中Sun Elevation设为0度时,太阳光照射地面上的䓍,有的䓍叶边缘会反光,想消除这种反光应该怎么做?

 

明白。你这个现象其实很典型,而且你给出的参数已经足够判断出主要原因了。

核心原因不是 SSS,而是叶片在太阳光的“掠射角(grazing angle)”下产生了 Fresnel 镜面反射。

你设置:

  • 叶片厚度:0.001 m(1 mm)
  • 图片 UV Mapping
  • SSS:Random Walk
  • SSS Weight:1
  • RGB Radius:1, 1, 1
  • Scale:0.001
  • Sky Texture → Sun Elevation:

当太阳高度角为 时,光线几乎贴着地面照射叶片。叶片边缘相对于光线就形成非常大的入射角,这时候即使叶片材质整体比较粗糙,Fresnel 反射也会在边缘特别明显

最直接的解决办法

如果你的目标是:

叶片边缘完全不要出现这种太阳反光

那么首先尝试:

Principled BSDF → Specular → IOR Level = 0

也就是把镜面反射直接关闭。

在 Blender 4.x 的 Principled BSDF 里:

Specular → IOR Level

设置:

0.000

这样最有效。


但我更推荐你不要直接设 0

因为真实植物叶片并不是完全没有镜面反射。

如果你是在做真实感草地/植物,我建议先这样:

参数建议
Roughness 0.5~0.8
IOR 1.40~1.50
Specular IOR Level 0.1~0.3
SSS Weight 0.5~1.0

例如先试:

Roughness = 0.65
IOR = 1.45
Specular IOR Level = 0.15

这样通常可以把非常刺眼的边缘高光压下去,同时保留一点真实的叶片反光。


你这个场景还有一个特别重要的因素

你特意说:

Sky Texture 中 Sun Elevation = 0°

这实际上是你这个问题的关键。

可以想象一下:

 
                    叶片
                     /
                    /
太阳光 → → → → → →/
___________________/_____ 地面
 

太阳在 时,光线几乎水平。

因此叶片边缘很容易出现:

掠射反射 → Fresnel → 边缘亮线

所以你会发现:

有些草叶边缘反光,有些没有。

这是因为每一片草叶的法线方向不同


你可以做一个非常简单的验证

暂时不要改材质。

把:

Sky Texture → Sun Elevation

从:

改成:

10°

然后:

20°

再观察草叶。

你很可能会发现:

太阳高度升高以后,边缘反光明显减少或者位置发生变化。

这可以直接验证:

问题主要来自太阳光的掠射角,而不是 SSS。


SSS 这里其实没有必要关闭

你现在:

Random Walk + Weight 1 + Scale 0.001

这个思路本身没有明显问题。

你的叶片厚度是:

0.001 m = 1 mm

而你的:

SSS Scale = 0.001

意味着 SSS 的整体尺度也在毫米级。

所以从数量级上看是比较合理的。

不过,如果你的草叶实际上是非常薄的植物贴片,例如:

 
图片
████████████
████████████
████████████
 

实际几何厚度虽然设置成了 1 mm,但真实植物叶片可能远薄于这个数值,那么 SSS 的尺度可以进一步调整。

但我要强调:

SSS 不是你现在这个“边缘反光”的第一嫌疑。


如果你的真正需求是“草叶绝对不能反光”

比如你做的是:

大量草地,太阳在地平线,任何草叶边缘都不要出现白色/亮色反光。

那么我建议直接使用:

方案 A:关闭镜面

Specular → IOR Level = 0

同时:

Roughness = 0.6~0.8

这是最干净的方案。


方案 B:保留一点真实感

推荐:

IOR = 1.45
Roughness = 0.7
Specular IOR Level = 0.1

这样草叶仍然有一定光泽,但不会出现特别明显的“金属丝一样的边缘高光”。


还有一个地方值得你检查

如果你的草叶是用图片 + Alpha做出来的,例如:

Image Texture → Alpha → Principled Alpha

那么叶片轮廓边缘还可能出现一种特殊的亮边:

 
      图片透明区域
     ┌─────────┐
     │  叶片   │
     │ ███████ │
     │█████████│
     └─────────┘
          ↑
       Alpha边缘
 

这时候看到的亮边不一定完全是 Fresnel,还可能与:

  • Alpha 插值
  • 图片透明区域的 RGB
  • Mipmap
  • Alpha Hashed/Blended
  • 纹理边缘颜色污染

有关。

如果你的草叶是“Plane + PNG透明背景”这种制作方式,我建议也检查这一点。


我给你的建议顺序

你现在不要一次改很多东西,按下面顺序测试:

① 先把 Specular IOR Level → 0

如果边缘反光消失:

→ 确认就是镜面/Fresnel反射。

然后:

② 改成 IOR Level 0.1

看看是否能接受。

然后:

③ Roughness 0.6~0.8

最后再调整:

④ Sun Elevation 0° → 5° → 10°

这样你就能很清楚地知道每一个因素对结果的影响。

 

 

 

Blender中,我在Compositing模式下创建了一个Alpha Over节点,一张背景图片节点的Image输出连到其Background输入,Render Layers节点的Image输出连到其Foreground输入,Factor设为0.8;在Shader Editor的World模式下,创建了一个Sky Texture节点连到Background节点。在Rendered模式下背景图片和背景天空都能呈现,但按F12渲染出的图片却只能看到背景天空看不到背景图片,这是为什么?

 

你这个现象其实很容易解释,而且从你的节点连接方式来看,关键不在 Alpha Over 的 Factor,而在于 Render Layers 已经把 World 的天空一起渲染进去了。

也就是说,你现在实际上是在做:

背景图片 → Alpha Over → Render Layers(包含天空)

Render LayersImage 并不是“只有木屋/草地等模型”,它里面已经包含了 World 的 Sky Texture


1. 为什么 Rendered 模式正常,而 F12 不正常?

这是最容易产生误解的地方。

Rendered 视图

Rendered 模式实时显示的是:

场景几何体 + World Sky

所以你能看到天空。

同时,如果你的背景图片是通过其他方式显示在视口里的,例如:

  • Camera Background Images
  • Viewport Background
  • Compositor Preview
  • 其他视口显示方式

它也可能同时显示。

因此你看到:

天空 + 背景图片

并不能证明 F12 的合成节点已经正确工作。


F12

F12 会真正执行:

3D 场景 → Render Layers → Compositor → Composite → 最终图片

你的 Render Layers 输出本身已经是:

 
┌──────────────────────┐
│ Render Layers        │
│                      │
│ 木屋                  │
│ 草地                  │
│ World Sky            │ ← 已经在里面
└──────────────────────┘
 

然后你又把它接到了 Alpha Over 的 Foreground:

 
背景图片 ────────────────┐
                         ↓
                    Alpha Over ──→ Composite
                         ↑
Render Layers ───────────┘
      ↑
  木屋 + 草地 + 天空
 

所以 Sky 已经是 Foreground 的一部分


2. 真正的问题:Sky 是不透明的

这也是最关键的一点。

你的 World:

Sky Texture → Background → World Output

这意味着 World 会给整个渲染画面提供天空。

因此 Render Layers 中天空区域通常是:

Alpha = 1

从 Alpha Over 的角度来看:

 
Render Layers
┌──────────────────────┐
│        SKY           │ Alpha = 1
│                      │
│       🏠             │
│                      │
└──────────────────────┘
 

它并不是:

 
Render Layers
┌──────────────────────┐
│      透明            │ Alpha = 0
│                      │
│       🏠             │
│                      │
└──────────────────────┘
 

所以 Alpha Over 没办法把你的背景图片“穿过天空”显示出来。


3. 如果你的目标是“背景图片 + 木屋 + 天空”,推荐这样做

这里需要先明确你想要的效果。

如果你最终想得到:

背景图片作为最底层,木屋/草地等3D模型在中间,天空作为天空背景

那么不能直接把完整的 Render Layers 放到 Alpha Over 的 Foreground

你需要让 World 的天空从 Render Layers 中分离出来。

最简单的办法是:

第一步

进入:

Render Properties → Film

找到:

Transparent

勾上。

这样:

 
World Sky
    ↓
不再作为 Render Layers 的背景
 

Render Layers 就会变成类似:

 
        Alpha = 0
天空 ────────────────
        
       🏠
      ████
      ████
       ↑
     Alpha = 1
 

这时候就非常适合 Alpha Over。


4. 然后你的 Compositor 可以这样连接

 
Image(背景图片)
        │
        ▼
   Alpha Over
        │
        ▼
   Composite
        ▲
        │
 Render Layers
 

Render Layers 的透明区域会露出你的背景图片。

最终:

 
背景图片
──────────────
      ↓
   木屋/草地
──────────────
      ↓
    最终图
 

这样 F12 就能得到真正的:

背景图片 + 3D模型


5. 但是你现在又有一个需求:Sky Texture

这就需要注意了。

如果你:

Film → Transparent

那么你的 Sky Texture 就不会直接出现在最终背景里。

如果你的目标是:

既想保留 Sky Texture 的天空光照,又想让背景图片作为最终画面的背景

那么这反而是一个非常常见、而且正确的做法:

World 仍然使用 Sky Texture

 
Sky Texture
     ↓
 Background
     ↓
 World Output
 

同时:

Film → Transparent

这样 Sky Texture:

仍然可以给场景提供环境光照

但:

不会直接出现在最终渲染背景里。

最终画面则由 Compositor 的背景图片提供。

这正是很多“真实环境光 + 实拍背景”的常见工作方式。


6. 你的 Factor = 0.8 也可以先不用管

你现在:

Alpha Over → Factor = 0.8

不是主要问题。

等你把:

Render Properties → Film → Transparent

打开之后,再调整 Factor。

例如:

想让背景图片完全作为背景

可以先试:

Factor = 1.0

然后看效果。

正常情况下:

 
背景图片
    ↓
Alpha Over
    ↑
Render Layers(透明天空 + 木屋)
 

Render Layers 中有模型的地方显示模型,透明的地方显示背景图片。


7. 如果你实际上是想“天空 + 背景图片同时存在”

例如你想要这种效果:

 
        Sky Texture
   ─────────────────
       背景图片
   ─────────────────
          木屋
   ─────────────────
          草地
 

那就不是简单的 Alpha Over 了。

因为:

背景图片和 Sky Texture 都属于“背景层”

你需要决定谁在前、谁在后,或者把天空和图片进行遮罩。

例如:

背景图片 → Alpha Over → Sky

或者:

Sky → Alpha Over → 背景图片

具体还要看你想让天空出现在背景图片的什么位置。


我建议你现在先做一个最小测试

按照下面步骤:

① Render Properties

Film

→ 勾选:

Transparent


② Compositing

保持:

 
Image(背景图片)
       ↓
 Alpha Over
       ↓
 Composite
       ↑
Render Layers
 

③ F12

看看结果。

如果这时候出现:

背景图片 + 木屋/草地,但没有 Sky

那么说明问题已经完全确认了。

而且这并不意味着 Sky Texture 没有作用——它仍然可以作为 World 光照参与场景,只是不再直接出现在最终背景中。


最后给你一个非常重要的概念

你可以把 Blender 的这几个东西区分开:

Sky Texture
→ 负责环境/天空

Render Layers
→ 负责把场景渲染出来

Film → Transparent
→ 决定 World 是否进入最终 Render Layers 背景

Alpha Over
→ 负责后期把不同图层合成

Composite
→ 最终输出 F12 图片

你现在的问题本质上就是:

你以为 Render Layers 输出的是“模型”,实际上它输出的是“模型 + World天空”,所以 Alpha Over 没有得到一个透明的前景层。

如果你把 Film → Transparent 打开,基本就能解决你现在这个问题。

 

 

是这样的,问题解决了。谢谢。

 

不客气!😊

这次的关键点就是记住:

World 的 Sky Texture 可以继续负责环境光照,但如果最终想用图片作为渲染背景,就把 Film → Transparent 打开,再通过 Compositor 合成。

以后做这种“HDRI/Sky 提供光照 + 图片作为最终背景”的效果,这套思路也非常好用。

 

 

在Blender中,我用A.N.T.Landscape插件创建了一个Mountain对象,X, Y, Z size分别为2420m, 2420m, 308m,当我按住鼠标中键对其进行旋转的时候稍微动一下就看不到这个对象了,我把scale调整到0.1可以正常旋转,把scale调到0.2可以旋转但边界处会产生锯齿状,锯齿后面的部分也看不到。这种现象是什么导致的?是因为这个对象尺寸太大而我的电脑计算性能不够吗?

 

不是你的电脑“算力不够”导致的。你描述的现象——对象稍微旋转就消失、缩放到 0.2 后出现锯齿,而且锯齿后面的部分也消失——非常像 Blender 的 **视图裁剪(Clipping)+ 深度缓冲精度(Depth Buffer Precision)**问题。

你的 Mountain 尺寸:

  • X:2420 m
  • Y:2420 m
  • Z:308 m

已经属于非常大的场景尺度。但这个尺寸本身并不是 Blender 不能处理,而是会让视口的数值精度问题变得明显。

你这个现象最像两个问题叠加

1. Viewport Clipping 导致对象消失

3D Viewport 右上角:

N → View → 3D View → Clip Start / End

重点看:

  • Clip Start
  • Clip End

如果 Clip End 太小,例如只有几百米,那么你的 2420m 地形在某些视角下就会被裁掉。

建议先把:

Clip End → 10000 m

甚至:

100000 m

然后再用鼠标中键旋转测试。

 

确实是clip end的问题,把数值由默认的1000m改为10000m后就没问题了。谢谢。

 

posted on 2026-09-04 10:30  ZhangZhihuiAAA  阅读(5)  评论(0)    收藏  举报