[gpu pro]screen space directional occlusion

SSDO作为SSAO的升级版,在CryEngine3中得到应用。它不仅提供了更精确的遮挡信息,还能根据未被遮挡的部分模拟间接光照,从而改善场景的整体照明效果。

ssao的升级版,ssdo。

cryengine3里面现在也在用,对于效果来说,在ssdo和ssao之间恐怕玩家难以分辨了。

顾名思义,ssdo在ssao基础上加了一些方向性的东西,ssao是描述了这一点被occluded掉多少东西,但是没有任何方向信息,所以暴露在一个左边是红光,右边是蓝光的情况下,不能根据occlusion的信息来occlude掉正确的lighting。

ssdo记录了这些没有occlude掉的部分的信息,其实也就是半球上面的那些angle所在的patch是没有occluded。

上图比较好的说明了。

有了这些信息,可以产生更准确的occlusion信息,以及更正确的ambient lighting的shading信息,比如使用基于cubemap的各个方向不同的ambient lighting。

在这个基础上,可以进一步采样周围的lighting信息,进而模拟一些indirect lighting,不过在GI发展的今天,这点indirect lighting实在难以匹敌正规军啊。

最后一个是防止出现uniform的pattern的情况,就是按照统一的patter,无论是ao还是shadow都会出现在边缘那里格子状的patter,处理方法是:

本文采用的是geometry sensitive filter,来做一些blur(横一次,竖一次)。

还有就是在sssss,以及shadow里面用到的poisson filter也可以。

“Bi-Directional”(双向)是一个广泛应用于电子、通信、软件和控制系统中的术语,表示**数据或信号可以在两个方向上传输或交互**。与单向(Uni-Directional)系统不同,双向系统支持**发送和接收**功能。 在不同的技术领域中,“Bi-Directional”有不同的具体实现方式。下面以最常见的几个应用场景为例进行详细说明: --- ## ✅ 1. 双向串行通信(如 UART、I2C) ### 示例:ESP32 使用 UART 实现 Bi-Directional 通信 ```cpp void setup() { // 初始化串口,波特率 115200,支持收发 Serial.begin(115200); while (!Serial) delay(10); // 等待串口连接(用于某些开发板) } void loop() { // 检查是否有来自 PC/其他设备的数据 if (Serial.available() > 0) { String received = Serial.readString(); Serial.print("Received: "); Serial.println(received); // 回复消息 —— 双向的关键:既能收也能发 Serial.println("Message acknowledged."); } // 主动发送数据(例如传感器读数) float temp = temperatureRead(); // 假设这是 ESP32 内部温度 Serial.print("Current Temp: "); Serial.print(temp); Serial.println(" °C"); delay(2000); } ``` ### 🔍 解释: - `Serial.begin()` 启用 TX(发送)和 RX(接收)引脚。 - `Serial.available()` 和 `Serial.read()` 处理**输入**。 - `Serial.print()` 发送**输出**。 - 这就是典型的 **全双工(Full-Duplex)Bi-Directional 通信**。 --- ## ✅ 2. 双向 GPIO(可配置为输入或输出) ESP32 的大多数 GPIO 引脚是双向的,可以通过 `pinMode()` 动态切换方向。 ### 示例:动态切换 GPIO 方向实现双向数据传输 ```cpp #define BIDIR_PIN 25 void setup() { Serial.begin(115200); // 初始设为输出 pinMode(BIDIR_PIN, OUTPUT); digitalWrite(BIDIR_PIN, LOW); } void loop() { // 场景1:作为输出发送数据 pinMode(BIDIR_PIN, OUTPUT); digitalWrite(BIDIR_PIN, HIGH); Serial.println("Pin set as OUTPUT, sending HIGH"); delay(1000); // 场景2:切换为输入接收外部信号 pinMode(BIDIR_PIN, INPUT); int val = digitalRead(BIDIR_PIN); Serial.print("Pin set as INPUT, read value: "); Serial.println(val); delay(1000); } ``` ### 🔍 解释: - 同一个引脚在不同时刻充当**输出驱动器**或**输入检测器**。 - 应用于某些协议(如 1-Wire)、共享总线或多主通信。 --- ## ✅ 3. 双向电源系统(如 Bi-Directional DC-DC Converter) 在电力电子中,Bi-Directional 指能量可以**正向流动(A → B)或反向流动(B → A)**。 常见应用: - 电动汽车充电桩(V2G:Vehicle-to-Grid) - 电池管理系统(BMS)充放电控制 ### 控制逻辑示例(简化版) ```cpp // 使用 H 桥或同步整流控制器实现能量流向控制 enum PowerDirection { CHARGE, DISCHARGE }; void setPowerFlow(PowerDirection dir) { if (dir == CHARGE) { // 控制 MOSFET 阵列使电流流入电池 ledcWrite(CHANNEL_1, 80); // PWM 占空比 ledcWrite(CHANNEL_2, 0); Serial.println("Battery Charging..."); } else { // 反向导通,电池对外供电 ledcWrite(CHANNEL_1, 0); ledcWrite(CHANNEL_2, 80); Serial.println("Battery Discharging..."); } } ``` > ⚠️ 实际硬件需使用支持双向功率流动的拓扑结构(如双有源桥 DAB、同步 Buck-Boost)。 --- ## ✅ 4. 双向数据绑定(前端开发中的 Bi-Directional Binding) 在 Web 开发中(如 Vue.js),双向绑定指**视图更新模型,模型也更新视图**。 ### Vue.js 示例: ```html <input v-model="message" placeholder="edit me"> <p>Message is: {{ message }}</p> ``` ```js data() { return { message: '' } } ``` 用户输入时,`message` 自动更新;程序修改 `message` 时,输入框内容也会变化 —— 典型的双向绑定。 底层原理是结合了 `:value` 和 `@input` 事件。 --- ## ✅ 5. 双向通信协议(MQTT、WebSocket) 这些协议允许客户端与服务器互相发送消息。 ### WebSocket 双向通信(NodeMCU/ESP32 + ArduinoWebSockets) ```cpp #include <WebSocketsClient.h> WebSocketsClient webSocket; void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_TEXT: Serial.printf("Received from server: %s\n", payload); // 双向响应!收到即回复 webSocket.sendTXT("Echo: " + String((char*)payload)); break; } } void setup() { webSocket.begin("192.168.1.100", 81, "/"); webSocket.onEvent(webSocketEvent); } void loop() { webSocket.loop(); // 主动发送心跳 static unsigned long lastTime = 0; if (millis() - lastTime > 5000) { webSocket.sendTXT("Heartbeat from ESP32"); lastTime = millis(); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值