一、概述
需求:使用一组顶点坐标绘制两个三角形。
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也可以
标签:QT,OpenGL,0.0,0.5,programId,顶点,GL,VAO From: https://www.cnblogs.com/tony-yang-flutter/p/18373995