骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 1531|回复: 4

[求助] [已解决][Shader][战团]求助着色器怎么修改传回的深度信息

[复制链接]

48

主题

714

回帖

519

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
2043
精华
0
互助
48
荣誉
5
贡献
10
魅力
347
注册时间
2022-8-13
鲜花(60) 鸡蛋(0)
发表于 2025-7-25 07:51:42 | 显示全部楼层 |阅读模式
本帖最后由 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);









1

主题

34

回帖

21

积分

随仆

Rank: 1

UID
3284052
第纳尔
474
精华
0
互助
2
荣誉
0
贡献
0
魅力
0
注册时间
2021-11-3

骑砍中文站APP会员勋章

鲜花(11) 鸡蛋(0)
发表于 2025-7-25 11:48:56 | 显示全部楼层
我按照你的这个代码实现了下天空调色,没发现有问题呢?能提供下你的效果不?图片/视频?  树木飘动里顶点颜色你混合下混合环境光和阳光

鲜花鸡蛋

ggfgfgf  在2025-7-25 23:03  送朵鲜花  并说:求大佬指点

48

主题

714

回帖

519

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
2043
精华
0
互助
48
荣誉
5
贡献
10
魅力
347
注册时间
2022-8-13
鲜花(60) 鸡蛋(0)
 楼主| 发表于 2025-7-25 22:45:42 | 显示全部楼层
qmf 发表于 2025-7-25 11:48
我按照你的这个代码实现了下天空调色,没发现有问题呢?能提供下你的效果不?图片/视频?  树木飘动里顶点 ...

树木有飘动的着色器吗,我也改了树木的着色器,我截图给你看看

48

主题

714

回帖

519

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
2043
精华
0
互助
48
荣誉
5
贡献
10
魅力
347
注册时间
2022-8-13
鲜花(60) 鸡蛋(0)
 楼主| 发表于 2025-7-25 22:59:30 | 显示全部楼层
qmf 发表于 2025-7-25 11:48
我按照你的这个代码实现了下天空调色,没发现有问题呢?能提供下你的效果不?图片/视频?  树木飘动里顶点 ...

这是信仰之沙的飘动着色器的效果 mb14.png

这是现在流传的飘动着色器 mb1.png mb2.png
能看出来那树叶的白边吗,没有调色

48

主题

714

回帖

519

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
2043
精华
0
互助
48
荣誉
5
贡献
10
魅力
347
注册时间
2022-8-13
鲜花(60) 鸡蛋(0)
 楼主| 发表于 2025-7-25 23:02:44 | 显示全部楼层
qmf 发表于 2025-7-25 11:48
我按照你的这个代码实现了下天空调色,没发现有问题呢?能提供下你的效果不?图片/视频?  树木飘动里顶点 ...

VS_OUTPUT_FLORA vs_flora(uniform const int PcfMode, float4 vPosition : POSITION, float4 vColor : COLOR0, float2 tc : TEXCOORD0)
{
        INITIALIZE_OUTPUT(VS_OUTPUT_FLORA, Out);

        float4 vPositionAltered = float4(vPosition.xyz,vPosition.z-0.1);
        float4 ShadowedPos = (float4)mul(matWorld,vPositionAltered);
       
       
        float windAmount = sin(time_var*0.1014) + cos(time_var*0.1413);
    windAmount*=windAmount;
    float2 treePos = //float2 (matWorld._m03, matWorld._m13) +
                    vPosition.xy;
    float t2 = time_var + dot( treePos , float2(6.5,4.5)) ;
    float windPhase = sin(t2*3.9)*cos(t2*2.3);
    vPosition.xy += float2(0.018,0.018) // *(vPosition.z+50.0)
                                    *windPhase*(windAmount+0.2)
                   *(ShadowedPos.z*0.1); // distance from ground stored in alpha channes with openbrf easteregg! ;)
        vPosition.z += 0.02 * sin(0.1* vPosition.y + 0.7 * time_var); // NO.1= HEIGHT OF WAVE       NO.2= NUMBER OF WAVES    NO.3= SPEED OF WAVES
       
        Out.Pos = mul(matWorldViewProj, vPosition);
        float4 vWorldPos = (float4)mul(matWorld,vPosition);


        Out.Tex0 = tc;
        //   Out.Color = vColor * vMaterialColor;
        Out.Color = vColor * (vAmbientColor + vSunColor * 0.06f); //add some sun color to simulate sun passing through leaves.
        Out.Color.a *= vMaterialColor.a;

        //   Out.Color = vColor * vMaterialColor * (vAmbientColor + vSunColor * 0.15f);
        //shadow mapping variables
        Out.SunLight = (vSunColor * 0.34f)* vMaterialColor * vColor;


                float4 ShadowPos = mul(matSunViewProj, vWorldPos);
                Out.ShadowTexCoord = ShadowPos;
                Out.ShadowTexCoord.z /= ShadowPos.w;
                Out.ShadowTexCoord.w = 1.0f;
                Out.ShadowTexelPos = Out.ShadowTexCoord * fShadowMapSize;
               
        //shadow mapping variables end
       
        //apply fog
        float3 P = mul(matWorldView, vPosition); //position in view space
        float d = length(P);
        Out.Fog = get_fog_amount_new(d, vWorldPos.z);

        return Out;
}
这是着色器的vs,好像顶点信息也改了,我问ai,它说顶点信息是局部的,但我感觉不是这个原因

您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-9-22 05:08 , Processed in 0.106687 second(s), 22 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表