返回
让场景不再黑暗:使用 1x1 白色像素点亮 Filament
Android
2024-03-12 20:16:18
Filament:使用 1x1 白色像素照亮你的场景
问题:寻找简单、纯色的间接光
在使用 Filament 创建逼真的 3D 场景时,您可能希望添加间接光,以模拟来自环境的漫反射照明。然而,设置传统间接光源可能既复杂又耗时。本指南将引导您使用一个 1x1 的白色像素作为间接光,实现简单而有效的纯色照明。
解决方案:创建一个白色纹理立方体贴图
我们的方法是使用 Filament API 构建一个 1x1 的白色纹理立方体贴图。此纹理立方体贴图将充当我们的间接光源,因为它本质上是均匀分布的白色光。
- 创建 1x1 白色像素缓冲区:
val oneWhitePixel = ByteBuffer.wrap(byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte()))
- 创建纹理像素缓冲区符:
val whitePixelBuffer = Texture.PixelBufferDescriptor(oneWhitePixel, Texture.Format.RGB, Texture.Type.UBYTE)
- 构建纹理立方体贴图:
val indirectLightCube = Texture.Builder()
.width(1)
.height(1)
.sampler(Texture.Sampler.SAMPLER_CUBEMAP)
.format(Texture.InternalFormat.RGB8)
.build(engine)
.also { texture -> texture.setImage(engine, 0, whitePixelBuffer) }
打造间接光
有了我们的白色纹理立方体贴图后,我们可以创建一个间接光对象。此对象将负责向我们的场景散布漫反射照明。
val indirectLight = IndirectLight.Builder()
.reflections(indirectLightCube)
.build(engine)
应用到材料
最后,我们可以将间接光应用于我们的材料,以控制照明效果。
val material = Material.Builder()
.lighting(Material.LightingBuilder()
.indirectLight(indirectLight)
.build())
.build(engine)
结论
通过使用 1x1 白色像素作为间接光,您可以在 Filament 中轻松创建简单的纯色天空盒和纯色间接光。此方法消除了设置传统间接光源的复杂性,使您能够专注于创建逼真的和引人入胜的 3D 场景。
常见问题解答
- 为什么使用 1x1 像素? 1x1 像素可确保间接光均匀分布,不会引入任何噪点或伪影。
- 间接光会影响镜面反射照明吗? 不,间接光仅影响漫反射照明。
- 如何调整间接光的颜色和强度? 您可以通过调整白色纹理立方体贴图中的像素值来调整间接光的颜色和强度。
- 这个方法适用于所有 Filament 后端吗? 是的,此方法适用于 Filament 的所有后端,包括 OpenGL、Metal 和 Vulkan。
- 是否有任何需要注意的限制? 请记住,间接光是近似值,并且在某些情况下可能无法完全模拟真实的间接光。