Lighting you up in Battlefield 3

link:http://publications.dice.se/attachments/GDC11_LightingYouUpInBattlefield3.pptx

Dice带来的LightingYouUpInBattleField3

是一个artist写的。。。

没有给细节,陈列一些技术点和技术点的结果,还是很赞的。


 ThePast

 首先介绍了dice之前项目的一些技术点:

BattleFieldBadCompany:(2008)

 Frostbite1;

 Forward-rendering

Nostreaming

Hemisphericalsky/ground light+ directional sun light

3point lighting

100%Dynamic shadows, cascaded shadowmaps

3slices, 1024x1024

Single(!)point light per object

NoGlobal Illumination

NoScreen Space Ambient Occlusion

Staticskyocclusion maps for buildings & bigger objects

Staticsky occlusion volumes for indoor environments that dynamic objects sampled asingle value from

 

Mirror's Edge(2009)

UnrealEngine3

 Forward-rendering

Streaming

Staticworld / static lighting

IlluminateLabs Beast Offline Generation

GlobalIllumination (bounce, emissive, translucent)

Storedas directional lightmaps (Radiosity Normal Maps)

Dynamicobjects(i.e. Faith)

Pre-calculatedlight probes form basis for relighting dynamic objects

Combinemost relevant probes to form SH basis for lighting

Extractmajor light axis as “directional light source”

Useconventional shadow mapping from extracted directional

 

Dice非常渴望能够有进一步的lighting能力,

  • dynamic场景下的GI
  • 室外带有反射surface的大型场景
  • 更多的lighting model
  • 透明散射
  • 高速的work pipeline
  • particle lighting
  • advanced bloom/tone mapping

solutions

GI solution types:

  • light map:large, static, receive and bound light
  • light probe:small, 有机统一的, only receive light, dynamic geometry

 黄色的是静态的lightmap驱动的,蓝色的动态的lightprobe驱动的。

 然后介绍了一个标准的irradiance volume的用法,也就是lightprobe+lightmap(呃,enlighten哪里去了?)


 最后看下color grading和filmic tonemapping的效果对比,这俩技术还是相当有用的。

 tonemapping off:

 tonemapping on:

 color grading off:

 color grading on:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题。以下是一个植物大战僵尸的Java程序示例: ``` import java.util.ArrayList; import java.util.Scanner; public class PlantVsZombie { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 创建一个植物数组,用于存放所有的植物 Plant[] plants = { new Peashooter(), new Sunflower(), new CherryBomb() }; // 创建一个僵尸数组,用于存放所有的僵尸 Zombie[] zombies = { new OrdinaryZombie(), new ConeheadZombie(), new BucketheadZombie() }; // 创建一个存放植物的阵营 Camp plantCamp = new Camp("植物阵营", plants); // 创建一个存放僵尸的阵营 Camp zombieCamp = new Camp("僵尸阵营", zombies); // 创建一个战场 Battlefield battlefield = new Battlefield(plantCamp, zombieCamp); // 游戏循环 while (true) { System.out.println("请输入你要进行的操作(1. 放置植物,2. 发射豌豆,3. 显示状态):"); int choice = scanner.nextInt(); switch (choice) { case 1: // 放置植物 System.out.println("请选择要放置的植物:"); for (int i = 0; i < plants.length; i++) { System.out.println((i + 1) + ". " + plants[i].getName() + "(花费:" + plants[i].getCost() + ")"); } int plantIndex = scanner.nextInt() - 1; Plant selectedPlant = plants[plantIndex]; System.out.println("请输入要放置的列数(1-" + battlefield.getColumnCount() + "):"); int column = scanner.nextInt() - 1; battlefield.place(selectedPlant, column); break; case 2: // 发射豌豆 battlefield.shoot(); break; case 3: // 显示状态 battlefield.display(); break; default: System.out.println("输入无效,请重新输入!"); break; } // 检查是否有一方胜利 if (plantCamp.isAllDead()) { System.out.println("僵尸获胜!"); break; } else if (zombieCamp.isAllDead()) { System.out.println("植物获胜!"); break; } } } } // 植物类 abstract class Plant { private String name; // 名称 private int cost; // 花费 public Plant(String name, int cost) { this.name = name; this.cost = cost; } public String getName() { return name; } public int getCost() { return cost; } // 发射子弹 public abstract Bullet shoot(); } // 豌豆射手 class Peashooter extends Plant { public Peashooter() { super("豌豆射手", 100); } @Override public Bullet shoot() {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值