当前位置: 首页 > backend >正文

Qt OpenGL 光照实现

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

一. 光照模型基础

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

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

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

  • 镜面光(Specular):在特定角度可见的高光反射

二. Qt 中的实现方式

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

cpp

// 启用光照
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); // 启用0号光源// 设置光源属性
GLfloat lightPosition[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat lightAmbient[] = {0.2f, 0.2f, 0.2f, 1.0f};
GLfloat lightDiffuse[] = {0.8f, 0.8f, 0.8f, 1.0f};
GLfloat lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);// 设置材质属性
GLfloat materialAmbient[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat materialDiffuse[] = {0.8f, 0.8f, 0.8f, 1.0f};
GLfloat materialSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat materialShininess = 100.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, materialAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, materialDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, materialSpecular);
glMaterialf(GL_FRONT, GL_SHININESS, materialShininess);

2.2 现代可编程管线方式 (推荐)

使用着色器实现光照效果:

顶点着色器示例

glsl

#version 330 corelayout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;out vec3 FragPos;
out vec3 Normal;uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main()
{FragPos = vec3(model * vec4(position, 1.0));Normal = mat3(transpose(inverse(model))) * normal;gl_Position = projection * view * vec4(FragPos, 1.0);
}
片段着色器示例 (Phong光照)

glsl

#version 330 corein vec3 FragPos;
in vec3 Normal;out vec4 FragColor;uniform vec3 lightPos;
uniform vec3 viewPos;
uniform vec3 lightColor;
uniform vec3 objectColor;void main()
{// 环境光float ambientStrength = 0.1;vec3 ambient = ambientStrength * lightColor;// 漫反射vec3 norm = normalize(Normal);vec3 lightDir = normalize(lightPos - FragPos);float diff = max(dot(norm, lightDir), 0.0);vec3 diffuse = diff * lightColor;// 镜面光float specularStrength = 0.5;vec3 viewDir = normalize(viewPos - FragPos);vec3 reflectDir = reflect(-lightDir, norm);float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);vec3 specular = specularStrength * spec * lightColor;vec3 result = (ambient + diffuse + specular) * objectColor;FragColor = vec4(result, 1.0);
}

三. Qt 中的实现步骤

<

http://www.xdnf.cn/news/10659.html

相关文章:

  • JAVA-springboot整合Mybatis
  • Linux 系统 Docker Compose 安装
  • Spring Cloud 2025 正式发布啦
  • Vue基础(12)_Vue.js循环语句用法:列表渲染
  • 超声波测距三大算法实测对比
  • 字节跳动开源图标库:2000+图标一键换肤的魔法
  • 深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
  • 5.RV1126-OPENCV 图形计算面积
  • Ubuntu22.04 安装 CUDA12.8
  • SQL Transactions(事务)、隔离机制
  • Python发送天气预报到企业微信解决方案
  • A. We Need the Zero
  • LangGraph framework
  • 《Linux 包管理实战手册:RPM 精准操作与 YUM 自动化部署从入门到精通》
  • 软件测评师 第9章 基于质量特性的测试与评价 笔记
  • SQL 中的 `CASE WHEN` 如何使用?
  • CUDA与OpenGL混合编程图形渲染
  • 【Python 算法零基础 4.排序 ⑦ 桶排序】
  • 【算法训练营Day05】哈希表part1
  • 《软件项目管理》第二章(项目准备与启动)期末周复习总结笔记
  • uniapp中view标签使用范围
  • Kotlin 中companion object {} 什么时候触发
  • C语言:内存函数
  • 前端面试高频问题通关指南--通用性问题
  • Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)
  • SQL: 窗口滑动(Sliding Window)
  • 数学建模期末速成 最短路径
  • 23. Merge k Sorted Lists
  • Alist Win 基本用法
  • JavaSE知识总结(集合篇) ~个人笔记以及不断思考~持续更新