OpenGL入门第一步:创建窗口、重写虚函数_makecurrent paintgl-优快云博客
OpenGL入门第四步:摄像机视角变换与交互_opengl相机交互-优快云博客
目录
效果展示
边框的金属感
光照贴图介绍
很像在之前的纹理。我们仅仅是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)(在PBR之前3D艺术家通常都这么叫它),它是一个表现了物体所有的漫反射颜色的纹理图像。在着色器中使用漫反射贴图的方法和纹理教程中是完全一样的。但这次我们会将纹理储存为Material结构体中的一个sampler2D。我们将之前定义的vec3漫反射颜色向量替换为漫反射贴图。
注意
sampler2D是所谓的不透明类型(Opaque Type),也就是说我们不能将它实例化,只能通过uniform来定义它。如果我们使用除uniform以外的方法(比如函数的参数)实例化这个结构体,GLSL会抛出一些奇怪的错误。这同样也适用于任何封装了不透明类型的结构体。
我们也移除了环境光材质颜色向量,因为环境光颜色在几乎所有情况下都等于漫反射颜色,所以我们不需要将它们分开储存。
贴图图片
函数解析
~openGLWidget():
timerEvent(QTimerEvent *event):
initializeGL():
paintGL()函数:
具体代码
.h
#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLTexture>
#include <QElapsedTimer>
#include "Camera.h"
QT_BEGIN_NAMESPACE
namespace Ui { class openGLWidget; }
QT_END_NAMESPACE
class openGLWidget : public QOpenGLWidget
{
Q_OBJECT
public:
openGLWidget(QWidget *parent = nullptr);
~openGLWidget();
protected:
virtual void timerEvent(QTimerEvent *event) override;
//鼠标事件
virtual void enterEvent(QEnterEvent *event) override;
virtual void leaveEvent(QEvent *event) override;
virtual void mouseMoveEvent(QMouseEvent *event) override;
virtual void wheelEvent(QWheelEvent *event) override;
virtual void keyPressEvent(QKeyEvent *event) override;
virtual void keyReleaseEvent(QKeyEvent *event) override;
//初始化
virtual void initializeGL() override;
virtual void resizeGL(int w, int h) override;
virtual void paintGL() override;
private:
QOpenGLShaderProgram lightingShader;
QOpenGLShaderProgram lightCubeShader;
QOpenGLBuffer vbo;
QOpenGLVertexArrayObject cubeVao;
QOpenGLVertexArrayObject lightVao;
QMatrix4x4 projection;
QMatrix4x4 view;
Camera camera {
Camera(QVector3D(0.0f, 0.0f, 3.0f))};
QVector3D lightPos {
QVector3D(1.2f, 1.0f, 2.0f)};
QElapsedTimer time;
QOpenGLTexture *diffuseMap;
QOpenGLTexture *specularMap;
struct {
bool W {
false};
bool S {
false};
bo

最低0.47元/天 解锁文章
738

被折叠的 条评论
为什么被折叠?



