游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3255|回复: 8

请问如何实现折射效果

[复制链接]

10

主题

26

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2010-5-11 23:36:00 | 显示全部楼层 |阅读模式
大家帮帮我吧[em4]

像热气流,不均匀的玻璃等,实现比较像的折射效果,
我看过ogre的compositor的玻璃后处理效果,但那个效果不尽如人意,ogre是这样实现的
sampler RT : register(s0);
sampler NormalMap : register(s1);
float4 main_ps(float2 iTexCoord : TEXCOORD0) : COLOR
{
  float4 normal = 2 * (tex2D(NormalMap, iTexCoord * 2.5) - 0.5);
  return tex2D(RT, iTexCoord + normal.xy * 0.05);
}
大意就是将后处理图的纹理坐标加上一张法图的偏移量
如果用photoshop的玻璃滤镜实现,效果比较好,请问有没有人实现过类似photoshop玻璃滤镜的算法,麻烦指教下我吧。
可以看看ogre和photoshop实现的效果




[em4] [em4] [em4] [em4]

227

主题

1794

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2010-5-12 10:54:00 | 显示全部楼层

Re:请问如何实现折射效果

实时渲染的效果你也别太较真了……
ps滤镜没办法实现实时渲染吧?

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2010-5-12 17:35:00 | 显示全部楼层

Re:请问如何实现折射效果

我看到过一个水面反射的 不过你可以借鉴一下 大概就是根据点的法线 然后用noise贴图来修改法线 然后根据改变后的法线计算折线

10

主题

26

帖子

38

积分

注册会员

Rank: 2

积分
38
 楼主| 发表于 2010-5-12 19:17:00 | 显示全部楼层

Re:请问如何实现折射效果

先谢过楼上两位
我想ps滤镜是可以实现渲染的,像高斯模糊,运动模糊这样的滤镜,在游戏中也常有出现。ogre上实现的跟ps实现不像是算法不同而已,如果知道ps的算法,我想应该可以在游戏中实现的。
谢谢monkeyboi兄,如果只是后处理图的话,我想不需要顶点法线也可以吧,对noise贴图修改法线比较感兴趣,有源码吗?

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2010-5-12 20:16:00 | 显示全部楼层

Re:请问如何实现折射效果

float4 PSmain(float3 pos: TEXCOORD0, float3 normal: TEXCOORD1, float3 vVec: TEXCOORD2) : COLOR {
   pos.x += waveSpeed * time_0_X;
   pos.y += noiseSpeed * time_0_X;
       
   float4 noisy = tex3D(Noise, pos);

   // Signed noise
   float3 bump = 2 * noisy - 1;
   bump.xz *= 0.15;
   // Make sure the normal always points upwards
   bump.y = 0.8 * abs(bump.y) + 0.2;
   // Offset the surface normal with the bump
   bump = normalize(normal + bump);

   // Find the reflection vector
   float3 reflVec = reflect(vVec, bump);
   float4 refl = texCUBE(Skybox, reflVec);

   float lrp = 1 - dot(-normalize(vVec), bump);

   // Interpolate between the water color and reflection
   float temp = 0.0;
   temp = sin(time_0_X);
   temp = abs(temp);
   refl.x += temp*0.5;
   return lerp(waterColor, refl, saturate(fadeBias + pow(lrp, fadeExp)));
}

10

主题

26

帖子

38

积分

注册会员

Rank: 2

积分
38
 楼主| 发表于 2010-5-12 21:54:00 | 显示全部楼层

Re:请问如何实现折射效果

再次谢过monkeyboi兄,看到reflect这个反射函数,就查了下refract折射函数,现试试如果用法线图表示顶点法线,会得出怎样的结果

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-5-12 22:31:00 | 显示全部楼层

Re:请问如何实现折射效果

差不多就是NormalMap 的uv偏移扰动water折射效果,方法和楼主的类似

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2010-5-12 22:52:00 | 显示全部楼层

Re:请问如何实现折射效果

恩 差不多 不用客气

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-5-12 23:26:00 | 显示全部楼层

Re:请问如何实现折射效果

不同的noise/normal map出来的效果完全不一样,关键在选的noise map是否合适
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 16:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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