经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
投光物
来源:cnblogs  作者:茶飘香~  时间:2019/10/8 9:15:42  对本文有异议

 

  1、平行光

  给出光源的方向向量即可,没有位置(这里不作代码展示了,很简单)。

 

  2、点光源

  点光源包含衰减过程。需要给出光源的位置,衰减的三个系数。

  片段着色器代码如下:

  1. #version 430 core
  2. out vec4 color;
  3. in VS_OUT{
  4. vec3 FragPos;
  5. vec3 Normal;
  6. vec2 TexCoords;
  7. }vs_in;
  8. struct Material{
  9. sampler2D diffuse;
  10. sampler2D specular;
  11. float shininess;
  12. };
  13. struct Light{
  14. vec3 position;
  15. vec3 ambient;
  16. vec3 diffuse;
  17. vec3 specular;
  18. float constant;
  19. float linear;
  20. float quadratic;
  21. };
  22. uniform Material material;
  23. uniform Light light;
  24. uniform vec3 viewPos;
  25. void main()
  26. {
  27. float distance=length(light.position-vs_in.FragPos);
  28. float attenuation=10.0f/(light.constant+light.linear*distance+light.quadratic*(distance*distance));
  29. vec3 ambient=light.ambient * vec3(texture(material.diffuse, vs_in.TexCoords));
  30. ambient*=attenuation;
  31. vec3 norm=normalize(vs_in.Normal);
  32. vec3 lightDir=normalize(light.position-vs_in.FragPos);
  33. float diff=max(dot(norm,lightDir),0.0f);
  34. vec3 diffuse=light.diffuse * diff * vec3(texture(material.diffuse, vs_in.TexCoords));
  35. diffuse*=attenuation;
  36. vec3 viewDir=normalize(viewPos-vs_in.FragPos);
  37. vec3 reflectDir=reflect(-lightDir,norm);
  38. float spec=pow(max(dot(viewDir,reflectDir),0.0f),material.shininess);
  39. vec3 specular=light.specular * spec * vec3(texture(material.specular, vs_in.TexCoords));
  40. specular*=attenuation;
  41. color = vec4(ambient+diffuse+specular, 1.0f);
  42. }

  渲染代码如下:

  1. void SceneRendering::CubeRendering() {
  2. //update uniform buffer
  3. cube->setViewMat(phc->getViewMatrix());
  4. cube->setProjectionMat(phc->getProjectionMatrix());
  5. shader_cube->use();
  6. shader_cube->setInt("material.diffuse", 0);
  7. glActiveTexture(GL_TEXTURE0);
  8. glBindTexture(GL_TEXTURE_2D, container);
  9. shader_cube->setInt("material.specular", 1);
  10. glActiveTexture(GL_TEXTURE1);
  11. glBindTexture(GL_TEXTURE_2D, container_specular);
  12. shader_cube->setFloat("material.shininess", 500);
  13. shader_cube->setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
  14. shader_cube->setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
  15. shader_cube->setVec3("light.specular", 1.0f, 1.0f, 1.0f);
  16. shader_cube->setVec3("light.position", 0.0f, 0.0f, 10.0f);
  17. shader_cube->setFloat("light.constant", 1.0f);
  18. shader_cube->setFloat("light.linear", 0.09f);
  19. shader_cube->setFloat("light.quadratic", 0.032f);
  20. shader_cube->setVec3("viewPos", phc->getPos());
  21. // draw cubes
  22. for (unsigned int i = 0; i < 10; i++)
  23. {
  24. glm::mat4 model;
  25. model = glm::scale(model, glm::vec3(5));
  26. model = glm::translate(model, cube->cubePositions[i]);
  27. float angle = 20.0f * i;
  28. model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
  29. shader_cube->setMat4("model", model);
  30. cube->DrawCube();
  31. }
  32. }

  效果图:

  

 

  3、聚光灯

  聚光灯除了衰减以外,加入了照射范围限制,光源有位置、照射方向、cut角。

  片段着色器代码如下:

  1. #version 430 core
  2. out vec4 color;
  3. in VS_OUT{
  4. vec3 FragPos;
  5. vec3 Normal;
  6. vec2 TexCoords;
  7. }vs_in;
  8. struct Material{
  9. sampler2D diffuse;
  10. sampler2D specular;
  11. float shininess;
  12. };
  13. struct Light{
  14. vec3 ambient;
  15. vec3 diffuse;
  16. vec3 specular;
  17. float constant;
  18. float linear;
  19. float quadratic;
  20. vec3 position;
  21. vec3 direction;
  22. float cutOff;
  23. float outerCutOff;
  24. };
  25. uniform Material material;
  26. uniform Light light;
  27. uniform vec3 viewPos;
  28. void main()
  29. {
  30. float distance=length(light.position-vs_in.FragPos);
  31. float attenuation=10.0f/(light.constant+light.linear*distance+light.quadratic*(distance*distance));
  32. vec3 ambient=light.ambient * vec3(texture(material.diffuse, vs_in.TexCoords));
  33. ambient*=attenuation;
  34. vec3 norm=normalize(vs_in.Normal);
  35. vec3 lightDir=normalize(light.position-vs_in.FragPos);
  36. float diff=max(dot(norm,lightDir),0.0f);
  37. vec3 diffuse=light.diffuse * diff * vec3(texture(material.diffuse, vs_in.TexCoords));
  38. diffuse*=attenuation;
  39. vec3 viewDir=normalize(viewPos-vs_in.FragPos);
  40. vec3 reflectDir=reflect(-lightDir,norm);
  41. float spec=pow(max(dot(viewDir,reflectDir),0.0f),material.shininess);
  42. vec3 specular=light.specular * spec * vec3(texture(material.specular, vs_in.TexCoords));
  43. specular*=attenuation;
  44. float theta=dot(lightDir,normalize(-light.direction));
  45. float epsilon=light.cutOff-light.outerCutOff;
  46. float intensity=clamp((theta-light.outerCutOff)/epsilon,0.0,1.0);
  47. //ambient*=intensity;
  48. diffuse*=intensity;
  49. specular*=intensity;
  50. color = vec4(ambient+diffuse+specular, 1.0f);
  51. }

  渲染代码如下:

  1. void SceneRendering::CubeRendering() {
  2. //update uniform buffer
  3. cube->setViewMat(phc->getViewMatrix());
  4. cube->setProjectionMat(phc->getProjectionMatrix());
  5. shader_cube->use();
  6. shader_cube->setInt("material.diffuse", 0);
  7. glActiveTexture(GL_TEXTURE0);
  8. glBindTexture(GL_TEXTURE_2D, container);
  9. shader_cube->setInt("material.specular", 1);
  10. glActiveTexture(GL_TEXTURE1);
  11. glBindTexture(GL_TEXTURE_2D, container_specular);
  12. shader_cube->setFloat("material.shininess", 500);
  13. shader_cube->setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
  14. shader_cube->setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
  15. shader_cube->setVec3("light.specular", 1.0f, 1.0f, 1.0f);
  16. shader_cube->setFloat("light.constant", 1.0f);
  17. shader_cube->setFloat("light.linear", 0.09f);
  18. shader_cube->setFloat("light.quadratic", 0.032f);
  19. shader_cube->setVec3("light.position", phc->getPos());
  20. shader_cube->setVec3("light.direction", phc->GetForwardVec());
  21. shader_cube->setFloat("light.cutOff", glm::cos(glm::radians(12.5f)));
  22. shader_cube->setFloat("light.outerCutOff", glm::cos(glm::radians(17.5f)));
  23. shader_cube->setVec3("viewPos", phc->getPos());
  24. // draw cubes
  25. for (unsigned int i = 0; i < 10; i++)
  26. {
  27. glm::mat4 model;
  28. model = glm::scale(model, glm::vec3(5));
  29. model = glm::translate(model, cube->cubePositions[i]);
  30. float angle = 20.0f * i;
  31. model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
  32. shader_cube->setMat4("model", model);
  33. cube->DrawCube();
  34. }
  35. }

  硬影效果图:

  

  软影效果图:

  

  

原文链接:http://www.cnblogs.com/chen9510/p/11622418.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号