This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
justhomework/OpenGL/lab1/src/main.cpp

112 lines
2.8 KiB
C++

#include "glad/glad.h"
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main(int argc, char **argv) {
// 设置 glfw
glfwInit();
// 设置 OpenGL 版本为 3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// 设置 OpenGL 管线为兼容模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
// 创建窗口
GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 加载glad
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 设置视口
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 循环渲染
while (!glfwWindowShouldClose(window)) {
// 处理输入
processInput(window);
// 设置为白色
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//使用线框模式绘制
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// 设置线宽
glLineWidth(3.0f);
// 设置为 Gouraud 着色模式
glShadeModel(GL_SMOOTH);
// 绘制三角形
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex2f(-0.4f, -0.4f);
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex2f(0.4f, -0.4f);
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex2f(-0.4f, 0.4f);
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex2f(0.4f, -0.4f);
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex2f(-0.4f, 0.4f);
glColor3f(0.0f, 0.0f, 0.0f); // 黑色
glVertex2f(0.4f, 0.4f);
glEnd();
//使用面模式
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
// 设置为 FLAT 着色模式
glShadeModel(GL_FLAT);
glNewList(1, GL_COMPILE);
glBegin(GL_TRIANGLE_FAN);
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex2f(0.5f, 0.5f);
glVertex2f(0.5f, 0.7f);
glVertex2f(0.7f, 0.5f);
glVertex2f(0.5f, 0.7f);
glVertex2f(0.7f, 0.5f);
glVertex2f(0.7f, 0.7f);
glEnd();
glEndList();
glCallList(1);
// 检查并调用事件,交换缓冲
glfwSwapBuffers(window);
glfwPollEvents();
}
// 释放资源
glfwTerminate();
return 0;
}
// 处理输入
void processInput(GLFWwindow *window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// 窗口大小改变时回调该函数
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
glViewport(0, 0, width, height);
}