如何将法线贴图混合到天空盒的反射中?

时间:2015-10-02 17:58:30

标签: opengl glsl shader

我正在努力创造一个水的例子,我知道第一个需要的是能够做出反思,这已经完成了。

我陷入下一步,即将反射与法线贴图结合起来。

我尝试的是像往常一样加载立方体纹理,计算反射然后加载法线贴图并在最后一步中将它们组合,但水消失了。

这是我的代码:

顶点着色器

attribute vec3 a_normBT;
attribute vec3 a_normL;
attribute vec3  a_normTan;
attribute vec3 a_posL;
attribute vec2 a_uv;
uniform mat4 u_W;
uniform mat4 u_WVP;
varying vec3 v_normW;
varying vec3 v_normBT;
varying vec3 v_normTan;
varying vec3 v_posW;
varying vec2 v_uv;
void main()
{
    gl_Position  = u_WVP * vec4(a_posL, 1.0);
    v_uv = a_uv;
    v_normW = normalize((u_W*vec4(a_normL, 0.0)).xyz);
    v_normBT = normalize((u_W*vec4(a_normBT,0.0)).xyz);
    v_normTan = normalize((u_W*vec4(a_normTan,0.0)).xyz);
    v_posW = (u_W*vec4(a_posL, 1.0)).xyz;
}

片段着色器

precision mediump float;
uniform samplerCube u_s_texture;
uniform sampler2D u_s_normalMap;
uniform vec3 u_cpos;// the camera position is already in world space
varying vec3 v_normW;
varying vec3 v_normBT;
varying vec3 v_normTan;
varying vec3 v_posW;
varying vec2 v_uv;
void main()
{
    vec4 tempText =  texture2D(u_s_normalMap, v_uv);
    vec3 Normal = normalize(v_normW);
    vec3 totalDifusse = vec3(0.0,0.0,0.0);
    vec3 totalSpecular = vec3(0.0,0.0,0.0);
    vec3 toEye = u_cpos- v_posW;
    vec3 reflectDir = reflect(normalize(-toEye), normalize(v_normW));  // reflect() in non linear
    gl_FragColor = tempText*textureCube(u_s_texture,reflectDir);
}

我期望发生的是我所拥有的四边形应具有静态涟漪。 谢谢。

1 个答案:

答案 0 :(得分:0)

不知道系统的坐标系设置,因此制服具有确切含义,而且懒得分析/调试未知代码以帮助您。

相反看看:Normal mapping gone horribly wrong

  • 与您的任务非常相似
  • 主要思想是在[GCS]全局(世界坐标)系统
  • 中计算片段法向量
  • 并将其用作环境天空盒纹理所在的3D立方体贴图纹理坐标...
  • 这在物理上是不正确的(除非表面是荧光的)但是作为起点很容易看起来很好
  • 完成后,在[GCS]
  • 中计算从片段到相机的矢量
  • 然后计算其围绕计算正常
  • 的反射
  • 并将其用作3D立方体贴图纹理坐标

还要检查glGetShaderInfoLog