Qt OpenGL 光照实现

[复制链接]
发表于 2025-7-1 11:33:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Qt 中使用 OpenGL 实现光照效果主要基于 OpenGL 的光照模型和着色器编程。以下是 Qt OpenGL 光照实现的核心原理:
一. 光照模型基础

OpenGL 使用 Phong 光照模型,包罗三个主要光照分量:


  • 环境光(Ambient):场景中的基础光照,没有方向性

  • 漫反射光(Diffuse):与表面法线和光线方向相干的散射光

  • 镜面光(Specular):在特定角度可见的高光反射
二. Qt 中的实现方式

2.1 传统固定管线方式 (已过时但简单)

cpp
  1. // 启用光照
  2. glEnable(GL_LIGHTING);
  3. glEnable(GL_LIGHT0); // 启用0号光源
  4. // 设置光源属性
  5. GLfloat lightPosition[] = {1.0f, 1.0f, 1.0f, 1.0f};
  6. GLfloat lightAmbient[] = {0.2f, 0.2f, 0.2f, 1.0f};
  7. GLfloat lightDiffuse[] = {0.8f, 0.8f, 0.8f, 1.0f};
  8. GLfloat lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};
  9. glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
  10. glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
  11. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
  12. glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
  13. // 设置材质属性
  14. GLfloat materialAmbient[] = {0.7f, 0.7f, 0.7f, 1.0f};
  15. GLfloat materialDiffuse[] = {0.8f, 0.8f, 0.8f, 1.0f};
  16. GLfloat materialSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};
  17. GLfloat materialShininess = 100.0f;
  18. glMaterialfv(GL_FRONT, GL_AMBIENT, materialAmbient);
  19. glMaterialfv(GL_FRONT, GL_DIFFUSE, materialDiffuse);
  20. glMaterialfv(GL_FRONT, GL_SPECULAR, materialSpecular);
  21. glMaterialf(GL_FRONT, GL_SHININESS, materialShininess);
复制代码
2.2 现代可编程管线方式 (推荐)

使用着色器实现光照效果:
顶点着色器示例

glsl
  1. #version 330 core
  2. layout(location = 0) in vec3 position;
  3. layout(location = 1) in vec3 normal;
  4. out vec3 FragPos;
  5. out vec3 Normal;
  6. uniform mat4 model;
  7. uniform mat4 view;
  8. uniform mat4 projection;
  9. void main()
  10. {
  11.     FragPos = vec3(model * vec4(position, 1.0));
  12.     Normal = mat3(transpose(inverse(model))) * normal;
  13.     gl_Position = projection * view * vec4(FragPos, 1.0);
  14. }
复制代码
片段着色器示例 (Phong光照)

glsl
  1. #version 330 core
  2. in vec3 FragPos;
  3. in vec3 Normal;
  4. out vec4 FragColor;
  5. uniform vec3 lightPos;
  6. uniform vec3 viewPos;
  7. uniform vec3 lightColor;
  8. uniform vec3 objectColor;
  9. void main()
  10. {
  11.     // 环境光
  12.     float ambientStrength = 0.1;
  13.     vec3 ambient = ambientStrength * lightColor;
  14.    
  15.     // 漫反射
  16.     vec3 norm = normalize(Normal);
  17.     vec3 lightDir = normalize(lightPos - FragPos);
  18.     float diff = max(dot(norm, lightDir), 0.0);
  19.     vec3 diffuse = diff * lightColor;
  20.    
  21.     // 镜面光
  22.     float specularStrength = 0.5;
  23.     vec3 viewDir = normalize(viewPos - FragPos);
  24.     vec3 reflectDir = reflect(-lightDir, norm);
  25.     float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
  26.     vec3 specular = specularStrength * spec * lightColor;
  27.    
  28.     vec3 result = (ambient + diffuse + specular) * objectColor;
  29.     FragColor = vec4(result, 1.0);
  30. }
复制代码
三. Qt 中的实现步骤

<

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

快速回复 返回顶部 返回列表