OpenGl 4.x ADS phong着色,平面未完全着色而不是牛眼状着色

时间:2015-06-01 18:09:26

标签: c++ opengl fragment-shader opengl-4

这是运行程序的图片:

enter image description here

我无法弄清楚为什么我的飞机会出现牛眼染色,我很确定我对着色器做错了什么但我不完全确定是什么&#39这是问题所在。

这是我的片段着色器。

#version 430 core

in vec4 color;
in vec4 position;
uniform float fTime;
uniform vec3 lookat;
out vec4 fColor;

vec4 calculateMyNormal(vec4 mposition)
{
   float dfdx = 2*(mposition.x) * 4 * cos(radians((mposition.x*mposition.x)+          (mposition.z*mposition.z)+fTime));
   float dfdz = 2*(mposition.z) * 4 * cos(radians((mposition.x*mposition.x)+(mposition.z*mposition.z)+fTime));

    vec3 a = vec3(1, dfdx, 0);
    vec3 b = vec3(0, dfdz, 1);

    vec3 normal = normalize(cross(a, b));

    return vec4(normal, 1.0);
}

vec4 ADSLightModel(vec4 myNormal, vec4 myPosition)
{
    const vec4 myLightPosition     = vec4(1.0, 0.5, 0.0, 1.0 );

    const vec4 myLightAmbient      = vec4( 0.2, 0.2, 0.2, 1.0 );
    const vec4 myLightDiffuse      = vec4( 1.0 , 1.0 , 1.0, 1.0 ); 
    const vec4 myLightSpecular     = vec4( 1.0 , 1.0 , 1.0 , 1.0);

    const vec4 myMaterialAmbient   = vec4( 1.0 , 0.5, 0.0, 1.0 ); 
    const vec4 myMaterialDiffuse   = vec4( 0.5 , 0.1, 0.5, 1.0 ); 
    const vec4 myMaterialSpecular  = vec4( 0.6, 0.6, 0.6, 1.0 );

    const float myMaterialShininess = 80;

    vec4 norm = normalize( myNormal );
    vec4 lightv = normalize( myLightPosition - myPosition );
    vec4 viewv  = normalize( vec4(lookat, 1.0) - myPosition );
    vec4 refl   = reflect( vec4(lookat, 1.0) - lightv, norm ); 
    vec4 ambient = myMaterialAmbient*myLightAmbient;

    vec4 diffuse = max(0.0, dot(lightv, norm)) * myMaterialDiffuse * myLightDiffuse;

    vec4 specular = vec4( 0.0, 0.0, 0.0, 1.0 );
    if( dot(lightv, viewv) > 0)
    {
        specular = pow(max(0.0, dot(viewv,refl)), myMaterialShininess)*myMaterialSpecular* myLightSpecular; 
    }

    return clamp(ambient + diffuse + specular, 0.0, 1.0);
}

void main()
{
    vec4 norml = calculateMyNormal(position);
    fColor = ADSLightModel(norml, position);
}

飞机移动,我在顶点着色器中移动,我不知道这可能是问题。

#version 430 core
layout (location = 0) in vec4 vPosition;

uniform float fTime;
uniform mat4 mTransform;
out vec4 color;
out vec4 position;

float calculaY(float x, float z, float time) 
{
    return  0.5 * sin(time + (x*x + z*z) / 50.0);
}

void main()
{
    vec4 vNewpos = vPosition;
    vNewpos.y = calculaY(vNewpos.x, vNewpos.z, fTime);  
    color = vec4(0.0, 0.0, 1.0, 1.0);
    position  = vNewpos;
    gl_Position = mTransform * vNewpos;
}

我能想象的最后一件事就是法线,但是我使用我老师的代码生成飞机,他的飞机在整个飞机上都有一个纯色,所以要么他做了一些事情错误并修复它或者我认为问题出现在我的着色器中。

1 个答案:

答案 0 :(得分:0)

您的反射向量确实没有意义:

vec4 refl   = reflect( vec4(lookat, 1.0) - lightv, norm );

有一些事情会让你产生怀疑:

  1. refl未正常化。 reflect操作将保留输入向量的长度,但输入vec4(lookat, 1.0) - lightv未标准化。
  2. vec4(lookat, 1.0) - lightv的值引用,而不是方向向量,因为它是点与另一个方向向量之间的差异。
  3. 术语vec4(lookat, 1.0) - lightv在几何上没有意义。你想要的是法线周围的光入射矢量lightv的反射。观察位置与确定入射光线在某个表面点被反射的方向完全无关。
  4. 反射向量应该是:

    refl = reflect(lightv, normal);
    
相关问题