纹理玻璃折射和透明度
Textured glass refraction and transparency
我正在尝试创建一个着色器,它允许精灵稍微放大(或只是稍微偏移)其背景并同时显示其纹理,就像一块彩绘玻璃一样。
我找到了一个几乎可以做到这一点的着色器,但是它也会根据上方 layer/sprite 的亮度改变背景:
sampler2D img;
sampler2D bkd : register(s1);
float4 ps_main(in float2 In: TEXCOORD0) : COLOR0 {
float4 L = tex2D(img,In);
float4 B = tex2D(bkd,In);
return (L<0.5)?min(B,(2.0*L)):max(B,(2.0*(L-0.5)));
}
technique tech_main { pass P0 { PixelShader = compile ps_2_0 ps_main(); } }
我尝试修改参数,但结果很糟糕。
要组合纹理,可以在 B 和 L 之间进行插补,或者在 B 和 L*B 之间进行插补。您可以将 lerp 因子公开为统一控制。
对于放大,您想在纹理查找中缩放背景纹理的 UV 坐标。只是直接缩放它是行不通的,您需要获取屏幕缓冲区样本的 UV 坐标与放大镜中心之间的距离,对其进行缩放,然后将其添加到原始 UV 坐标中。
这是 shadertoy 上的一个简短的放大镜着色器,向您展示了我的意思(在 GLSL 中):
我正在尝试创建一个着色器,它允许精灵稍微放大(或只是稍微偏移)其背景并同时显示其纹理,就像一块彩绘玻璃一样。 我找到了一个几乎可以做到这一点的着色器,但是它也会根据上方 layer/sprite 的亮度改变背景:
sampler2D img;
sampler2D bkd : register(s1);
float4 ps_main(in float2 In: TEXCOORD0) : COLOR0 {
float4 L = tex2D(img,In);
float4 B = tex2D(bkd,In);
return (L<0.5)?min(B,(2.0*L)):max(B,(2.0*(L-0.5)));
}
technique tech_main { pass P0 { PixelShader = compile ps_2_0 ps_main(); } }
我尝试修改参数,但结果很糟糕。
要组合纹理,可以在 B 和 L 之间进行插补,或者在 B 和 L*B 之间进行插补。您可以将 lerp 因子公开为统一控制。
对于放大,您想在纹理查找中缩放背景纹理的 UV 坐标。只是直接缩放它是行不通的,您需要获取屏幕缓冲区样本的 UV 坐标与放大镜中心之间的距离,对其进行缩放,然后将其添加到原始 UV 坐标中。
这是 shadertoy 上的一个简短的放大镜着色器,向您展示了我的意思(在 GLSL 中):