当前位置: 首页 > news >正文

opengl 三角形

最后效果:
在这里插入图片描述
OpenGL version: 4.1 Metal
不知道为啥必须使用VAO 才行。

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>
#include <vector>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;const char *vertexShaderSource = R"(#version 100attribute vec2 a_position;void main() {gl_Position = vec4(a_position, 0.0, 1.0);}
)";const char *fragmentShaderSource = R"(#version 100precision mediump float;void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);  // Red color}
)";GLuint compileShader(GLenum type, const char *source)
{GLuint shader = glCreateShader(type);glShaderSource(shader, 1, &source, nullptr);glCompileShader(shader);GLint compiled;glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);if (!compiled){GLint infoLen;glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);std::vector<char> infoLog(infoLen);glGetShaderInfoLog(shader, infoLen, nullptr, infoLog.data());std::cerr << "Error compiling shader: " << infoLog.data() << std::endl;glDeleteShader(shader);return 0;}return shader;
}GLuint createProgram(const char *vertexSource, const char *fragmentSource)
{GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexSource);GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentSource);GLuint program = glCreateProgram();glAttachShader(program, vertexShader);glAttachShader(program, fragmentShader);glLinkProgram(program);GLint linked;glGetProgramiv(program, GL_LINK_STATUS, &linked);if (!linked){GLint infoLen;glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);std::vector<char> infoLog(infoLen);glGetProgramInfoLog(program, infoLen, nullptr, infoLog.data());std::cerr << "Error linking program: " << infoLog.data() << std::endl;glDeleteProgram(program);return 0;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);return program;
}int main()
{// glfw: initialize and configureglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);#ifdef __APPLE__glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif// glfw window creationGLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);GLuint program = createProgram(vertexShaderSource, fragmentShaderSource);glUseProgram(program);if (glGetError() != GL_NO_ERROR){std::cerr << "Error in glUseProgram." << std::endl;}// Define vertex dataGLfloat vertices[] = {0.0f, 0.5f,   // Vertex 1-0.5f, -0.5f, // Vertex 20.5f, -0.5f   // Vertex 3};// 创建 VAO 并绑定GLuint vao;glGenVertexArrays(1, &vao);glBindVertexArray(vao);// Create and bind vertex buffer (VBO)GLuint vbo;glGenBuffers(1, &vbo);GLenum error = glGetError();if (error != GL_NO_ERROR){std::cerr << "Error during drawing 1: " << error << std::endl;}glBindBuffer(GL_ARRAY_BUFFER, vbo);error = glGetError();if (error != GL_NO_ERROR){std::cerr << "Error during drawing 2: " << error << std::endl;}glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);error = glGetError();if (error != GL_NO_ERROR){std::cerr << "Error during drawing 3: " << error << std::endl;}// Get the location of the attributeGLint aPositionLocation = glGetAttribLocation(program, "a_position");if (aPositionLocation == -1){std::cerr << "Error: Attribute 'a_position' not found in shader." << std::endl;return -1;}glVertexAttribPointer(aPositionLocation, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid *)0);glEnableVertexAttribArray(aPositionLocation);GLenum err = glGetError();if (err != GL_NO_ERROR){std::cerr << "OpenGL error: " << err << std::endl;}glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// Get OpenGL versionconst char *version = (const char *)glGetString(GL_VERSION);std::cout << "OpenGL version: " << version << std::endl;while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT);glBindBuffer(GL_ARRAY_BUFFER, vbo);GLenum drawError = glGetError();glBindVertexArray(vao);glUseProgram(program);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}// CleanupglDeleteBuffers(1, &vbo);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);
}
http://www.lryc.cn/news/495392.html

相关文章:

  • 23种设计模式-抽象工厂(Abstract Factory)设计模式
  • 手机上怎么拍证件照,操作简单且尺寸颜色标准的方法
  • IDEA报错: java: JPS incremental annotation processing is disabled 解决
  • OCR实现微信截图改名
  • 第一届“吾杯”网络安全技能大赛 Writeup
  • 再谈Java中的String类型是否相同的判断方法
  • <一>51单片机环境
  • 【0x0001】HCI_Set_Event_Mask详解
  • 第三方Express 路由和路由中间件
  • 七、Python —— 元组、集合和字典
  • Aes加解密
  • 【时时三省】Tessy 故障入侵 使用教程
  • .NET 9 AOT的突破 - 支持老旧Win7与XP环境
  • CondaValueError: Malformed version string ‘~‘: invalid character(s).
  • 01-Ubuntu24.04LTS上安装PGSQL
  • Esp32使用micropython基于espnow实现语音对讲机
  • Docker 容器隔离关键技术:SELinux
  • Java并发07之ThreadLocal
  • 【单细胞数据库】癌症单细胞数据库CancerSEA
  • Rsa加解密 + 签名验签
  • bugku-web-留言板1
  • 进程状态的学习
  • Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)
  • close and shutdown?
  • PostgreSQL + hasura + Apollo + GraphQL + React + Antd
  • Android笔记【10】
  • Leetcode打卡:N皇后
  • Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体
  • [Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)
  • 【ETCD】etcd简单入门之单节点部署etcd