GLSL法线贴图照明暗区和光朝奇方向

时间:2014-09-23 03:27:02

标签: opengl glsl fragment-shader lighting vertex-shader

我似乎无法弄清楚为什么我的片段和顶点着色器不起作用。我想我的观点/视角错误,或者我的法线贴图有负值(因为黑色显示亮起)。无论哪种方式,我已经在这里待了好几天,而且我似乎无法发挥作用。

我复制到我项目中的照明系统来自这里: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson6

具有法线贴图的唯一纹理是建筑物,它似乎正确点亮,但仅从左下角开始。我也会想,其他一切都将是完全黑暗的。 我也认为我的灯应该是圆形的,而不是方向性的。

https://www.dropbox.com/s/pd8und7xbqz0kfh/Screenshot%202014-09-22%2023.17.22.png?dl=0

编辑: 一些研究表明,如果我将我的法线贴图设置为.5,如果它们在片段着色器中小于.5,那么至少那些没有法线贴图的图像不会亮起向上指示部分问题可能与负法线贴图值有关。

另一个编辑: 我在顶点着色器中使用了ftransform()。即使我做了上面的修复以使一切不正常映射变暗,我也无法弄清楚为什么我的光源成角度。除非我将NdotL设置为max(dot(N,L),1.0);否则使用值消息不会使我的光源变为圆形。这使我相信我的坐标系统没有被正确翻译,或者我的法线贴图中有奇怪/负面的值导致问题。我不太了解这个数学,不知道出了什么问题。

还有一件事,因为我只为一个建筑创建了一个法线,我传入-1作为其他图像的纹理ID'法线贴图。这可能是个问题吗?

这是我的顶点着色器:

attribute vec4 Color;

varying vec2 vTexCoord;
varying vec4 vColor;

void main() {

    vColor = Color;
    vTexCoord = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

和我的片段着色器:

struct Light{
    //float intensity;
    vec4 color;
    vec3 position;
    //vec3 direction;
};

//attributes from vertex shader
varying vec4 vColor;
varying vec2 vTexCoord;

//our texture samplers
uniform sampler2D u_texture;   //diffuse map
uniform sampler2D u_normals;   //normal map


//values used for shading algorithm...
uniform vec2 Resolution;      //resolution of screen
uniform Light Lights[50];        //light position, normalized
uniform vec4 AmbientColor;    //ambient RGBA -- alpha is intensity 
uniform vec3 Falloff;         //attenuation coefficients

uniform int LightCount;

void main() {
    vec3 Sum = vec3(0.0);


    //RGBA of our diffuse color
    vec4 DiffuseColor = texture2D(u_texture, vTexCoord);

    //set our defuse color to whatever color the image actually is.
    //vec4 vColor = DiffuseColor;

    //RGB of our normal map
    vec3 NormalMap = texture2D(u_normals, vTexCoord).rgb;

    //pre-multiply ambient color with intensity
    vec3 Ambient = AmbientColor.rgb * AmbientColor.a;

    int i = 0;
    while(i < LightCount){
        vec3 ThisLightPosition = Lights[i].position;
        vec4 ThisLightColor = Lights[i].color;

        //The delta position of light
        vec3 LightDir = vec3(ThisLightPosition.xy - (gl_FragCoord.xy / Resolution.xy), ThisLightPosition.z);

        //Correct for aspect ratio
        LightDir.x *= Resolution.x / Resolution.y;

        //Determine distance (used for attenuation) BEFORE we normalize our LightDir
        float D = length(LightDir);

        //normalize our vectors
        vec3 N = normalize(NormalMap * 2.0 - 1.0);
        vec3 L = normalize(LightDir);
        float NdotL = max(dot(N, L), 0.0);
        //Pre-multiply light color with intensity
        //Then perform "N dot L" to determine our diffuse term
        vec3 Diffuse = (ThisLightColor.rgb * ThisLightColor.a) * NdotL;

        //calculate attenuation
        float Attenuation = 1.0 / ( Falloff.x + (Falloff.y*D) + (Falloff.z*D*D));

        //the calculation which brings it all together
        vec3 Intensity = Ambient + Diffuse * Attenuation;
        vec3 FinalColor = DiffuseColor.rgb * Intensity;
        Sum += FinalColor;
        i++;
    }

    gl_FragColor = vColor * vec4(Sum, DiffuseColor.a);
}

1 个答案:

答案 0 :(得分:0)

问题是我的法线贴图。我使用基础rgb(0,0,0)作为空白法线,而实际上空白法线贴图应为(128,128,255)(I.E。(。5,.5,1))。