- 好友
- 6
- 在线时间
- 0 小时
- 最后登录
- 2025-9-21
骑士
 
- UID
- 3398051
- 第纳尔
- 2043
- 精华
- 0
- 互助
- 48
- 荣誉
- 5
- 贡献
- 10
- 魅力
- 347
- 注册时间
- 2022-8-13
 鲜花( 60)  鸡蛋( 0)
|
本帖最后由 ggfgfgf 于 2025-7-31 18:43 编辑
我修改了postfx,添加了天空遮罩用来对天空调色。为了区分天空和地面,我用深度信息区分
像这样,用这个采样
sampler postFX_sampler5 : register(s5);
... ... ... ...
if(use_hdr > 0) {
float skyMask = smoothstep(0.75f, 0.97f, tex2D(postFX_sampler5, texCoord).r);
float skyExposure = 0.55f;
float groundExposure = 0.9f;
float exposure = lerp(groundExposure, skyExposure, skyMask);
color.rgb = pow(color.rgb, 1.0f / 1.05f);
float3 bloom = tex2D(postFX_sampler1, texCoord).rgb * 15.0f * (1.0f - skyMask * 0.4f);
color.rgb = pow(color.rgb, 1.0f / exposure);
color.rgb = pow(color.rgb, 1.0f / 1.05f);
bloom = pow(bloom, 1.5f) * 15.0f * (1.0f - skyMask * 0.4f);
if(!use_auto_exp) {
color.rgb += bloom;
}
}
但是我发现树木的飘动着色器有问题,他的深度信息没有随着树叶飘动更新,仍然是静止的,导致调色有问题,有什么办法可以让这个随树叶飘动更新呢,
我发现信仰之沙模组的着色器可以,不知道怎么实现的
有懂的大佬指点一下吗,万分感谢。
我甚至抓帧了骑砍,但是着色器太多找不到是哪个
可能原因是现在流传的飘动着色器代码是改的uv偏移
信仰之沙可能是改的顶点信息,但我不太会修改,求指点
解决方案
搞了半天我算是明白了,深度信息不会跟着vs里偏移变,这是不可能的
我解决办法float skyMask = smoothstep(0.75f, 0.97f, tex2D(postFX_sampler1, texCoord).r);postFX_sampler5改成postFX_sampler1,虽然我搞不太明白这两个采样,但我试出来了
没有任何解决方法,某些人真是无敌了
深度信息写入在VS之前,改什么都没用
ps s1是最终画面的深度?不懂,明明s5是深度信息。。。
为了给有树叶飘动的mod用这个postfx调色
可以这样写
if(use_hdr > 0) {
float depth_skyMask = smoothstep(0.75f, 0.97f, tex2D(postFX_sampler5, texCoord).r);
float brightMask = step(0.6f, dot(tex2D(postFX_sampler0, texCoord).rgb, float3(0.299,0.587,0.114)));
float SkyMask = (brightMask == 1 && depth_skyMask == 0) ? 1.0 : ((brightMask == 0 && depth_skyMask == 1) ? 0.0 : depth_skyMask);
// float SkyMask = saturate(depth_skyMask + brightMask * (1 - step(depth_skyMask, 0.5)));
float skyExposure = 0.55f;
float groundExposure = 0.9f;
float exposure = lerp(groundExposure, skyExposure, SkyMask);
color.rgb = pow(color.rgb, 1.0f / 1.05f);
float bloomAttenuate = 1.0f - SkyMask * 0.4f;
float3 bloom = tex2D(postFX_sampler1, texCoord).rgb * 15.0f * bloomAttenuate;
color.rgb = pow(color.rgb, 1.0f / exposure);
color.rgb = pow(color.rgb, 1.0f / 1.05f);
bloom = pow(bloom, 1.5f) * 15.0f * bloomAttenuate;
if(!use_auto_exp) {
color.rgb += bloom;
}
}
float lum = dot(tex2D(postFX_sampler0, texCoord).rgb, float3(0.299, 0.587, 0.114));
float brightMask = smoothstep(0.45f, 0.9f, lum);
float depth_skyMask = smoothstep(0.75f, 0.97f, tex2D(postFX_sampler5, texCoord).r);
float2 resolution = float2(1920.0, 1080.0);
float2 offset = float2(1.0, 1.0) / resolution;
float lum_x = dot(tex2D(postFX_sampler0, texCoord + float2(offset.x, 0)).rgb, float3(0.299, 0.587, 0.114));
float lum_y = dot(tex2D(postFX_sampler0, texCoord + float2(0, offset.y)).rgb, float3(0.299, 0.587, 0.114));
float gradient_x = abs(lum_x - lum);
float gradient_y = abs(lum_y - lum);
float edgeMask = step(0.1, max(gradient_x, gradient_y));
float edgeSideMask = (lum < lum_x) ? 1.0 : 0.0;
edgeSideMask = max(edgeSideMask, (lum < lum_y) ? 1.0 : 0.0);
float expandedEdgeMask = edgeMask * edgeSideMask;
float lum_x_neg = dot(tex2D(postFX_sampler0, texCoord - float2(offset.x, 0)).rgb, float3(0.299, 0.587, 0.114));
float lum_y_neg = dot(tex2D(postFX_sampler0, texCoord - float2(0, offset.y)).rgb, float3(0.299, 0.587, 0.114));
float edgeMask_x_pos = step(0.1, abs(lum_x - lum));
float edgeMask_x_neg = step(0.1, abs(lum_x_neg - lum));
float edgeMask_y_pos = step(0.1, abs(lum_y - lum));
float edgeMask_y_neg = step(0.1, abs(lum_y_neg - lum));
expandedEdgeMask = max(expandedEdgeMask, edgeMask_x_pos * (lum_x > 0.5));
expandedEdgeMask = max(expandedEdgeMask, edgeMask_x_neg * (lum_x_neg > 0.5));
expandedEdgeMask = max(expandedEdgeMask, edgeMask_y_pos * (lum_y > 0.5));
expandedEdgeMask = max(expandedEdgeMask, edgeMask_y_neg * (lum_y_neg > 0.5));
float finalSkyMask = (expandedEdgeMask > 0.5) ? 0.0 : brightMask;
finalSkyMask = smoothstep(0.45f, 0.9f, finalSkyMask);
float lum = dot(tex2D(postFX_sampler0, texCoord).rgb, float3(0.299, 0.587, 0.114));
float brightMask = smoothstep(0.45f, 0.9f, lum);
float depth_skyMask = smoothstep(0.75f, 0.97f, tex2D(postFX_sampler5, texCoord).r);
float2 resolution = float2(1920.0, 1080.0);
float2 offset = float2(1.0, 1.0) / resolution;
float lum_x = dot(tex2D(postFX_sampler0, texCoord + float2(offset.x, 0)).rgb, float3(0.299, 0.587, 0.114));
float lum_y = dot(tex2D(postFX_sampler0, texCoord + float2(0, offset.y)).rgb, float3(0.299, 0.587, 0.114));
float gradient_x = abs(lum_x - lum);
float gradient_y = abs(lum_y - lum);
float edgeMask = step(0.1, max(gradient_x, gradient_y));
float edgeSideMask = (lum < lum_x) ? 1.0 : 0.0;
edgeSideMask = max(edgeSideMask, (lum < lum_y) ? 1.0 : 0.0);
float expandedEdgeMask = edgeMask * edgeSideMask;
float distanceThreshold = 5.0;
for (float i = 1.0; i <= distanceThreshold; i++) {
expandedEdgeMask = max(expandedEdgeMask, tex2D(postFX_sampler0, texCoord + float2(i * offset.x, 0)).r);
expandedEdgeMask = max(expandedEdgeMask, tex2D(postFX_sampler0, texCoord - float2(i * offset.x, 0)).r);
expandedEdgeMask = max(expandedEdgeMask, tex2D(postFX_sampler0, texCoord + float2(0, i * offset.y)).r);
expandedEdgeMask = max(expandedEdgeMask, tex2D(postFX_sampler0, texCoord - float2(0, i * offset.y)).r);
}
float finalSkyMask = lerp(brightMask, depth_skyMask, expandedEdgeMask);
|
|