繁体   English   中英

看不到SpotLight-OpenGL

[英]SpotLight is not seen - OpenGL

我正在OpenGL中进行聚光灯下的项目。 我想我写的代码正确,但是我看不到输出中的圆点。 您的帮助将不胜感激。 在这里,我正在编写片段着色器文件和灯光定义。

fragmentShader.fs

#version 330

in vec3 N; // interpolated normal for the pixel
in vec3 v; // interpolated position for the pixel 

// Uniform block for the light source properties
layout (std140) uniform LightSourceProp {
    // Light source position in eye space (i.e. eye is at (0, 0, 0))
    uniform vec4 lightSourcePosition;

    uniform vec4 diffuseLightIntensity;
    uniform vec4 specularLightIntensity;
    uniform vec4 ambientLightIntensity;

    // for calculating the light attenuation 
    uniform float constantAttenuation;
    uniform float linearAttenuation;
    uniform float quadraticAttenuation;

    // Spotlight direction
    uniform vec3 spotDirection;
    uniform float  cutOffExponent;
    // Spotlight cutoff angle
    uniform float spotCutoff;
};

// Uniform block for surface material properties
layout (std140) uniform materialProp {
    uniform vec4 Kambient;
    uniform vec4 Kdiffuse;
    uniform vec4 Kspecular;
    uniform float shininess;
};

out vec4 color;

// This fragment shader is an example of per-pixel lighting.
void main() {

    // Now calculate the parameters for the lighting equation:
    // color = Ka * Lag + (Ka * La) + attenuation * ((Kd * (N dot L) * Ld) + (Ks * ((N dot HV) ^ shininess) * Ls))
    // Ka, Kd, Ks: surface material properties
    // Lag: global ambient light (not used in this example)
    // La, Ld, Ls: ambient, diffuse, and specular components of the light source
    // N: normal
    // L: light vector
    // HV: half vector
    // shininess
    // attenuation: light intensity attenuation over distance and spotlight angle

    vec3 lightVector;
    float attenuation = 1.0; 
    float se;


    // point light source
    lightVector = normalize(lightSourcePosition.xyz - v);

    //Calculate Spoteffect
    // calculate attenuation    


 float angle = dot( normalize(spotDirection),
                 normalize(lightVector));
    angle = max(angle,0);   

   // Test whether vertex is located in the cone
   if(acos (angle) > radians(5))
 { 

  float distance = length(lightSourcePosition.xyz - v);
   angle = pow(angle,2.0);

 attenuation = angle / (constantAttenuation + (linearAttenuation * distance) 
        +(quadraticAttenuation * distance * distance));

           //calculate Diffuse Color  
   float NdotL = max(dot(N,lightVector), 0.0);

   vec4 diffuseColor = Kdiffuse * diffuseLightIntensity * NdotL;

   // calculate Specular color. Here we use the original Phong illumination model. 
   vec3 E = normalize(-v); // Eye vector. We are in Eye Coordinates, so EyePos is (0,0,0)  

   vec3 R = normalize(-reflect(lightVector,N)); // light reflection vector

   float RdotE = max(dot(R,E),0.0);

   vec4 specularColor = Kspecular * specularLightIntensity * pow(RdotE,shininess);

   // ambient color
   vec4 ambientColor = Kambient * ambientLightIntensity;

  color = ambientColor + attenuation * (diffuseColor + specularColor);   

  }   
   else
       color = vec4(1,1,0,1); // lit (yellow)


}

main.cpp中的灯光定义

struct SurfaceMaterialProp {
    float Kambient[4]; //ambient component
    float Kdiffuse[4]; //diffuse component
    float Kspecular[4]; // Surface material property: specular component
    float shininess; 
};

SurfaceMaterialProp surfaceMaterial1 = {
    {1.0f, 1.0f, 1.0f, 1.0f},  // Kambient: ambient coefficient
    {1.0f, 0.8f, 0.72f, 1.0f},  // Kdiffuse: diffuse coefficient
    {1.0f, 1.0f, 1.0f, 1.0f},  // Kspecular: specular coefficient
    5.0f // Shininess
};

struct LightSourceProp {
    float lightSourcePosition[4]; 
    float diffuseLightIntensity[4];
    float specularLightIntensity[4];
    float ambientLightIntensity[4];
    float constantAttenuation; 
    float linearAttenuation;
    float quadraticAttenuation;
    float spotlightDirection[4];
    float spotlightCutoffAngle;
    float  cutOffExponent;
};

LightSourceProp lightSource1 = {
    { 0.0,400.0,0.0, 1.0 },  // light source position
    {1.0f, 0.0f, 0.0f, 1.0f},  // diffuse light intensity
    {1.0f, 0.0f, 0.0f, 1.0f},  // specular light intensity
    {1.0f, 0.2f, 0.0f, 1.0f}, // ambient light intensity
    1.0f, 0.5, 0.1f,   // constant, linear, and quadratic attenuation factors
    {0.0,50.0,0.0},  // spotlight direction
    {5.0f}, // spotlight cutoff angle (in radian)
    {2.0f} // spotexponent
    };

C ++代码中LightSourceProp结构的几个成员的顺序与统一块中的顺序不同。

统一块的最后两个成员:

    uniform float cutOffExponent;
    uniform float spotCutoff;
};

C ++结构的最后两个成员:

    float spotlightCutoffAngle;
    float  cutOffExponent;
};

这两个值被交换。

另外,截止角看起来也很大:

{5.0f}, // spotlight cutoff angle (in radian)

那是一个286度的角度,并不是什么亮点。 对于实际的聚光灯,您可能想要更小的东西,例如0.1f0.2f

可能给您带来意想不到的结果的另一个方面是您的环境强度很大:

{1.0f, 1.0f, 1.0f, 1.0f},  // Kambient: ambient coefficient
...
{1.0f, 0.2f, 0.0f, 1.0f}, // ambient light intensity

根据您在着色器代码中使用这些值的方式,很可能仅靠环境强度使颜色饱和,并且不会从光源和材质的其他术语中获得任何可见的贡献。 因为环境强度是恒定的,所以这将导致整个几何图形完全平坦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM