QT+OpenGL使用一组顶点绘制两个三角形
QT+OpenGL基础:
- QT+OpenGL创建一个三角形并动态改变三角形颜色
- OpenGL中的VAO、VBO、EBO
- QT+OpenGL 使用VAO、VBO、EBO结合绘制一个正方形
- QT+OpenGL使用一组顶点绘制两个三角形
- QT+OpenGL通过两个VAO来管理两个三角形
- QT+Opengl使用两个Shader绘制两个不同颜色的三角形
- QT+OpenGL从顶点着色器传递颜色数据给片元着色器
- QT+OpenGL简单纹理贴图
- QT+OpenGL纹理与颜色混合
- Qt+OpenGL混合两个纹理,并可以改变纹理透明度
一、概述
需求:使用一组顶点坐标绘制两个三角形。
ps:此需求和绘制一个三角形并没有什么不同,只是把顶点坐标由三个改成了6个。依次类推,如果想要绘制多边形或者更多的三角形,只需要定义不同的顶点就行了。
效果:
二、代码示例
1.定义顶点
float vertices[18] = { // first triangle -0.9f, -0.5f, 0.0f, // left -0.0f, -0.5f, 0.0f, // right -0.45f, 0.5f, 0.0f, // top // second triangle 0.0f, -0.5f, 0.0f, // left 0.9f, -0.5f, 0.0f, // right 0.45f, 0.5f, 0.0f // top };
2.定义shader 字符串
const char* vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\0"; const char* fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";
3.创建、编译、链接shader
void GLTwoTriangleWindow::createAndLinkProgram(GLenum vertexShaderType, QString vertexResPath, GLenum fragmentShaderType, QString fragmentResPath) { //编译顶点着色器和片元着色器 GLuint vertexShader = getShaderId(GL_VERTEX_SHADER, vertexResPath); GLuint fragmentShader = getShaderId(GL_FRAGMENT_SHADER, fragmentResPath); programId = glCreateProgram(); glAttachShader(programId, vertexShader); glAttachShader(programId, fragmentShader); glLinkProgram(programId); int success; char infoLog[512]; glGetProgramiv(programId, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(programId, 512, NULL, infoLog); qDebug() << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); } GLuint GLTwoTriangleWindow::getShaderId(GLenum shaderType, QString resPath) { //创建顶点着色器 unsigned int shaderId = glCreateShader(shaderType); QFile vertexShaderFile(resPath); if (!vertexShaderFile.open(QIODevice::ReadOnly)) { qDebug() << "Cannot open vertex shader file for reading"; } QString verQStr = vertexShaderFile.readAll(); std::string verStdStr = verQStr.toStdString(); const char* vertexStr = verStdStr.c_str(); qDebug() << "vertexStr-------------" << vertexStr; vertexShaderFile.close(); glShaderSource(shaderId, 1, &vertexStr, NULL); glCompileShader(shaderId); int success; char infoLog[512]; glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(shaderId, 512, NULL, infoLog); qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog; } return shaderId; }
4.创建VAO、VBO,并让VBO绑定VAO。然后将顶点数据一次性copy到gpu
//创建顶点数组对象VAO用来管理VBO glGenVertexArrays(1, &VAO); //创建顶点缓冲对象 glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); //将顶点数据放入VBO中 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
5.告知显卡如何解析顶点数据
//告知显卡应该如何解析顶点 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0);
6.开始绘制两个三角形
glUseProgram(programId); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0,6);//因为是两个三角形,所以这里是6个顶点。如果不想计算具体的值,拿着顶点数组除以3也可以
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2023-08-22 ARouter源码再分析
2013-08-22 Android调用系统的发邮件功能
2013-08-22 Android向手机通讯录中的所有的联系人(包括SIM卡),向手机通讯录中插入联系人