当前位置:网站首页>Diffuse reflection of QT OpenGL light
Diffuse reflection of QT OpenGL light
2022-07-27 21:04:00 【wb175208】
Look at the effect :
The camera :
#pragma once
#include <QVector3D>
#include <QMatrix4x4>
class DiffuseLightCamera {
public:
DiffuseLightCamera(QVector3D position, float pitch, float yaw, QVector3D wordUp);
~DiffuseLightCamera();
QMatrix4x4 getViewMatrix();
void wheel(int detal);
float&getZoom() {
return _zoom;
}
void keyPress(int key);
void mouseMove(float xoffset, float yoffset);
private:
void updateCameraVector();
private:
float _pitch = 0.0;
float _yaw = 0.0;
QVector3D _wordUp;
QVector3D _right;
QVector3D _position = QVector3D(0.0, 0.0, -3.0);
QVector3D _up = QVector3D(0.0, 1.0, 0.0);
QVector3D _front = QVector3D(0.0, 0.0, 0.0);
float _zoom = 45.0;
float _zoomStep = 2.0;
};
#include "DiffuseLightCamera.h"
DiffuseLightCamera::DiffuseLightCamera(QVector3D position, float pitch, float yaw, QVector3D wordUp) {
_position = position;
_pitch = pitch;
_yaw = yaw;
_wordUp = wordUp;
updateCameraVector();
}
DiffuseLightCamera::~DiffuseLightCamera() {
}
QMatrix4x4 DiffuseLightCamera::getViewMatrix() {
QMatrix4x4 viewMatrix;
viewMatrix.lookAt(_position, _position + _front, _up);
return viewMatrix;
}
void DiffuseLightCamera::wheel(int detal) {
if (detal < 0) {
_zoom += _zoomStep;
if (_zoom >= 60.0) {
_zoom = 60.0;
}
} else {
_zoom -= _zoomStep;
if (_zoom <= 1.0) {
_zoom = 1.0;
}
}
}
void DiffuseLightCamera::keyPress(int key) {
if (key == Qt::Key_A) {
_position += _right * 0.1;
} else if (key == Qt::Key_D) {
_position -= _right * 0.1;
} else if (key == Qt::Key_W) {
_position -= _wordUp * 0.1;
} else if (key == Qt::Key_S) {
_position += _wordUp * 0.1;
} else if (key == Qt::Key_E) {
_position += _front *0.1;
} else if (key == Qt::Key_Q) {
_position -= _front *0.1;
}
}
void DiffuseLightCamera::mouseMove(float xoffset, float yoffset) {
xoffset *= 0.005;
yoffset *= 0.005;
_yaw -= xoffset;
_pitch += yoffset;
if (_pitch > 89.0f)
_pitch = 89.0f;
if (_pitch < -89.0f)
_pitch = -89.0f;
updateCameraVector();
}
void DiffuseLightCamera::updateCameraVector() {
QVector3D front;
front.setX(cos(_yaw) * cos(_pitch));
front.setY(sin(_pitch));
front.setZ(sin(_yaw) * cos(_pitch));
_front = front.normalized();
_right = QVector3D::crossProduct(_front, _wordUp).normalized();
_up = QVector3D::crossProduct(_right, _front).normalized();
}
Interface :
#pragma once
#include <QOpenGLWindow>
#include <QOpenGLExtraFunctions>
#include <QDebug>
#include <QOpenGLTexture>
#include <QElapsedTimer>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class DiffuseLightWnd : public QOpenGLWindow {
Q_OBJECT
public:
DiffuseLightWnd();
~DiffuseLightWnd();
protected:
void initializeGL()override;
void paintGL()override;
void keyPressEvent(QKeyEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
private:
void drawObj();
private:
GLuint _VBO, _VAO;
class QOpenGLFunctions_3_3_Core* _openGLCore;
QOpenGLShaderProgram _shaderProgram;// Shader program , All shaders in the system
QMatrix4x4 model, view, projection;
class DiffuseLightCamera* _diffuseLightCamera = nullptr;
bool _lBtnDown = false;
QPoint _lBtnDownPos;
};
#include "DiffuseLightWnd.h"
#include <QKeyEvent>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QTimer>
#include <QOpenGLFunctions_3_3_Core>
#include "DiffuseLightCamera.h"
DiffuseLightWnd::DiffuseLightWnd() {
_diffuseLightCamera = new DiffuseLightCamera(QVector3D(0.0, 0.0, -4.0), 0.0, 90.0, QVector3D(0.0, 1.0, 0.0));
}
DiffuseLightWnd::~DiffuseLightWnd() {
}
void DiffuseLightWnd::initializeGL() {
_openGLCore = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
// Open depth test
_openGLCore->glEnable(GL_DEPTH_TEST);
_openGLCore->glDepthFunc(GL_LESS);
// Vertex data ( Texture coordinates are not used )
float vertices[] = {
// positions // normal vector // texture
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
// 2
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
// 3
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
// 4
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
// 5
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
// 6
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
};
// 1. Create objects
_openGLCore->glGenVertexArrays(1, &_VAO);
_openGLCore->glGenBuffers(1, &_VBO);
// 2. Bound object
_openGLCore->glBindVertexArray(_VAO);
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBO);
// 3. Data storage
_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 4. Parsing data
_openGLCore->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
_openGLCore->glEnableVertexAttribArray(0);
// 5. Vertex normal vector
_openGLCore->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
_openGLCore->glEnableVertexAttribArray(1);
// 6. Unbundling
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, 0);
_openGLCore->glBindVertexArray(0);
// 7. Shader program
_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, "E:/Projects/QtGuiTest/OPenGLApp/DiffuseLight/DiffuseLight.vert");
_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, "E:/Projects/QtGuiTest/OPenGLApp/DiffuseLight/DiffuseLight.frag");
_shaderProgram.link();
}
void DiffuseLightWnd::paintGL() {
_openGLCore->glClearColor(0.4f, 0.4f, 0.4f, 1.0f);
_openGLCore->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_openGLCore->glBindVertexArray(_VAO);
drawObj();
update();
}
void DiffuseLightWnd::keyPressEvent(QKeyEvent *event) {
_diffuseLightCamera->keyPress(event->key());
}
void DiffuseLightWnd::mouseMoveEvent(QMouseEvent *event) {
if (_lBtnDown) {
float xpos = static_cast<float>(event->pos().x());
float ypos = static_cast<float>(event->pos().y());
float xoffset = _lBtnDownPos.x() - xpos;
float yoffset = _lBtnDownPos.y() - ypos;
_lBtnDownPos = event->pos();
_diffuseLightCamera->mouseMove(xoffset, yoffset);
}
}
void DiffuseLightWnd::wheelEvent(QWheelEvent *event) {
_diffuseLightCamera->wheel(event->delta());
update();
}
void DiffuseLightWnd::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
_lBtnDown = true;
_lBtnDownPos = event->pos();
}
}
void DiffuseLightWnd::mouseReleaseEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
_lBtnDown = false;
}
}
void DiffuseLightWnd::resizeGL(int w, int h) {
glViewport(0, 0, w, h);
}
void DiffuseLightWnd::drawObj() {
_shaderProgram.bind();
QMatrix4x4 model;
model.rotate(45.0, QVector3D(1.0, 1.0, 1.0));
model.scale(0.5);
QMatrix4x4 view = _diffuseLightCamera->getViewMatrix();
QMatrix4x4 projection;
projection.perspective(_diffuseLightCamera->getZoom(), width() / height(), 0.1, 100);
_shaderProgram.setUniformValue("model", model);
_shaderProgram.setUniformValue("view", view);
_shaderProgram.setUniformValue("projection", projection);
_shaderProgram.setUniformValue("objectColor", 1.0f, 0.5f, 0.31f);
_shaderProgram.setUniformValue("lightColor", 1.0f, 1.0f, 1.0f);
_shaderProgram.setUniformValue("lightPos", 0.0f, 0.0f, -4.0f);
_openGLCore->glDrawArrays(GL_TRIANGLES, 0, 36);
}
Vertex shader :
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
out vec3 Normal;
out vec3 FragPos;
// Matrix must be initialized , Initialize identity matrix , otherwise GLSL The default matrix in the language is 0 matrix
uniform mat4 model = mat4(1.0);
uniform mat4 view = mat4(1.0);
uniform mat4 projection = mat4(1.0);
void main(){
gl_Position = projection * view * model * vec4(aPos, 1.0);
FragPos = vec3(model * vec4(aPos, 1.0)); // Use the model matrix to obtain the position of the slice
Normal = mat3(transpose(inverse(model))) * aNormal;
}
Fragment Shader :
#version 330 core
out vec4 fragColor;
in vec3 Normal;
in vec3 FragPos;
uniform vec3 lightPos;
uniform vec3 lightColor;
uniform vec3 objectColor;
uniform vec3 viewPos;// Specular use - The location of the camera
void main(){
// The ambient light
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
// Diffuse reflection
// 1. Regularized slice position vector and light source direction vector .
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
// 2. Calculate the influence of diffused light on the color of light source .
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
// 3. Calculate the final slice color according to the ambient light and diffuse light .
vec3 result = (ambient + diffuse) * objectColor;
// Let's calculate the specular illumination
/* ** 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);
}
aaa
边栏推荐
- Programmer growth Chapter 18: project launch
- LabVIEW学习笔记九:捕捉由程序修改控件值产生的“值改变”事件
- js中数组与字符串常用方法属性总结
- Qt 链接MSSQL
- [deep learning] pytoch torch Autograd automatic differential engine
- CPDA | how to have data analysis thinking?
- Download of MySQL driver jar package -- nanny tutorial
- AIRIOT答疑第6期|如何使用二次开发引擎?
- SQL coding bug
- 一种比读写锁更快的锁,还不赶紧认识一下
猜你喜欢

品牌列表案例

LeetCode每日一练 —— 21. 合并两个有序链表
Rk3399 platform development series explanation (process part) 15.36, understanding process and collaboration process

自动化测试----selenium(二)

LeetCode每日一练 —— 876. 链表的中间结点

Automatic test solution based on ATX

【历史上的今天】7 月 27 日:模型检测先驱出生;微软收购 QDOS;第一张激光照排的中文报纸

【R语言】【1】初学R语言语法使用Rstudio编辑

IOU 目标跟踪其一:IOU Tracker

LabVIEW学习笔记五:按钮按下后无法返回原状
随机推荐
【R语言】【1】初学R语言语法使用Rstudio编辑
二舅,为什么火了?
IOU 目标跟踪其一:IOU Tracker
MySQL design optimization generates columns
[program life] "stage summary" - unwilling to be ordinary
AIRIOT答疑第6期|如何使用二次开发引擎?
Chapter 7 Intermediate Shell Tool I
Ipv4/ipv6, DHCP, gateway, routing
自动化测试----selenium(二)
Do you know about data synchronization?
LabVIEW学习笔记五:按钮按下后无法返回原状
好开不贵,舒适安全!深度体验比亚迪宋Pro DM-i
API Gateway介绍
LeetCode-209-长度最小的子数组
[Numpy] 广播机制(Broadcast)
最新版web漏洞扫描工具AppScan\AWVS\Xray安装及使用教程
SLIM:自监督点云场景流与运动估计(ICCV 2021)
Where is the program?
Sscanf caused the address to be out of bounds
R语言使用epiDisplay包的lroc函数可视化logistic回归模型的ROC曲线并输出诊断表(diagnostic table)、可视化多条ROC曲线、使用legend函数为可视化图像添加图例