SpotLight не видно - 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 ****** 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
 };
1 ответ

Порядок нескольких членов структуры LightSourceProp в коде C++ отличается от порядка в едином блоке.

Последние два члена единого блока:

uniform float cutOffExponent;
 uniform float spotCutoff;
};

Последние два члена структуры C++:

float spotlightCutoffAngle;
 float cutOffExponent;
};

Эти два значения меняются местами.

Кроме того, угол отсечки выглядит подозрительно большим:

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

Это угол 286 градусов, что не очень важно. Для фактического внимания, вы, вероятно, захотите что-то гораздо меньшее, например, 0.1f или 0.2f.

Другим аспектом, который может дать вам неожиданные результаты, является то, что у вас много интенсивности окружающей среды:

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

В зависимости от того, как вы используете эти значения в коде шейдера, вероятно, что ваши цвета будут насыщены только интенсивностью окружающей среды, и вы не получите никакого видимого вклада от других условий источника света и материала. Поскольку интенсивность окружающей среды постоянна, это приведет к полностью плоскому цвету для всей геометрии.

licensed under cc by-sa 3.0 with attribution.