- 私信
|
发表时间 : 2013-11-14 23:02:38
|
浏览 : 4890 评论 : 1
源码分类
原创性: |
原创 |
源码类型: |
OpenGL |
支撑软件: |
opengl |
目录截图: |
- |
文件大小: |
- |
代码开放性: |
完全开源 |
通过下面几步实现:
1.设定一个附加裁减平面
2. 并把摄像机位置设置到当然视点对称的位置, 渲染平面以上部分到一个纹理.
3. 将反射平面的顶点传入VS, 并乘以投影矩阵.得到平面投影点的坐标.
4. 将上述插值传入PS, 并同时除以W, 并(projCoord+1.0f)*0.5f.
5. 再查询渲染得到的纹理, 并加入点噪声, 有水波纹的效果.
VS/PS 如下:
//LakeVS.cg
uniform float4x4 modelViewProj : state.matrix.mvp;
void main(float4 Iposition : POSITION,
float2 Itexcoord : TEXCOORD0,
out float4 oPosition : POSITION,
out float3 objectPos : TEXCOORD0,
out float4 viewCoord : TEXCOORD1,
out float2 Otexcoord : TEXCOORD2)
{
oPosition = mul(modelViewProj, Iposition);
objectPos = Iposition.xyz;
viewCoord = oPosition;
Otexcoord = Itexcoord;
}
//LakePS.cg
uniform sampler2D refMap;
uniform sampler2D fraMap;
uniform sampler2D dudvMap;
uniform float timeline;
uniform float3 eyePosition;
void main(float4 Iposition : TEXCOORD0,
float4 viewCoord : TEXCOORD1,
float2 Itexcoord : TEXCOORD2,
out float4 color : COLOR)
{
float4 bump = tex2D(dudvMap, Itexcoord);
bump = (bump-0.5)/2;
float cosangle = dot(normalize(eyePosition-Iposition.xyz), float3(0.0f, 1.0f, 0.0f));
float4 fogColor = float4(0.230, 0.266, 0.722, 1.0);
float dis = distance(Iposition.xyz, eyePosition);
float factor = clamp(dis/300, 0.0f, 1.0f);
float4 projCoord = viewCoord / viewCoord.z;
projCoord = (projCoord + 1.0)*0.5;
projCoord += bump*0.8*(1-factor);
projCoord = clamp(projCoord, 0.001, 0.999);
projCoord.x = -projCoord.x;
float4 projCoord1 = projCoord;
projCoord1.x = -projCoord1.x;
float4 basecolor = tex2D(refMap, projCoord.xy)*0.95f;
float4 basecolor1 = tex2D(fraMap, projCoord1.xy)*0.3f;
float4 finalcolor = lerp(basecolor, basecolor1, saturate(cosangle/0.779f));
color = finalcolor;
}
演示和代码下载:
|
|