mirror of
https://github.com/Blinue/Magpie.git
synced 2026-06-24 02:04:10 +00:00
* feat: 上边框外可以调整大小 * fix: 修正 Win11 中无边框窗口绘制 * fix: LoadLibrary 换成 GetModuleHandle * feat: 缩放开始时记录 OS 版本 * feat: 适配不同的窗口 * feat: 支持 Win11 的无边框窗口 * fix: 窗口隐藏后停止缩放 * feat: 程序启动时记录 OS 版本 * feat: 缩放无边框窗口支持调整窗口尺寸 * feat: 对于无框架窗口 Win11 中禁用边框和圆角 * feat: Win11 中无边框窗口可以在边框上调整窗口尺寸 * fix: 修复窗口化缩放时最大化窗口会反复尝试缩放的问题 * feat: 无框架窗口在 Win11 中和无标题栏一样处理并禁用边框 * feat: 缩放时以源窗口框架空心点作为目标矩形中心 * feat: 交换链窗口随缩放窗口调整尺寸 * feat: 全屏化缩放前自动调整源窗口位置 Graphics Capture 不再支持屏幕捕获 * feat: 裁剪失败显示错误消息 * feat: 调整缩放窗口尺寸时缩放区域长宽比保持不变 * feat: 缩放窗口位置或尺寸有变化时自动调整源窗口位置 * fix: 修复无法调整尺寸的 bug * fix: 修复窗口化缩放时缩放窗口有时在假边框下面 * feat: 平滑地调整窗口尺寸 * perf: 检查交换链尺寸是否发生变化 * feat: 初步实现调整渲染分辨率 存在显存泄露 * fix: 修复显存泄露 * fix: 修复 CursorDrawer 保存旧 back buffer 的问题 * fix: 修复特定情况下 imgui 中崩溃 * fix: 尝试修复调整尺寸时的闪烁 * feat: 避免调整缩放窗口大小时渲染暂停 * perf: 避免调整大小时重复渲染 * fix: 修复调整大小时有时 FPS 无法及时更新的问题 * chore: 更新依赖 * fix: 使用 DwmFlush 等待屏幕刷新 * fix: ImGui 的更新导致字体缓存不再兼容 * fix: 修复移动缩放窗口后渲染出错 * feat: 鼠标在源窗口的标题栏上时可以拖动缩放窗口 * feat: 删除禁用窗口大小调整选项 * chore: 修改措辞 * fix: 优化调整尺寸的流畅度 * chore: 修复编译 * refactor: 添加抽象对象 Presenter,以在 SwapChain 和 DComp 两种呈现方式间切换 * fix: 修复字体缓存保存问题和优化 Win32Helper::WriteFile * feat: 实现 DirectComposition 呈现 * refactor: 两个呈现器共用的代码移动到基类 * feat: 降低延迟和添加注释 * feat: 完成 DirectComposition 支持 * feat: 禁用 DirectFlip 时使用 DirectComposition 呈现,无需其他操作 * fix: 修复叠加层渲染 * fix: 修复叠加层鼠标输入 * feat: 3D 游戏模式不再支持叠加层 * perf: 3D 游戏模式下降低渲染光标的频率 * chore: 修复编译警告 * feat: 不再单独显示 FPS 将集成在工具栏里 * feat: 实现工具栏原型 * feat: 优化工具栏样式 * feat: 不再支持隐藏光标 * fix: 修复 Win11 加载字体 * refactor: 叠加层多处重构 * feat: 叠加层支持追加和删除 Bicubic * perf: 稍微优化构建字体性能 * refactor: 简化 OverlayDrawer * chore: 更新依赖 * feat: 为工具栏添加更多按钮 * feat: 缩放时支持显示消息 * feat: 实现自动隐藏工具栏 * fix: 修复鼠标在窗口外移动不会更新工具栏透明度的问题 * fix: 优化 ImGui 样式 * feat: ImGui 窗口可关闭 * fix: 修复鼠标被前台窗口捕获时工具栏突然消失 * feat: 工具栏上可以拖拽缩放窗口 * fix: 鼠标被工具栏中的按钮捕获时不要隐藏工具栏 * feat: 调试模式不再影响鼠标逻辑 * fix: 优化工具栏行为 * fix: 修复调整缩放窗口大小时鼠标被叠加层捕获的问题 * fix: 修复拖拽缩放窗口时鼠标跳跃 * feat: 优化工具栏以符合 Fitts 法则 * refactor: Magpie.Core 的接口始终使用 UTF-8 * chore: 更新依赖 * fix: 提高移动光标的可靠性 * feat: 添加新的设置项用于保存叠加层窗口位置 * feat: 初步实现叠加层窗口适配大小调整 * feat: 优化叠加层窗口贴靠规则 * feat: 简化贴靠规则 * feat: 再次优化贴靠规则 * fix: 修复捕获光标后有时光标形状不更新的问题 * feat: 工具栏和其他窗口状态独立 * feat: 调整主页 UI * feat: 调整 UI * feat: 新 UI 支持多语言 * feat: 实现工具栏状态切换 * feat: 切换工具栏时显示消息 * fix: 叠加层调试信息在定义 DEBUG_OVERLAY 时显示 * perf: 非 WGC 使用 D3D11_CREATE_DEVICE_SINGLETHREADED * feat: 添加实验性 composition swapchain 呈现器 * feat: 增加错误处理和日志 * feat: 窗口化缩放时通常情况使用交换链,调整大小时使用 DirectComposition Win11 24H2 中交换链即使在窗口化时也能触发 independent flip * fix: 修复 Win10 缺失“缩放模式”图标的问题 * fix: 修复关闭工具栏按钮功能 * chore: 更新依赖 * refactor: SwapChainPresenter 重命名为 AdaptivePresenter * fix: 禁用 DirectFlip 时始终使用 DirectComposition 呈现 以及添加错误处理 * fix: 修复调试模式下缩放窗口非客户区更新 * feat: 工具栏支持本地化 * feat: Win11 中使用 DCompositionWaitForCompositorClock 等待 DWM 以及更新 CompSwapchainPresenter * chore: 修正文件名 * fix: 修复被调试器暂停后消息弹窗无法关闭的问题 * perf: 优化 composition swapchain 的延迟 * feat: 添加 3D 游戏模式的解释和错误弹窗 * feat: 初步实现截图 * perf: 在后台线程编码图片 * chore: 实验或调试用宏集中在 CommonDefines.h 中 * feat: 支持保存任意效果的输出 * feat: 支持指定截图保存目录 * refactor: 全局包含 <filesystem> * refactor: 更多使用 filesystem 支持长路径,而 Win32 API 在这方面进展缓慢 * refactor: 更多使用 filesystem * refactor: 更多使用 filesystem * feat: 实现截图命名机制 * fix: 优化并发支持 * fix: 修复大批量并发截图可能导致死锁的问题 * feat: 本地化截图消息 * feat: 截图按钮支持右键保存指定效果的输出 * feat: 本地化 * feat: 统一 Win10 和 Win11 中“缩放时调整光标速度”选项的图标 * chore: 避免全局包含 shellapi.h 和 Shlwapi.h * fix: 默认快捷键的 Win 改为 Alt 以避免和系统快捷键冲突 (#1150) * fix: 不在任何屏幕上的窗口不检查自动缩放 (#1151) * feat: 只允许最后一个通道写入 OUTPUT 为了方便截图 * feat: 效果的中间结果保存为 dds * chore: 删除加载 DDS 代码中无用部分 不再支持读取缓冲区、1D/3D 纹理等,节省了约 3KB * docs: 明确 DDS 图像只支持 2D 纹理,但允许使用 mipmap * feat: 实现导出任意通道的任意输出 * perf: 优化导出中间结果的性能 * feat: 调整 UI 文字 * feat: 优化初始缩放窗口尺寸 * fix: 修复点击标题栏无法激活缩放窗口的问题 * fix: 修复源窗口被遮挡就无法通过标题栏拖拽缩放窗口 * fix: 修复有时工具栏无法拖拽的问题 * chore: 增加日志 * feat: 支持改变窗口模式缩放初始缩放倍数 * feat: 本地化 * feat: 第一帧完成再显示缩放窗口 * fix: 减少缩放开始时的光标闪烁 * fix: 提前隐藏光标 * feat: 推迟显示黄色边框和禁用窗口圆角 * feat: 上边框视为标题栏 * chore: 更新依赖 * feat: 窗口化缩放初始位置确保标题栏在屏幕内 * fix: 缩放窗口移动后调整光标位置 * feat: 初步支持触控 * fix: 稍微提高 _ReliableSetCursorPos 等待时长 * feat: 调整缩放窗口大小或移动缩放窗口暂时禁用触控变换 * feat: 优化检查标题栏逻辑 支持 Win11 文件管理器、Windows Terminal 等 * fix: 修复调整大小时纹理尺寸计算错误 * perf: 使用 UpdateSubresource1 更新缓冲区 * fix: 窗口模式缩放时将缩放比例为 1 的 Fit 视为 Fill * feat: 不再支持 Magpie.ToolWindow 属性 现在源窗口不在前台也能继续缩放,而 3D 游戏模式下这个功能没有意义 * feat: 源窗口离开和回到前台时广播事件 * chore: 注释和文档 * docs: 更新文档 * feat: WM_WINDOWPOSCHANGING 中确保等比例缩放 * feat: 全屏模式缩放时允许被 SetWindowPos 移动和改变尺寸 * feat: 自定义初始缩放倍数改为 1.25 和 UI 优化 * feat: 将缩放后的光标限制在屏幕内 * chore: 代码优化 * perf: 只有一个显卡时避免计算显卡选项 * fix: 优化鼠标行为 * fix: 优化叠加层存在弹窗时鼠标交互 * feat: 为一些选项添加说明 增大自动计算的初始缩放倍数 * refactor: 重构调整大小消息的响应 * feat: 删除初始缩放倍数的说明 * feat: 自动缩放可以选择全屏或窗口模式 * feat: 缩放窗口可跟随源窗口移动 由于命中测试可能非常耗时,转到后台执行 * fix: 使通过上边框拖动缩放窗口更加可靠 * fix: 修复鼠标从标题栏移到上边框的过程有一瞬间的闪烁 * feat: 使得源窗口调整尺寸的区域可以调整缩放窗口尺寸 * fix: 优化全屏缩放的鼠标行为 * fix: 优化鼠标行为 * feat: 源窗口移动时临时还原光标移动速度和禁用 DirectFlip * fix: 修复内存损坏错误 * fix: 更可靠地检查缩放是否结束 * feat: 拖拽源窗口时保持光标位置稳定 * feat: 拖拽缩放窗口时保持光标位置稳定 * fix: 优化拖拽 * fix: 修复禁用 DirectFlip 导致的崩溃 * feat: 适配自己实现拖拽逻辑的窗口 * chore: 更新依赖 * fix: 防止拖动源窗口时光标超出屏幕 * fix: 修复舍入误差导致光标可能移到屏幕外 * fix: 优化和被 DPI 虚拟化的窗口的兼容性 * feat: 删除源窗口移动时临时禁用 DirectFlip * fix: 光标不在缩放窗口上时禁止和工具栏交互 * fix: 移动源窗口结束后确保缩放窗口标题栏可见 * fix: 避免调整窗口使标题栏可见导致光标位置跳跃 * fix: 优化拖动源窗口时将光标限制在屏幕内 * perf: 异步移动源窗口,使缩放的移动和调整大小更加平滑 * fix: 拖动缩放窗口时检测源窗口大小变化 * fix: 正确处理缩放窗口的 DPI 变化 * fix: 拖动源窗口时广播 WM_MAGPIE_SCALINGCHANGED * feat: 声明首选显示器选项仅适用于全屏模式缩放 * fix: 优化触控调整缩放窗口大小的体验 * fix: 销毁缩放窗口前取消置顶,添加日志 * chore: 修复编译 * refactor: 检查源窗口逻辑集中在 SrcTracker * fix: 修复源窗口挂起时缩放线程在 SetWindowPos 中卡死的问题 * fix: 修复调整大小中途源窗口挂起导致卡死的问题 * fix: CursorManager 析构时等待异步命中测试完成 * fix: 优化命中测试,不受源窗口卡死影响 * fix: 修复叠加层窗口圆角 * fix: 取消修复源窗口挂起时缩放线程在 SetWindowPos 中卡死的问题 它导致拖动性能下降 * fix: 修复有时切换前台窗口后 Z 顺序混乱 * fix: 删除不再需要的 SetWindowPos * feat: 暂时删除格鲁吉亚语和匈牙利语 完成度太低 * fix: 修复全屏缩放对 DPI 变化的响应 * fix: 修复错误裁剪滚动条和 Win11 24H2 中 Graphics Capture 错误裁剪最大化窗口 * feat: 优化触控拖动源窗口的体验 * refactor: 重构 TouchHelper 和项目文件 TouchHelper 支持日志 Magpie.Core 部分文件移动到 Shared * chore: TouchHelper 不再向主程序发送消息 * refactor: 简化 TouchHelper 逻辑 * fix: 日志文件路径使用宽字符 spdlog 默认使用 ANSI 编码,但支持使用宽字符文件名 * fix: 不再使用 SetForegroundWindow 的 trick 有时会导致奇怪的行为 * feat: Updater 支持日志 * feat: 添加工具栏不支持触控输入的警告 * fix: 修复 TouchHelper 日志错误
195 lines
5.5 KiB
Markdown
195 lines
5.5 KiB
Markdown
MagpieFX 基于 DirectX 11 计算着色器
|
||
|
||
``` hlsl
|
||
//!MAGPIE EFFECT
|
||
//!VERSION 4
|
||
// 使用 USE 指令声明使用的功能,支持以下值的组合:
|
||
// MulAdd:使 MulAdd 函数可用
|
||
//!USE MulAdd
|
||
// 使用 CAPABILITY 指令声明效果所支持的技术,但是否使用这些技术取决于用户配置。支持以下值的组合:
|
||
// FP16:声明对 FP16 的支持
|
||
//!CAPABILITY FP16
|
||
// 使用 SORT_NAME 指定排序时使用的名字,否则按照文件名排序
|
||
//!SORT_NAME test1
|
||
|
||
// 下面一行可以减少 IDE 中的错误。它是可选的
|
||
#include "StubDefs.hlsl"
|
||
|
||
// 参数定义
|
||
//!PARAMETER
|
||
// LABEL 为用户界面上显示的参数名
|
||
//!LABEL Sharpness
|
||
// DEFAULT、MIN、MAX 和 STEP 都必须存在
|
||
//!DEFAULT 0.1
|
||
//!MIN 0.01
|
||
//!MAX 5
|
||
//!STEP 0.01
|
||
float sharpness;
|
||
|
||
|
||
// 纹理定义
|
||
// INPUT、OUTPUT 是特殊关键字
|
||
// INPUT 不能作为通道的输出,OUTPUT 不能作为通道的输入
|
||
// 只有最后一个通道可以输出到 OUTPUT,最后一个通道也只能输出到 OUTPUT
|
||
// 定义 INPUT 和 OUTPUT 是可选的,但为了保持语义的完整性,建议显式定义
|
||
// OUTPUT 的尺寸即为此效果的输出尺寸,不指定则表示支持任意尺寸的输出
|
||
|
||
//!TEXTURE
|
||
Texture2D INPUT;
|
||
|
||
//!TEXTURE
|
||
//!WIDTH INPUT_WIDTH * 2
|
||
//!HEIGHT INPUT_HEIGHT * 2
|
||
Texture2D OUTPUT;
|
||
|
||
// 计算纹理尺寸时可以使用一些预定义常量
|
||
// INPUT_WIDTH
|
||
// INPUT_HEIGHT
|
||
// OUTPUT_WIDTH
|
||
// OUTPUT_HEIGHT
|
||
|
||
// 支持的纹理格式:
|
||
// R32G32B32A32_FLOAT
|
||
// R16G16B16A16_FLOAT
|
||
// R16G16B16A16_UNORM
|
||
// R16G16B16A16_SNORM
|
||
// R32G32_FLOAT
|
||
// R10G10B10A2_UNORM
|
||
// R11G11B10_FLOAT
|
||
// R8G8B8A8_UNORM
|
||
// R8G8B8A8_SNORM
|
||
// R16G16_FLOAT
|
||
// R16G16_UNORM
|
||
// R16G16_SNORM
|
||
// R32_FLOAT
|
||
// R8G8_UNORM
|
||
// R8G8_SNORM
|
||
// R16_FLOAT
|
||
// R16_UNORM
|
||
// R16_SNORM
|
||
// R8_UNORM
|
||
// R8_SNORM
|
||
// 根据纹理格式的不同,在通道中该纹理的定义也是不同的。如当纹理格式为 R8G8_UNORM,
|
||
// 作为通道的输入时定义是 Texture2D<float2>,作为输出时定义是 RWTexture2D<unorm float2>。
|
||
// 当使用 FP16 时,符合条件的纹理将被定义为 min16float 类型,例如 R8G8_UNORM 作为输入时定义变为
|
||
// Texture2D<min16float2>,作为输出时定义变为 RWTexture2D<unorm min16float2>。
|
||
|
||
//!TEXTURE
|
||
//!WIDTH INPUT_WIDTH + 100
|
||
//!HEIGHT INPUT_HEIGHT + 100
|
||
//!FORMAT R8G8B8A8_UNORM
|
||
Texture2D tex1;
|
||
|
||
// 采样器定义
|
||
// FILTER 必需,ADDRESS 可选
|
||
// ADDRESS 默认值为 CLAMP
|
||
|
||
//!SAMPLER
|
||
//!FILTER LINEAR
|
||
//!ADDRESS CLAMP
|
||
SamplerState sam1;
|
||
|
||
//!SAMPLER
|
||
//!FILTER POINT
|
||
//!ADDRESS WRAP
|
||
SamplerState sam2;
|
||
|
||
// 所有通道通用的部分
|
||
|
||
//!COMMON
|
||
#define PI 3.14159265359
|
||
|
||
// 通道定义
|
||
|
||
//!PASS 1
|
||
// 描述将出现在游戏内覆盖中
|
||
//!DESC First Pass
|
||
// 可选 PS 风格,依然用 CS 实现
|
||
// STYLE 默认为 CS
|
||
//!STYLE PS
|
||
//!IN INPUT
|
||
// 支持多渲染目标,最多 8 个
|
||
//!OUT tex1
|
||
|
||
float func1() {
|
||
}
|
||
|
||
// Pass[n] 为通道入口点
|
||
MF4 Pass1(float2 pos) {
|
||
return MF4(1, 1, 1, 1);
|
||
}
|
||
|
||
//!PASS 2
|
||
//!IN INPUT, tex1
|
||
// 最后一个通道的输出只能是 OUTPUT
|
||
//!OUT OUTPUT
|
||
// BLOCK_SIZE 指定一次 dispatch 处理多大的区域
|
||
// 可以只有一维,即同时指定长和高
|
||
//!BLOCK_SIZE 16, 16
|
||
// NUM_THREADS 指定一次 dispatch 有多少并行线程
|
||
// 可以少于三维,缺少的维数默认为 1
|
||
//!NUM_THREADS 64, 1, 1
|
||
|
||
void Pass2(uint2 blockStart, uint3 threadId) {
|
||
// 写入 OUPUT
|
||
OUTPUT[blockStart] = MF4(1,1,1,1);
|
||
}
|
||
```
|
||
|
||
### 预定义函数
|
||
|
||
**uint2 GetInputSize()**:获取输入纹理尺寸。
|
||
|
||
**float2 GetInputPt()**:获取输入纹理每个像素的尺寸。
|
||
|
||
**uint2 GetOutputSize()**:获取输出纹理尺寸。
|
||
|
||
**float2 GetOutputPt()**:获取输出纹理每个像素的尺寸。
|
||
|
||
**float2 GetScale()**:获取输出纹理相对于输入纹理的缩放。
|
||
|
||
**uint2 Rmp8x8(uint id)**:将 0~63 的值以 swizzle 顺序映射到 8x8 的正方形内的坐标,用以提高纹理缓存的命中率。
|
||
|
||
**MF{n} MulAdd(MF{m} x, MF{m}x{n} y, MF{n} a)**:等效于 `mul(x, y) + a`,但性能更高,在基于机器学习的效果中非常有用。必须声明 "USE MulAdd" 才能使用此函数。原理参见 [#1049](https://github.com/Blinue/Magpie/pull/1049)。
|
||
|
||
|
||
### 预定义宏
|
||
|
||
**MP_BLOCK_WIDTH、MP_BLOCK_HEIGHT**:当前通道处理的块的大小(由 "BLOCK_SIZE" 指定)
|
||
|
||
**MP_NUM_THREADS_X、MP_NUM_THREADS_Y、MP_NUM_THREADS_Z**:当前通道每个线程组的线程数(由 "NUM_THREADS" 指定)
|
||
|
||
**MP_PS_STYLE**:当前通道是否是像素着色器样式(由 "STYLE" 指定)
|
||
|
||
**MP_INLINE_PARAMS**:当前通道的参数是否为静态常量(由用户指定)
|
||
|
||
**MP_DEBUG**:当前是否为调试模式(调试模式下编译的着色器不进行优化且含有调试信息)
|
||
|
||
**MP_FP16**:当前是否使用半精度浮点数
|
||
|
||
**MF、MF1、MF2、...、MF4x4**:遵守 fp16 参数的浮点数类型。当未指定 fp16,它们为 float... 的别名,否则为 min16float... 的别名
|
||
|
||
|
||
### 多渲染目标(MRT)
|
||
|
||
PS 风格下 OUT 指令可指定多个输出(由于 DirectX 的限制最多 8 个):
|
||
``` hlsl
|
||
//!OUT tex1, tex2
|
||
```
|
||
|
||
这时通道入口有不同的签名:
|
||
``` hlsl
|
||
void Pass1(float2 pos, out MF4 target1, out MF4 target2);
|
||
```
|
||
|
||
### 从文件加载纹理
|
||
|
||
``` hlsl
|
||
//!TEXTURE
|
||
//!SOURCE test.bmp
|
||
Texture2D testTex;
|
||
```
|
||
|
||
TEXTURE 指令支持从文件加载纹理,支持的格式有 BMP,PNG,JPG 等常见图像格式以及 DDS 文件。加载 DDS 文件时只支持 2D 纹理,但允许使用 mipmap。可选使用 FORMAT,指定后可以帮助解析器生成正确的定义,不指定始终假设是 float4 类型。
|
||
|
||
从文件加载的纹理不能作为通道的输出。
|