|
如题:
我没有修改array老师的那个着色器代码,但是应用的时候发现了一些问题。如图所示:
,应用array老师给的那个着色器代码后,当相机从湖面的正上方向下看时(视线垂直湖面),湖面看着是很好很正常的,可是如果是站在湖边看的时候,却出现了如图中的样子,湖面有一道道的白色的条纹,应该是光照计算的问题,我也修改过,没有什么反应,不知道哪里出了问题!着色器代码:
顶点着色器:
const float Eta = 0.0;
const float FresnelPower = 1.0;
const float F = ((1.0-Eta) * (1.0-Eta))/((1.0+Eta) * (1.0+Eta));
varying float FresRatio;
varying vec3 lightDir;
varying vec3 eyeDir;
varying vec3 reflectDir;
varying vec3 refractDir;
attribute vec3 Tangent;
uniform vec3 LightPos;
uniform float time;
void main(void)
{
gl_Position = ftransform();
vec4 v = vec4(gl_Vertex);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
vec3 tang = normalize(gl_NormalMatrix * Tangent);
vec3 binorm = cross(norm,tang);
eyeDir = vec3(gl_ModelViewMatrix * v);
//for refraction
vec4 neyeDir = gl_ModelViewMatrix * v;
vec3 refeyeDir = neyeDir.xyz / neyeDir.w;
refeyeDir = normalize(refeyeDir);
reflectDir = reflect(eyeDir,norm);
refractDir = refract(eyeDir,norm,Eta);
refractDir = vec3(gl_TextureMatrix[0] * vec4(refractDir,1.0));
FresRatio = F + (1.0-F) * pow((1.0-dot(-refeyeDir,norm)),FresnelPower);
vec3 tmp;
tmp.x = dot(LightPos,tang);
tmp.y = dot(LightPos,binorm);
tmp.z = dot(LightPos,norm);
lightDir = normalize(tmp);
tmp.x = dot(eyeDir,tang);
tmp.y = dot(eyeDir,binorm);
tmp.z = dot(eyeDir,norm);
eyeDir = normalize(tmp);
gl_TexCoord[0] = gl_MultiTexCoord0;
vec4 texco = gl_MultiTexCoord0;
texco.s = texco.s + time*0.01;
texco.t = texco.t + time*0.01;
texco.r = texco.r + time*0.03;
gl_TexCoord[1] = texco;
texco = gl_MultiTexCoord0;
texco.s = texco.s + -time*0.01;
texco.t = texco.t + -time*0.01;
texco.r = texco.r + time*0.03;
gl_TexCoord[2] = texco;
}
片元着色器:
varying vec3 lightDir;
varying vec3 eyeDir;
varying vec3 reflectDir;
varying vec3 refractDir;
varying float FresRatio;
uniform sampler2D normalMap;
uniform samplerCube cubeMap;
void main (void)
{
float distSqr = dot(lightDir, lightDir);
float att = clamp(1.0 - 0.0 * sqrt(distSqr), 0.0, 1.0);
vec3 lVec = lightDir * inversesqrt(distSqr);
vec3 vVec = normalize(eyeDir);
vec4 base = vec4(0.17,0.67,0.93,1.0); //base water color
//vec4 base = vec4(0.57,0.87,0.93,1.0); //base water color
vec3 bump = normalize( texture2D(normalMap, gl_TexCoord[1].str).xyz * 2.0 - 1.0);
vec3 secbump = normalize( texture2D(normalMap, gl_TexCoord[2].str).xyz * 2.0 - 1.0);
vec3 modbump = mix(secbump,bump,0.5);
//vec3 modbump = secbump;
//vec3 modbump = bump;
//vec3 reflection = vec3(textureCube(cubeMap,reflect(-lightDir,modbump)));
vec3 reflection = vec3(textureCube(cubeMap,reflect(eyeDir,modbump)));
vec3 refraction = vec3(textureCube(cubeMap,refract(eyeDir,modbump,0.66)));
vec3 cubemap = mix(reflection,refraction,FresRatio);
//vec3 cubemap = mix(reflection,refraction,0.0);
vec4 vAmbient = gl_LightSource[0].ambient;
float diffuse = max( dot(-lVec, modbump), 0.0 );
vec4 vDiffuse = gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * diffuse;
float specular = 0.0*pow(clamp(dot(reflect(lVec, modbump), vVec), 0.0, 1.0), 0.5 );
vec4 vSpecular = gl_LightSource[0].specular * gl_FrontMaterial.specular * specular;
vec4 newfrag = mix(vec4(cubemap,1.0) , (( vAmbient*base + vDiffuse*base * vSpecular*base ) * att),0.1);
//vec4 newfrag = mix(vec4(cubemap,1.0) , (( vAmbient*base + vDiffuse*base + vSpecular*base ) * att),0.1);
//vec4 newfrag = mix(vec4(cubemap,1.0) , vDiffuse*base ,0.1);
gl_FragColor = newfrag; //mix(vec4(cubemap,1.0),base,0.5) ; //newfrag;
//gl_FragColor = mix(vec4(cubemap,1.0),base,0.1) ;
}
|
|