1 首先qt 已经封装了opengl,那么我们就可以直接用了,这里面有三个函数需要继承
virtual void initializeGL() override;
virtual void resizeGL(int w,int h) override;
virtual void paintGL() override;
这三个函数是实现opengl的重要函数。
2 我们需要写GLSL语句
static const char *vertexShaderSource =
"#version 330\n"
"layout (location = 0) in vec3 aPos;\n" // 位置变量的属性位置值为0
"layout (location = 1) in vec3 aColor;\n" // 颜色变量的属性位置值为1
"layout (location = 2) in vec2 aTexCoord;\n" //纹理变量的属性位置值为2
"out vec3 ourColor;\n" // 为片段着色器指定一个颜色输出
"out vec2 TexCoord;\n" // 为片段着色器指定一个纹理输出
"void main(){\n"
"gl_Position = vec4(aPos, 1.0);\n" //顶点信息为4个值向量 // 注意我们如何把一个vec3作为vec4的构造器的参数
"ourColor = aColor;\n" // 输出颜色变量==输入颜色
"TexCoord = aTexCoord;\n" // 输出纹理变量==输入纹理
"}\n";
static const char *fragmentShaderSource =
"#version 330\n"
"out vec4 FragColor;\n" //输出颜色
"in vec3 ourColor;\n" //输入的颜色== vertexShaderSource(这里面的输入颜色)
"in vec2 TexCoord;\n" //输入的纹理== vertexShaderSource(这里面的输入纹理)
"uniform sampler2D texture1;\n" //得到输入的纹理
"void main()"
"{\n"
"FragColor = texture(texture1, TexCoord);\n"
"}\n";
上面的语句不懂的可以查询,或者私信问我。
3 我们设置点顶点,颜色和纹理
float vertices[] = {
// 位置 // 颜色 //纹理
// positions // colors // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left
};
这里面位置颜色是什么意思呢,举例
图1
第一行位置: 0.5f, 0.5f, 0.0f 这是以窗口中心为0,0点,所绘制的图形在紫色位置,-x ==-1, x ==1, -y ==-1, y==1。点在一半的位置
第一行颜色:1.0f, 0.0f, 0.0f ,意思是RGB,只显示红色。
第一行纹理:1.0f, 1.0f 是什么意思呢,看下面图说明
图2
图3
第一个图是位置,第二个是纹理,纹