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

 

  光照贴图一般有漫反射和镜面高光贴图。光照贴图用在片段着色器中,对每个片元计算color时,对于phong光照模型,diffuse和specular材质颜色可以从对应的纹理中采样,这就是光照贴图。

  片段着色器代码如下:

  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. };
  19. uniform Material material;
  20. uniform Light light;
  21. uniform vec3 viewPos;
  22. void main()
  23. {
  24. vec3 ambient=light.ambient * vec3(texture(material.diffuse, vs_in.TexCoords));
  25. vec3 norm=normalize(vs_in.Normal);
  26. vec3 lightDir=normalize(light.position-vs_in.FragPos);
  27. float diff=max(dot(norm,lightDir),0.0f);
  28. vec3 diffuse=light.diffuse * diff * vec3(texture(material.diffuse, vs_in.TexCoords));
  29. vec3 viewDir=normalize(viewPos-vs_in.FragPos);
  30. vec3 reflectDir=reflect(-lightDir,norm);
  31. float spec=pow(max(dot(viewDir,reflectDir),0.0f),material.shininess);
  32. vec3 specular=light.specular * spec * vec3(texture(material.specular, vs_in.TexCoords));
  33. color = vec4(ambient+diffuse+specular, 1.0f);
  34. }

 

  渲染代码如下(包含设置光照贴图):

  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->setMat4("model", glm::scale(glm::mat4(1),glm::vec3(10)));
  7. shader_cube->setInt("material.diffuse", 0);
  8. glActiveTexture(GL_TEXTURE0);
  9. glBindTexture(GL_TEXTURE_2D, container);
  10. shader_cube->setInt("material.specular", 1);
  11. glActiveTexture(GL_TEXTURE1);
  12. glBindTexture(GL_TEXTURE_2D, container_specular);
  13. shader_cube->setFloat("material.shininess", 500);
  14. shader_cube->setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
  15. shader_cube->setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
  16. shader_cube->setVec3("light.specular", 1.0f, 1.0f, 1.0f);
  17. shader_cube->setVec3("light.position", 0.0f, 0.0f, 50.0f);
  18. shader_cube->setVec3("viewPos", phc->getPos());
  19. // draw cubes
  20. cube->DrawCube();
  21. }

 

  效果图:

  

  

原文链接:http://www.cnblogs.com/chen9510/p/11621010.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号