在上一篇 OpenGL 顶点着色器和片段着色器的介绍实现中,我们向进一步绘制三角形,事实上只需要修改 一下两处即可
修改顶点着色器
// 顶点着色器const char* vertexShaderSource = R"( #version 460 corevoid main(){// 顶点坐标vec4 vertices[3] = vec4[3](vec4(0.0, 0.5, 0.0, 1.0),vec4(-0.5, -0.5, 0.0, 1.0),vec4(0.5, -0.5, 0.0, 1.0));gl_Position = vertices[gl_VertexID];})";
在顶点着色器中定义了三角形的顶点数组。
其次修改, glDrawArrays(GL_TRIANGLES, 0, 3);
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>using namespace std;const int numVAOs = 1;
GLuint renderingProgram;
GLuint VAO[numVAOs];// 创建着色器程序
GLuint createShaderProgram()
{// 顶点着色器const char* vertexShaderSource = R"( #version 460 corevoid main(){// 顶点坐标vec4 vertices[3] = vec4[3](vec4(0.0, 0.5, 0.0, 1.0),vec4(-0.5, -0.5, 0.0, 1.0),vec4(0.5, -0.5, 0.0, 1.0));gl_Position = vertices[gl_VertexID];})";// 片段着色器const char* fragmentShaderSource = R"( #version 460 coreout vec4 color;void main(){color = vec4(0.0, 0.0, 1.0, 1.0);})";// 创建顶点着色器和片段着色器GLuint vShader = glCreateShader(GL_VERTEX_SHADER);GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);// 将着色器代码附加到着色器对象上glShaderSource(vShader, 1, &vertexShaderSource, NULL);glShaderSource(fShader, 1, &fragmentShaderSource, NULL);// 编译着色器glCompileShader(vShader);glCompileShader(fShader);// 创建着色器程序GLuint shaderProgram = glCreateProgram();// 将着色器附加到程序上glAttachShader(shaderProgram, vShader);glAttachShader(shaderProgram, fShader);// 链接程序glLinkProgram(shaderProgram);return shaderProgram;
}// 初始化函数
void init(GLFWwindow* window)
{renderingProgram = createShaderProgram();glGenVertexArrays(numVAOs, VAO);glBindVertexArray(VAO[0]);
}// 渲染函数
void display(GLFWwindow* window, double currentTime)
{// 清除颜色缓冲区glClear(GL_COLOR_BUFFER_BIT);// 使用着色器程序glUseProgram(renderingProgram);// 设置点的大小//glPointSize(30.0f);// 绘制点glDrawArrays(GL_TRIANGLES, 0, 3);// 交换缓冲区glfwSwapBuffers(window);
}// 主函数
int main()
{if (!glfwInit()) { exit(EXIT_FAILURE); }glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);// 创建 GLFW 窗口GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter2 - 2.2", nullptr, nullptr);glfwMakeContextCurrent(window);if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }glfwSwapInterval(1);// 初始化 OpenGLinit(window);// 渲染循环while (!glfwWindowShouldClose(window)) {display(window, glfwGetTime());glfwPollEvents();}// 销毁窗口glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);return 0;
}```