查看: 612|回复: 0

[有事请教] 将Reshade里的CRT等特效移植到RGD内,这个想法可行吗?

[复制链接]
梦石
0
星屑
1679
在线时间
163 小时
注册时间
2022-1-14
回帖
27
发表于 2026-3-10 12:54:25 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
如题,本人前几天翻到了reshade的使用教程:https://rpg.blue/thread-485148-1-1.html
然后开了个新项目尝试了一下,确实效果很赞,但是滤镜的开关需要打开reshade的界面才能进行,而且每次启动游戏的头三秒顶上都有reshde那个消息框……
(正常来说游戏的滤镜开关功能都是写在本体里的,而“让reshade不显示消息框+读取游戏内设置来改变滤镜开关”怎么看都更复杂且绕…于是就在想能不能把这个滤镜移植)

查了一下特效数据的.fx文件似乎也是用HLSL语言写的?想知道reshade对画面的处理可以用RGD里的shader功能再现吗……
(姑且用ai折腾了一下但不管怎么弄都报错invaild shader,现在很怀疑是不是本来就做不到)

顺带一提我想再现的是一个CRT扫描线的滤镜
[fold=ai给的调整了多次依然无法运行的代码,感觉最大的问题还是我不懂][pre lang="ruby"]Graphics.add_shader("
#define PIXEL_SIZE float2(384.0, 224.0)
#define TEXTURE_SIZE float2(384.0, 224.0)
#define VIEW_SIZE_HD 720.0
static const float3 INTENCITY = float3(1.2, 0.9, 0.9);

uniform float2 ScreenSize : register(c0)

PS_OUTPUT PS_CRT(float4 color : COLOR0, float2 texcoord : TEXCOORD0)
{
    float2 screenSize = ScreenSize;
    float2 viewPos = floor((TEXTURE_SIZE / PIXEL_SIZE) * texcoord * screenSize) + 0.5;
    float intencityPos = frac((viewPos.y * 3.0 + viewPos.x) * 0.166667);

    float4 scanlineIntencity;
    if (intencityPos < 0.333)
        scanlineIntencity.rgb = INTENCITY.xyz;
    else if (intencityPos < 0.666)
        scanlineIntencity.rgb = INTENCITY.zxy;
    else
        scanlineIntencity.rgb = INTENCITY.yzx;

    float2 pixelPos = texcoord * TEXTURE_SIZE;
    float2 roundedPixelPos = floor(pixelPos);

    scanlineIntencity.a = clamp(abs(sin(pixelPos.y * 3.14159)) + 0.25, 0.5, 1.0);
    pixelPos = frac(pixelPos) - 0.5;
   
    float2 invTexPos = -texcoord * TEXTURE_SIZE + (roundedPixelPos + 0.5);
   
    float2 newTexPos;
    newTexPos.x = clamp(-abs(invTexPos.x * 0.5) + 1.5, 0.8, 1.25);
    newTexPos.y = clamp(-abs(invTexPos.y * 2.0) + 1.25, 0.5, 1.0);

    float2 colorMod;
    colorMod.x = newTexPos.x * newTexPos.y;
    colorMod.y = newTexPos.x * ((scanlineIntencity.a + newTexPos.y) * 0.5);

    scanlineIntencity.a *= newTexPos.x;

    float2 texPos = ((pixelPos + -clamp(pixelPos, -0.25, 0.25)) * 2.0 + roundedPixelPos + 0.5) / TEXTURE_SIZE;
    float4 texColor = tex2D(spriteSampler, texPos);
   
    float3 blendedColor;
    blendedColor.r = scanlineIntencity.a * texColor.r;
    blendedColor.gb = colorMod.xy * texColor.gb;
   
    float4 outColor;
    outColor.rgb = screenSize.y >= VIEW_SIZE_HD ? (scanlineIntencity.rgb * blendedColor.rgb) : blendedColor.rgb;
    outColor.a = texColor.a;
   
    outColor.rgb *= outColor.a;
   
    return GetOutput(outColor);
}
","
  pass CRT
  {
    PixelShader = compile ps_3_0 PS_CRT();
  }
")[/pre][/fold]
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部