1.顶点着色器,三个重要矩阵
#version 330 core
layout(location=1) in vec3 aPos;
layout(location=2) in vec2 aTextureCoord;
out vec2 texcoord;
uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 perspective;
void main()
{
gl_Position =perspective*view*model * vec4(aPos.x,aPos.y,aPos.z,1.0f);
texcoord = aTextureCoord;
};
V
c
l
i
p
=
M
p
r
o
j
e
c
t
i
o
n
∗
M
v
i
e
w
∗
M
m
o
d
e
l
∗
V
l
o
c
a
l
V _{clip} = M _{projection} * M _{view} * M _{model} *V _{local}
Vclip=Mprojection∗Mview∗Mmodel∗Vlocal
gl_Position =perspectiveviewmodel * vec4(aPos.x,aPos.y,aPos.z,1.0f);
2.在 CPU端设置三个重要矩阵
QMatrix4x4 matModel;
QMatrix4x4 matView;
QMatrix4x4 matPerspective;
matModel.rotate(-45,1.0f,0.0f,0.0f); //绕着x轴转-45度
matView.translate(0.f,0.f,-3.f); // 把视图点放下去
matPerspective.perspective(-45,width()*1.0/height(),0.1f,100.f); // 准备投影矩阵
program.setUniformValue("model",matModel);
program.setUniformValue("view",matView);
program.setUniformValue("perspective",matPerspective);
3 绘制立方体
- 坐标
float va = 1.0f;
float vertices[] = {
//坐标 texture coord
//正面
va,va,va, 1.0f,1.0f, //右上
va,-va,va, 1.0f,0.0f, //右下
-va,-va,va, 0.f, 0.f, //左下
-va,va,va, 0.f, 1.0f, //左上
//后面
va,va,-va, 1.0f,1.0f, //右上
va,-va,-va, 1.0f,0.0f, //右下
-va,-va,-va, 0.f, 0.f, //左下
-va,va,-va, 0.f, 1.0f, //左上
//右面
va,va,-va, 1.0f,1.0f, //后上
va,-va,-va, 1.0f,0.0f, //后下
va,-va,va, 0.f, 0.f, //前下
va,va,va, 0.f, 1.0f, //前上
//左面
-va,va,-va, 1.0f,1.0f,//后上
-va,-va,-va, 1.0f,0.0f, //后下
-va,-va,va, 0.f, 0.f, //前下
-va,va,va, 0.f, 1.0f, //前上
//上面
va,va,-va, 1.0f,1.0f, //右后
va,va,va, 1.0f,0.0f, //右前
-va,va,va, 0.f, 0.f, //左前
-va,va,-va, 0.f, 1.0f, //左后
//下面
va,-va,-va, 1.0f,1.0f, //右后
va,-va,va, 1.0f,0.0f, //右前
-va,-va,va, 0.f, 0.f, //左前
-va,-va,-va, 0.f, 1.0f //左后
};
unsigned int indices[]=
{
//前面 0 1 2 3
0,1,3,
1,2,3,
//后面 4 5 6 7
4,5,7,
5,6,7,
//右面 8 9 10 11
8,9,11,
9,10,11,
//左面 12 13 14 15
12,13,15,
13,14,15,
//上面 16 17 18 19
16,17,19,
17,18,19,
//下面 20 21 22 23
20,21,23,
21,22,23,
};
- VAO
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)0);
glVertexAttribPointer(2,2,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)(3*sizeof(float)));
3.绘制
glEnable(GL_DEPTH_TEST);
glClearColor(0.f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
textureWall->bind(0);
textureLe->bind(1);
textureSmall->bind(2);
program.bind();
program.setUniformValue("ourTexture1",0);
program.setUniformValue("ourTexture2",1);
program.setUniformValue("ourTexture3",2);
program.setUniformValue("model",matModel);
program.setUniformValue("view",matView);
program.setUniformValue("perspective",matPerspective);
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
glDrawElements(GL_TRIANGLES,sizeof(indices),GL_UNSIGNED_INT,0);
NDC标准设备坐标时左手坐标.
但是:投影矩阵交换了左右手, openGL是右手
4. view (相机) -换基底概念
- 换基底坐标系= 就是把别人放在以我为中心的坐标系
- 相机:
相机:下面红色手动绘制坐标系.
把世界坐标系 放在相机坐标系下z=-3的位置.
view = 换了个基底,换成了相机的坐标系
代码: matView.translate(0.f,0.f,-3.f); // 把视图点放下去