Advertisement
ChocoMan

Untitled

Apr 15th, 2014
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.60 KB | None | 0 0
  1. #pragma once
  2. #include "commons.h"
  3. #include "Technique.h"
  4. #include "Math3D.h"
  5.  
  6. struct BaseLight
  7. {
  8.     glm::vec3 Color;
  9.     float AmbientIntensity;
  10.     float DiffuseIntensity;
  11.  
  12.     BaseLight()
  13.     {
  14.         Color = glm::vec3(0.f, 0.f, 0.f);
  15.         AmbientIntensity = 0.f;
  16.         DiffuseIntensity = 0.f;
  17.     }
  18. };
  19.  
  20.  
  21. struct DirectionalLight : public BaseLight
  22. {
  23.     glm::vec3 Direction;
  24.  
  25.     DirectionalLight()
  26.     {
  27.         Direction = glm::vec3(0.f, 0.f, 0.f);
  28.     }
  29. };
  30.  
  31.  
  32. struct PointLight : public BaseLight
  33. {
  34.     glm::vec3 Position;
  35.  
  36.     struct
  37.     {
  38.         float Constant;
  39.         float Linear;
  40.         float Exp;
  41.     } Attenuation;
  42.  
  43.     PointLight()
  44.     {
  45.         Position = glm::vec3(0.f, 0.f, 0.f);
  46.         Attenuation.Constant = 1.f;
  47.         Attenuation.Linear = 0.f;
  48.         Attenuation.Exp = 0.f;
  49.     }
  50. };
  51.  
  52.  
  53. struct SpotLight : public PointLight
  54. {
  55.     glm::vec3 Direction;
  56.     float Cutoff;
  57.  
  58.     SpotLight()
  59.     {
  60.         Direction = glm::vec3(0.f, 0.f, 0.f);
  61.         Cutoff = 0.f;
  62.     }
  63. };
  64.  
  65.  
  66. class Lighting : public Technique
  67. {
  68. public:
  69.     static const unsigned int MAX_POINT_LIGHTS = 2;
  70.     static const unsigned int MAX_SPOT_LIGHTS = 2;
  71.  
  72.     Lighting();
  73.    
  74.     virtual bool Init();
  75.  
  76.     void SetWVP(const Mat4f &WVP);
  77.     void SetWorldMatrix(const Mat4f &WorldInverse);
  78.     void SetColorTextureUnit(unsigned int TextureUnit);
  79.     void setDirectionalLight(const DirectionalLight &Light);
  80.     void setPointLights(unsigned int NumLights, const PointLight *pLights);
  81.     void setSpotLights(unsigned int NumLights, const SpotLight *pLights);
  82.     void setEyeWorldPos(const glm::vec3 &EyeWorldPos);
  83.     void setMatSpecularIntensity(float Intensity);
  84.     void setMatSpecularPower(float Power);
  85.  
  86. private:
  87.     GLuint m_WVPLocation;
  88.     GLuint m_WorldMatrixLocation;
  89.     GLuint m_colorTextureLocation;
  90.     GLuint m_eyeWorldPosLocation;
  91.     GLuint m_matSpecularIntensityLocation;
  92.     GLuint m_matSpecularPowerLocation;
  93.     GLuint m_numPointLightsLocation;
  94.     GLuint m_numSpotLightsLocation;
  95.  
  96.     struct
  97.     {
  98.         GLuint Color;
  99.         GLuint AmbientIntensity;
  100.         GLuint DiffuseIntensity;
  101.         GLuint Direction;
  102.     } m_dirLightLocation;
  103.  
  104.     struct
  105.     {
  106.         GLuint Color;
  107.         GLuint AmbientIntensity;
  108.         GLuint DiffuseIntensity;
  109.         GLuint Position;
  110.         struct
  111.         {
  112.             GLuint Constant;
  113.             GLuint Linear;
  114.             GLuint Exp;
  115.         } Atten;
  116.     } m_pointLightsLocation[MAX_POINT_LIGHTS];
  117.  
  118.     struct
  119.     {
  120.         GLuint Color;
  121.         GLuint AmbientIntensity;
  122.         GLuint DiffuseIntensity;
  123.         GLuint Position;
  124.         GLuint Direction;
  125.         GLuint Cutoff;
  126.         struct
  127.         {
  128.             GLuint Constant;
  129.             GLuint Linear;
  130.             GLuint Exp;
  131.         } Atten;
  132.     } m_spotLightsLocation[MAX_SPOT_LIGHTS];
  133. };
  134.  
  135. //////////////////////////////////////////////////////
  136.  
  137. #include "Lighting.h"
  138.  
  139. static const char* pVS =
  140. "#version 330 \n\
  141. \n\
  142. layout(location = 0) in vec3 Position;\n\
  143. layout(location = 1) in vec2 TexCoord;\n\
  144. layout(location = 2) in vec3 Normal;\n\
  145. \n\
  146. uniform mat4 gWVP;\n\
  147. uniform mat4 gWorld;\n\
  148. \n\
  149. out vec2 TexCoord0; \n\
  150. out vec3 Normal0;\n\
  151. out vec3 WorldPos0;\n\
  152. \n\
  153. void main()\n\
  154. {\n\
  155.     gl_Position = gWVP * vec4(Position, 1.0);\n\
  156.     TexCoord0 = TexCoord;\n\
  157.     Normal0 = (gWorld * vec4(Normal, 0.0)).xyz;\n\
  158.     WorldPos0 = (gWorld * vec4(Position, 1.0)).xyz;\n\
  159. }";
  160.  
  161. static const char* pFS =
  162. "#version 330\n\
  163. \n\
  164. const int MAX_POINT_LIGHTS = 2;\n\
  165. const int MAX_SPOT_LIGHTS = 2;\n\
  166. \n\
  167. in vec2 TexCoord0;\n\
  168. in vec3 Normal0;\n\
  169. in vec3 WorldPos0;\n\
  170. \n\
  171. out vec4 FragColor;\n\
  172. \n\
  173. struct BaseLight\n\
  174. {\n\
  175.     vec3 Color;\n\
  176.     float AmbientIntensity;\n\
  177.     float DiffuseIntensity;\n\
  178. };\n\
  179. \n\
  180. struct DirectionalLight\n\
  181. {\n\
  182.     BaseLight Base;\n\
  183.     vec3 Direction;\n\
  184. };\n\
  185. \n\
  186. struct Attenuation\n\
  187. {\n\
  188.    float Constant; \n\
  189.     float Linear;\n\
  190.     float Exp;\n\
  191. };\n\
  192. \n\
  193. struct PointLight\n\
  194. {\n\
  195.    BaseLight Base; \n\
  196.     vec3 Position;\n\
  197.     Attenuation Atten;\n\
  198. };\n\
  199. \n\
  200. struct SpotLight\n\
  201. {\n\
  202.     PointLight Base;\n\
  203.     vec3 Direction;\n\
  204.     float Cutoff;\n\
  205. };\n\
  206. \n\
  207. uniform int gNumPointLights;\n\
  208. uniform int gNumSpotLights;\n\
  209. uniform DirectionalLight gDirectionalLight;\n\
  210. uniform PointLight gPointLights[MAX_POINT_LIGHTS];\n\
  211. uniform SpotLight gSpotLights[MAX_SPOT_LIGHTS];\n\
  212. uniform sampler2D gColorMap;\n\
  213. uniform vec3 gEyeWorldPos;\n\
  214. uniform float gMatSpecularIntensity;\n\
  215. uniform float gSpecularPower;\n\
  216. \n\
  217. vec4 CalcLightInternal(BaseLight Light, vec3 LightDirection, vec3 Normal)\n\
  218. {\n\
  219.     vec4 AmbientColor = vec4(Light.Color, 1.0f) * Light.AmbientIntensity;\n\
  220.     float DiffuseFactor = dot(Normal, -LightDirection);\n\
  221.         \n\
  222.     vec4 DiffuseColor = vec4(0, 0, 0, 0); \n\
  223.     vec4 SpecularColor = vec4(0, 0, 0, 0); \n\
  224.     \n\
  225.     if (DiffuseFactor > 0) {\n\
  226.         DiffuseColor = vec4(Light.Color, 1.0f) * Light.DiffuseIntensity * DiffuseFactor;\n\
  227.                 \n\
  228.         vec3 VertexToEye = normalize(gEyeWorldPos - WorldPos0); \n\
  229.         vec3 LightReflect = normalize(reflect(LightDirection, Normal)); \n\
  230.         float SpecularFactor = dot(VertexToEye, LightReflect); \n\
  231.         SpecularFactor = pow(SpecularFactor, gSpecularPower); \n\
  232.         if (SpecularFactor > 0) {\n\
  233.             SpecularColor = vec4(Light.Color, 1.0f) *\n\
  234.                 gMatSpecularIntensity * SpecularFactor;\n\
  235.         }\n\
  236.     }\n\
  237.         \n\
  238.     return (AmbientColor + DiffuseColor + SpecularColor);\n\
  239. }\n\
  240. \n\
  241. vec4 CalcDirectionalLight(vec3 Normal)\n\
  242. {\n\
  243.     return CalcLightInternal(gDirectionalLight.Base, gDirectionalLight.Direction, Normal);\n\
  244. }\n\
  245. \n\
  246. vec4 CalcPointLight(PointLight l, vec3 Normal)\n\
  247. {\n\
  248.     vec3 LightDirection = WorldPos0 - l.Position;\n\
  249.     float Distance = length(LightDirection);\n\
  250.     LightDirection = normalize(LightDirection);\n\
  251.         \n\
  252.     vec4 Color = CalcLightInternal(l.Base, LightDirection, Normal);\n\
  253.     float Attenuation = l.Atten.Constant +\n\
  254.         l.Atten.Linear * Distance +\n\
  255.         l.Atten.Exp * Distance * Distance;\n\
  256.                 \n\
  257.     return Color / Attenuation;\n\
  258. }\n\
  259. \n\
  260. vec4 CalcSpotLight(SpotLight l, vec3 Normal)\n\
  261. {\n\
  262.     vec3 LightToPixel = normalize(WorldPos0 - l.Base.Position);\n\
  263.     float SpotFactor = dot(LightToPixel, l.Direction);\n\
  264.         \n\
  265.     if (SpotFactor > l.Cutoff) {\n\
  266.         vec4 Color = CalcPointLight(l.Base, Normal);\n\
  267.         return Color * (1.0 - (1.0 - SpotFactor) * 1.0 / (1.0 - l.Cutoff));\n\
  268.     }\n\
  269.     else {\n\
  270.         return vec4(0, 0, 0, 0);\n\
  271.     }\n\
  272. }\n\
  273. \n\
  274. void main()\n\
  275. {\n\
  276.     vec3 Normal = normalize(Normal0);\n\
  277.     vec4 TotalLight = CalcDirectionalLight(Normal);\n\
  278.         \n\
  279.     for (int i = 0; i < gNumPointLights; i++) {\n\
  280.         TotalLight += CalcPointLight(gPointLights[i], Normal);\n\
  281.     }\n\
  282.         \n\
  283.     for (int i = 0; i < gNumSpotLights; i++) {\n\
  284.         TotalLight += CalcSpotLight(gSpotLights[i], Normal);\n\
  285.     }\n\
  286.         \n\
  287.     FragColor = texture(gColorMap, TexCoord0.xy) * TotalLight;\n\
  288. }";
  289.  
  290. Lighting::Lighting()
  291. {
  292. }
  293.  
  294.  
  295. bool Lighting::Init()
  296. {
  297.     if (!Technique::Init())
  298.         return false;
  299.  
  300.     if (!AddShader(GL_VERTEX_SHADER, pVS))
  301.         return false;
  302.  
  303.     if (!AddShader(GL_FRAGMENT_SHADER, pFS))
  304.         return false;
  305.  
  306.     if (!Finalize())
  307.         return false;
  308.  
  309.     std::cout << "\n-------------------------" << std::endl;
  310.     std::cout << "LOCATIONS" << std::endl;
  311.     std::cout << "-------------------------" << std::endl;
  312.  
  313.     m_WVPLocation = GetUniformLocation("gWVP");
  314.     m_WorldMatrixLocation = GetUniformLocation("gWorld");
  315.     m_colorTextureLocation = GetUniformLocation("gColorMap");
  316.     m_eyeWorldPosLocation = GetUniformLocation("gEyeWorldPos");
  317.     m_dirLightLocation.Color = GetUniformLocation("gDirectionalLight.Base.Color");
  318.     m_dirLightLocation.AmbientIntensity = GetUniformLocation("gDirectionalLight.Base.AmbientIntensity");
  319.     m_dirLightLocation.Direction = GetUniformLocation("gDirectionalLight.Direction");
  320.     m_dirLightLocation.DiffuseIntensity = GetUniformLocation("gDirectionalLight.Base.DiffuseIntensity");
  321.     m_matSpecularIntensityLocation = GetUniformLocation("gMatSpecularIntensity");
  322.     m_matSpecularPowerLocation = GetUniformLocation("gSpecularPower");
  323.     m_numPointLightsLocation = GetUniformLocation("gNumPointLights");
  324.     m_numSpotLightsLocation = GetUniformLocation("gNumSpotLights");
  325.  
  326.     if (m_dirLightLocation.AmbientIntensity == INVALID_UNIFORM_LOCATION ||
  327.         m_WVPLocation == INVALID_UNIFORM_LOCATION ||
  328.         m_colorTextureLocation == INVALID_UNIFORM_LOCATION ||
  329.         m_WorldMatrixLocation == INVALID_UNIFORM_LOCATION ||
  330.         m_eyeWorldPosLocation == INVALID_UNIFORM_LOCATION ||
  331.         m_dirLightLocation.Color == INVALID_UNIFORM_LOCATION ||
  332.         m_dirLightLocation.AmbientIntensity == INVALID_UNIFORM_LOCATION ||
  333.         m_dirLightLocation.Direction == INVALID_UNIFORM_LOCATION ||
  334.         m_dirLightLocation.DiffuseIntensity == INVALID_UNIFORM_LOCATION ||
  335.         m_matSpecularIntensityLocation == INVALID_UNIFORM_LOCATION ||
  336.         m_matSpecularPowerLocation == INVALID_UNIFORM_LOCATION ||
  337.         m_numPointLightsLocation == INVALID_UNIFORM_LOCATION ||
  338.         m_numSpotLightsLocation == INVALID_UNIFORM_LOCATION)
  339.     {
  340.         std::cout << "\nLighting-ERROR: problem here init-Invalid uniform location\n" << std::endl;
  341.         //return false;
  342.     }
  343.  
  344.     std::cout << "\n" << std::endl;
  345.     for (unsigned int i = 0; i < ARRAY_SIZE_IN_ELEMENTS(m_pointLightsLocation); i++)
  346.     {
  347.         char name[128];
  348.         memset(name, 0, sizeof(name));
  349.  
  350.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Base.Color", i);
  351.         m_pointLightsLocation[i].Color = GetUniformLocation(name);
  352.  
  353.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Base.AmbientIntensity", i);
  354.         m_pointLightsLocation[i].AmbientIntensity = GetUniformLocation(name);
  355.  
  356.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Position", i);
  357.         m_pointLightsLocation[i].Position = GetUniformLocation(name);
  358.  
  359.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Base.DiffuseIntensity", i);
  360.         m_pointLightsLocation[i].DiffuseIntensity = GetUniformLocation(name);
  361.  
  362.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Atten.Constant", i);
  363.         m_pointLightsLocation[i].Atten.Constant = GetUniformLocation(name);
  364.  
  365.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Atten.Linear", i);
  366.         m_pointLightsLocation[i].Atten.Linear = GetUniformLocation(name);
  367.  
  368.         SNPRINTF(name, sizeof(name), "gPointLights[%d].Atten.Exp", i);
  369.         m_pointLightsLocation[i].Atten.Exp = GetUniformLocation(name);
  370.  
  371.         if (m_pointLightsLocation[i].Color == INVALID_UNIFORM_LOCATION ||
  372.             m_pointLightsLocation[i].AmbientIntensity == INVALID_UNIFORM_LOCATION ||
  373.             m_pointLightsLocation[i].Position == INVALID_UNIFORM_LOCATION ||
  374.             m_pointLightsLocation[i].DiffuseIntensity == INVALID_UNIFORM_LOCATION ||
  375.             m_pointLightsLocation[i].Atten.Constant == INVALID_UNIFORM_LOCATION ||
  376.             m_pointLightsLocation[i].Atten.Linear == INVALID_UNIFORM_LOCATION ||
  377.             m_pointLightsLocation[i].Atten.Exp == INVALID_UNIFORM_LOCATION)
  378.         {
  379.             std::cout << "\nLighting-ERROR: problem here init-point light\n" << std::endl;
  380.             return false;
  381.         }
  382.     }
  383.  
  384.     std::cout << "\n" << std::endl;
  385.     for (unsigned int i = 0; i < ARRAY_SIZE_IN_ELEMENTS(m_spotLightsLocation); i++)
  386.     {
  387.         char name[128];
  388.         memset(name, 0, sizeof(name));
  389.  
  390.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Base.Color", i);
  391.         m_spotLightsLocation[i].Color = GetUniformLocation(name);
  392.  
  393.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Base.AmbientIntensity", i);
  394.         m_spotLightsLocation[i].AmbientIntensity = GetUniformLocation(name);
  395.  
  396.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Position", i);
  397.         m_spotLightsLocation[i].Position = GetUniformLocation(name);
  398.  
  399.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Direction", i);
  400.         m_spotLightsLocation[i].Direction = GetUniformLocation(name);
  401.  
  402.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Cutoff", i);
  403.         m_spotLightsLocation[i].Cutoff = GetUniformLocation(name);
  404.  
  405.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Base.DiffuseIntensity", i);
  406.         m_spotLightsLocation[i].DiffuseIntensity = GetUniformLocation(name);
  407.  
  408.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Atten.Constant", i);
  409.         m_spotLightsLocation[i].Atten.Constant = GetUniformLocation(name);
  410.  
  411.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Atten.Linear", i);
  412.         m_spotLightsLocation[i].Atten.Linear = GetUniformLocation(name);
  413.  
  414.         SNPRINTF(name, sizeof(name), "gSpotLights[%d].Base.Atten.Exp", i);
  415.         m_spotLightsLocation[i].Atten.Exp = GetUniformLocation(name);
  416.  
  417.         if (m_spotLightsLocation[i].Color == INVALID_UNIFORM_LOCATION ||
  418.             m_spotLightsLocation[i].AmbientIntensity == INVALID_UNIFORM_LOCATION ||
  419.             m_spotLightsLocation[i].Position == INVALID_UNIFORM_LOCATION ||
  420.             m_spotLightsLocation[i].Direction == INVALID_UNIFORM_LOCATION ||
  421.             m_spotLightsLocation[i].Cutoff == INVALID_UNIFORM_LOCATION ||
  422.             m_spotLightsLocation[i].DiffuseIntensity == INVALID_UNIFORM_LOCATION ||
  423.             m_spotLightsLocation[i].Atten.Constant == INVALID_UNIFORM_LOCATION ||
  424.             m_spotLightsLocation[i].Atten.Linear == INVALID_UNIFORM_LOCATION ||
  425.             m_spotLightsLocation[i].Atten.Exp == INVALID_UNIFORM_LOCATION)
  426.         {
  427.             return false;
  428.         }
  429.     }
  430.     std::cout << "\n" << std::endl;
  431. }
  432.  
  433.  
  434. void Lighting::SetWVP(const Mat4f &WVP)
  435. {
  436.     glUniformMatrix4fv(m_WVPLocation, 1, GL_TRUE, (const GLfloat*) WVP.m);
  437. }
  438.  
  439.  
  440. void Lighting::SetWorldMatrix(const Mat4f &WorldInverse)
  441. {
  442.     glUniformMatrix4fv(m_WorldMatrixLocation, 1, GL_TRUE, (const GLfloat*) WorldInverse.m);
  443. }
  444.  
  445.  
  446. void Lighting::SetColorTextureUnit(unsigned int TextureUnit)
  447. {
  448.     glUniform1i(m_colorTextureLocation, TextureUnit);
  449. }
  450.  
  451.  
  452. void Lighting::setDirectionalLight(const DirectionalLight &Light)
  453. {
  454.     glUniform3f(m_dirLightLocation.Color, Light.Color.x, Light.Color.y, Light.Color.z);
  455.     glUniform1f(m_dirLightLocation.AmbientIntensity, Light.AmbientIntensity);
  456.     glm::vec3 Direction = Light.Direction;
  457.     glUniform3f(m_dirLightLocation.Direction, Direction.x, Direction.y, Direction.z);
  458.     glUniform1f(m_dirLightLocation.DiffuseIntensity, Light.DiffuseIntensity);
  459. }
  460.  
  461.  
  462. void Lighting::setEyeWorldPos(const glm::vec3 &EyeWorldPos)
  463. {
  464.     glUniform3f(m_eyeWorldPosLocation, EyeWorldPos.x, EyeWorldPos.y, EyeWorldPos.z);
  465. }
  466.  
  467.  
  468. void Lighting::setMatSpecularIntensity(float Intensity)
  469. {
  470.     glUniform1f(m_matSpecularIntensityLocation, Intensity);
  471. }
  472.  
  473.  
  474. void Lighting::setMatSpecularPower(float Power)
  475. {
  476.     glUniform1f(m_matSpecularPowerLocation, Power);
  477. }
  478.  
  479.  
  480. void Lighting::setPointLights(unsigned int NumLights, const PointLight *pLights)
  481. {
  482.     glUniform1i(m_numPointLightsLocation, NumLights);
  483.  
  484.     for (unsigned int i = 0; i < NumLights; i++)
  485.     {
  486.         glUniform3f(m_pointLightsLocation[i].Color, pLights[i].Color.x, pLights[i].Color.y, pLights[i].Color.z);
  487.         glUniform1f(m_pointLightsLocation[i].AmbientIntensity, pLights[i].AmbientIntensity);
  488.         glUniform1f(m_pointLightsLocation[i].DiffuseIntensity, pLights[i].DiffuseIntensity);
  489.         glUniform3f(m_pointLightsLocation[i].Position, pLights[i].Position.x, pLights[i].Position.y, pLights[i].Position.z);
  490.         glUniform1f(m_pointLightsLocation[i].Atten.Constant, pLights[i].Attenuation.Constant);
  491.         glUniform1f(m_pointLightsLocation[i].Atten.Linear, pLights[i].Attenuation.Linear);
  492.         glUniform1f(m_pointLightsLocation[i].Atten.Exp, pLights[i].Attenuation.Exp);
  493.     }
  494. }
  495.  
  496. void Lighting::setSpotLights(unsigned int NumLights, const SpotLight *pLights)
  497. {
  498.     glUniform1i(m_numSpotLightsLocation, NumLights);
  499.  
  500.     for (unsigned int i = 0; i < NumLights; i++)
  501.     {
  502.         glUniform3f(m_spotLightsLocation[i].Color, pLights[i].Color.x, pLights[i].Color.y, pLights[i].Color.z);
  503.         glUniform1f(m_spotLightsLocation[i].AmbientIntensity, pLights[i].AmbientIntensity);
  504.         glUniform1f(m_spotLightsLocation[i].DiffuseIntensity, pLights[i].DiffuseIntensity);
  505.         glUniform3f(m_spotLightsLocation[i].Position, pLights[i].Position.x, pLights[i].Position.y, pLights[i].Position.z);
  506.         glm::vec3 Direction = pLights[i].Direction;
  507.         glm::normalize(Direction);
  508.         glUniform3f(m_spotLightsLocation[i].Direction, pLights[i].Direction.x, pLights[i].Direction.y, pLights[i].Direction.z);
  509.         glUniform1f(m_spotLightsLocation[i].Cutoff, cosf(toRadian(pLights[i].Cutoff)));
  510.         glUniform1f(m_spotLightsLocation[i].Atten.Constant, pLights[i].Attenuation.Constant);
  511.         glUniform1f(m_spotLightsLocation[i].Atten.Linear, pLights[i].Attenuation.Linear);
  512.         glUniform1f(m_spotLightsLocation[i].Atten.Exp, pLights[i].Attenuation.Exp);
  513.     }
  514. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement