#include "myopenglwidget.h"
#define timeOutmSec 50
float vertices[] = {
// positions // normals // texture coords
-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,
-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,
-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,
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,
-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,
-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
};
QVector3D cubePositions[] = {
QVector3D( 0.0f, 0.0f, 0.0f),
QVector3D( 2.0f, 5.0f, -15.0f),
QVector3D(-1.5f, -2.2f, -2.5f),
QVector3D(-3.8f, -2.0f, -12.3f),
QVector3D( 2.4f, -0.4f, -3.5f),
QVector3D(-1.7f, 3.0f, -7.5f),
QVector3D( 1.3f, -2.0f, -2.5f),
QVector3D( 1.5f, 2.0f, -2.5f),
QVector3D( 1.5f, 0.2f, -1.5f),
QVector3D(-1.3f, 1.0f, -1.5f)
};
const float PI = 3.1415926;
unsigned int VAO,VBO,lightVAO;
QVector3D lightPos(1.2f, 1.0f, 2.0f);
QVector3D lightColor(1.0f, 1.0f, 1.0f);
QVector3D objectColor(1.0f, 0.5f, 0.31f);
QVector3D viewInitPos(0.0,0.0,5.0);
MyOpenglWidget::MyOpenglWidget(QWidget *parent)
: QOpenGLWidget{parent}
{
connect(&m_timer,&QTimer::timeout,this,&MyOpenglWidget::on_timeOut);
m_timer.start(timeOutmSec);
m_time.start();
m_camera.Position = viewInitPos;
setFocusPolicy(Qt::StrongFocus);
}
MyOpenglWidget::~MyOpenglWidget()
{
makeCurrent();
glDeleteBuffers(1,&VBO);
glDeleteVertexArrays(1,&VAO);
glDeleteVertexArrays(1,&lightVAO);
doneCurrent();
}
void MyOpenglWidget::initializeGL()
{
initializeOpenGLFunctions();
//创建VBO和VAO对象,并赋予ID
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO); //绑定VBO和VAO对象
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO); //为当前绑定到target的缓冲区对象创建一个新的数据存储。
//如果data不是NULL,则使用来自此指针的数据初始化数据存储
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //告知显卡如何解析缓冲里的属性值
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
//开启VAO管理的第一个属性值
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3*sizeof(float)));
//开启VAO管理的第二个属性值
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6*sizeof(float)));
//开启VAO管理的第二个属性值
glEnableVertexAttribArray(2);
glGenVertexArrays(1, &lightVAO);
glBindVertexArray(lightVAO);
// we only need to bind to the VBO, the container's VBO's data already contains the data.
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// set the vertex attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
bool success;
m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shaders/shaders/shapes.vert");
m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shaders/shaders/shapes.frag");
success=m_shaderProgram.link();
if(!success) qDebug()<<"ERR:"<<m_shaderProgram.log();
m_diffuseTex = new QOpenGLTexture(QImage(":/images/images/container2.png").mirrored());
m_specularTex = new QOpenGLTexture(QImage(":/images/images/container2_specular.png").mirrored());
m_shaderProgram.bind();
m_shaderProgram.setUniformValue("material.diffuse", 0);
m_shaderProgram.setUniformValue("material.specular", 1);
m_lightShaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shaders/shaders/light.vert");
m_lightShaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shaders/shaders/light.frag");
success=m_lightShaderProgram.link();
if(!success) qDebug()<<"ERR:"<<m_lightShaderProgram.log();
}
void MyOpenglWidget::resizeGL(int w, int h)
{
Q_UNUSED(w);
Q_UNUSED(h);
}
void MyOpenglWidget::paintGL()
{
QMatrix4x4 model;
QMatrix4x4 view;
QMatrix4x4 projection;
float time=m_time.elapsed()/50.0;
projection.perspective(m_camera.Zoom,(float)width()/height(),0.1,100);
view=m_camera.GetViewMatrix();
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_shaderProgram.bind();
m_shaderProgram.setUniformValue("projection", projection);
m_shaderProgram.setUniformValue("view", view);
m_shaderProgram.setUniformValue("light.position", m_camera.Position);
m_shaderProgram.setUniformValue("light.direction", m_camera.Front);
m_shaderProgram.setUniformValue("light.cutOff", (float)cos(12.5f*PI/180));
m_shaderProgram.setUniformValue("light.outerCutOff", (float)cos(17.5f*PI/180));
m_shaderProgram.setUniformValue("viewPos",m_camera.Position);
model.rotate(time, 1.0f, 5.0f, 0.5f);
//m_shaderProgram.setUniformValue("model", model);
// light properties, note that all light colors are set at full intensity
m_shaderProgram.setUniformValue("light.ambient", 0.4f, 0.4f, 0.4f);
m_shaderProgram.setUniformValue("light.diffuse", 0.9f, 0.9f, 0.9f);
m_shaderProgram.setUniformValue("light.specular", 1.0f, 1.0f, 1.0f);
// material properties
m_shaderProgram.setUniformValue("material.shininess", 32.0f);
m_shaderProgram.setUniformValue("light.constant", 1.0f);
m_shaderProgram.setUniformValue("light.linear", 0.09f);
m_shaderProgram.setUniformValue("light.quadratic", 0.032f);
glBindVertexArray(VAO);
m_diffuseTex->bind(0);
m_specularTex->bind(1);
for(unsigned int i = 0; i < 10; i++)
{
QMatrix4x4 model;
model.translate(cubePositions[i]);
float angle = 20.0f * i;
model.rotate(angle, QVector3D(1.0f, 0.3f, 0.5f));
m_shaderProgram.setUniformValue("model", model);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
m_lightShaderProgram.bind();
没有合适的资源?快使用搜索试试~ 我知道了~
LearnOpenGL(十一)之光源
共80个文件
png:16个
h:16个
cpp:12个
需积分: 5 0 下载量 46 浏览量
2024-05-13
10:00:12
上传
评论
收藏 5.05MB RAR 举报
温馨提示
LearnOpenGL之光源 详细介绍:https://blog.csdn.net/ckg3824278/article/details/138658006
资源推荐
资源详情
资源评论
收起资源包目录
11LightCaster.rar (80个子文件)
11LightCaster
1ParallelLight
mainwindow.h 354B
mainwindow.cpp 283B
camera.h 4KB
main.cpp 187B
shaders
light.frag 124B
shapes.frag 1KB
shapes.vert 482B
light.vert 210B
mainwindow.ui 2KB
ui_mainwindow.h 4KB
res.qrc 485B
images
matrix.jpg 291KB
container2_specular.png 141KB
wall.jpg 251KB
awesomeface.png 58KB
lighting_maps_specular_color.png 142KB
container2.png 457KB
ParallelLight.pro 711B
myopenglwidget.cpp 9KB
myopenglwidget.h 1KB
2PointLight
mainwindow.h 354B
2PointLight.pro 711B
mainwindow.cpp 283B
camera.h 4KB
main.cpp 187B
shaders
light.frag 124B
shapes.frag 1KB
shapes.vert 482B
light.vert 210B
mainwindow.ui 2KB
ui_mainwindow.h 4KB
res.qrc 485B
images
matrix.jpg 291KB
container2_specular.png 141KB
wall.jpg 251KB
awesomeface.png 58KB
lighting_maps_specular_color.png 142KB
container2.png 457KB
myopenglwidget.cpp 9KB
myopenglwidget.h 1KB
3SpotLight
mainwindow.h 354B
mainwindow.cpp 283B
camera.h 4KB
main.cpp 187B
shaders
light.frag 124B
shapes.frag 2KB
shapes.vert 491B
light.vert 210B
mainwindow.ui 2KB
ui_mainwindow.h 4KB
res.qrc 485B
images
matrix.jpg 291KB
container2_specular.png 141KB
wall.jpg 251KB
awesomeface.png 58KB
lighting_maps_specular_color.png 142KB
container2.png 457KB
3SpotLight.pro 711B
myopenglwidget.cpp 9KB
myopenglwidget.h 1KB
4SpotLightSmooth
mainwindow.h 354B
mainwindow.cpp 283B
camera.h 4KB
4SpotLightSmooth.pro 737B
main.cpp 187B
shaders
light.frag 124B
shapes.frag 2KB
shapes.vert 491B
light.vert 210B
mainwindow.ui 2KB
ui_mainwindow.h 4KB
res.qrc 485B
images
matrix.jpg 291KB
container2_specular.png 141KB
wall.jpg 251KB
awesomeface.png 58KB
lighting_maps_specular_color.png 142KB
container2.png 457KB
myopenglwidget.cpp 9KB
myopenglwidget.h 1KB
共 80 条
- 1
资源评论
码农客栈
- 粉丝: 1266
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- TG-2024-05-23-204718255.mp4
- 候志强@181 5428 8938_20240420112107.amr
- spispispispispi
- 实验二:IP协议分析.zip
- 驱动代码驱动代码驱动代码驱动代码
- SVID_20240523_141155_1.mp4
- Code for the complete guide to tkinter tutorial
- 关于百货中心供应链管理系统.zip
- SimpleFolderIcon-master 修改Unity的Project下的文件夹图标
- A python Tkinter widget to display tile based maps
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功