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

35互联做网站垃圾新闻稿范文

35互联做网站垃圾,新闻稿范文,中学生免费作文网站,ui设计是什么类必读 Hello Triangle:了解整体的渲染流程以及相关概念 概念 顶点数组对象:Vertex Array Object,VAO顶点缓冲对象:Vertex Buffer Object,VBO元素缓冲对象:Element Buffer Object,EBO 或 索引缓…

必读

Hello Triangle:了解整体的渲染流程以及相关概念

概念

  • 顶点数组对象:Vertex Array Object,VAO
  • 顶点缓冲对象:Vertex Buffer Object,VBO
  • 元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO

测试代码

修改cmake支持多个程序,方便调试

cmake_minimum_required(VERSION 3.24)
project(MultiGL)set(CMAKE_CXX_STANDARD 14)include_directories(include)# 查找GLFW库
find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)# include_directories和add_executable可以二选一
add_executable(OGLTestsrc/part1/main.cpp src/glad.c)
target_link_libraries(OGLTest ${GLFW_LIBRARIES})add_executable(HelloTrianglesrc/part2/hellotriangle.cpp src/glad.c)
target_link_libraries(HelloTriangle ${GLFW_LIBRARIES})add_executable(HelloTriangleIndexedsrc/part2/hellotriangleindex.cpp src/glad.c)
target_link_libraries(HelloTriangleIndexed ${GLFW_LIBRARIES})

程序1:绘制一个三角形

  1. 自定义定点着色器vertex shader
  2. 自定义片段着色器fragment shader
  3. 创建shader program并链接shaders
  4. 设置VBO和VAO
  5. 绑定VBO到VAO
  6. 设置vertex Attributes
  7. 实际绘图
//
// Created by aft on 2025/5/12.
//
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;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";// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// make sure the viewport matches the new window dimensions; note that width and// height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height);
}void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}int main() {// 初始化GLFW库glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建windowGLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloTriangle", NULL, NULL);if (window == nullptr) {std::cout << "Failed to create window" << std::endl;glfwTerminate();return -1;}// 将window的context绑定到当前线程(必须)glfwMakeContextCurrent(window);// 设置窗口变化时的回调glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// 初始化OGL函数指针表,将所有OGL的函数地址加载到GLAD的内部结构中if (!gladLoadGLLoader(reinterpret_cast<GLADloadproc>(glfwGetProcAddress))) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// --------------重点-------------// 构建和编译我们的shader着色器// ----------------------------------------// 定点着色器 vertex shaderunsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);int success{0};char infoLog[512];// 检查vertexShader是否编译成功glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 片段着色器 fragment shaderunsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// 检查fragmentShader是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 链接shadersunsigned int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 检查program是否链接成功glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}// 链接成功后就能删除原来的shader对象了,因为已经拷贝到program里面去了,想象一下代码编译后,源代码可以删除了glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据和设置定点属性// ---------------------------float vertices[] = {-0.5f, -0.5f, 0.0f, // left0.5f, -0.5f, 0.0f, // right0.0f,  0.5f, 0.0f  // top};unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// 先绑定Vertex Array Object,再绑定和设置Vertex Buffer(s),然后再配置Vertex AttributesglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);// 开启读取索引为0的VAO的数据glEnableVertexAttribArray(0);// 解除VBO和VAO的绑定glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)) {processInput(window);// 清理画面颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制第一个三角形glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);// 交换数据glfwSwapBuffers(window);glfwPollEvents();}// 资源回收glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);glfwTerminate();return 0;
}

程序2:绘制一个矩形

可以按照程序1的方式连续绘制两个三角形,但是比较繁琐
使用元素缓冲对象(Element Buffer Object,EBO),通过索引绘制的方式减少浪费
与程序1的差别主要体现在使用了4个顶点,然后通过索引的方式绘制

//
// Created by aft on 2025/5/12.
//
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;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";// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// make sure the viewport matches the new window dimensions; note that width and// height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height);
}void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}int main() {// 初始化GLFW库glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建windowGLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloTriangle", NULL, NULL);if (window == nullptr) {std::cout << "Failed to create window" << std::endl;glfwTerminate();return -1;}// 将window的context绑定到当前线程(必须)glfwMakeContextCurrent(window);// 设置窗口变化时的回调glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// 初始化OGL函数指针表,将所有OGL的函数地址加载到GLAD的内部结构中if (!gladLoadGLLoader(reinterpret_cast<GLADloadproc>(glfwGetProcAddress))) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// --------------重点-------------// 构建和编译我们的shader着色器// ----------------------------------------// 定点着色器 vertex shaderunsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);int success{0};char infoLog[512];// 检查vertexShader是否编译成功glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 片段着色器 fragment shaderunsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// 检查fragmentShader是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 链接shadersunsigned int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 检查program是否链接成功glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}// 链接成功后就能删除原来的shader对象了,因为已经拷贝到program里面去了,想象一下代码编译后,源代码可以删除了glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据和设置定点属性  增加元素缓冲对象Element Buffer Object EBO// ---------------------------float vertices[] = {0.5f,  0.5f, 0.0f,  // top right0.5f, -0.5f, 0.0f,  // bottom right-0.5f, -0.5f, 0.0f,  // bottom left-0.5f,  0.5f, 0.0f   // top left};unsigned int indices[] = {0, 1, 3,  // first Triangle1, 2, 3   // second Triangle};unsigned int VBO, VAO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);// 先绑定Vertex Array Object,再绑定和设置Vertex Buffer(s),然后再配置Vertex AttributesglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 绑定EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);// 开启读取索引为0的VAO的数据glEnableVertexAttribArray(0);// 解除VBO和VAO的绑定glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)) {processInput(window);// 清理画面颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制第一个三角形glUseProgram(shaderProgram);glBindVertexArray(VAO);
//        glDrawArrays(GL_TRIANGLES, 0, 3);// 替换成下面函数进行绘图glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);// 交换数据glfwSwapBuffers(window);glfwPollEvents();}// 资源回收glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);glfwTerminate();return 0;
}
http://www.dtcms.com/wzjs/343000.html

相关文章:

  • 新乡网站建设哪家公司好百度网盘网址是多少
  • 网站主机是服务器吗北京官网优化公司
  • 长春专业网站建设价格seo优化推荐
  • wordpress怎么配置七牛cdn加速seo优
  • wordpress 分类 权限seo薪酬水平
  • 网站开发所需要的书籍苏州网站建设书生
  • 网站建设存在的困难百度云群组
  • 连云港网站建设费用核心关键词举例
  • 旅游景区网站建设的意义电脑零基础培训学校
  • 电子商务网站建设与运营免费引流推广怎么做
  • 网站开发面试都会问什么问题深圳seo优化服务
  • wordpress 隐藏顶部深圳排名seo公司
  • 贵阳做网站哪家好关键词云图
  • 衡水市网站建设凡科建站模板
  • 近期国际军事形势seo云优化外包
  • 网站建设行业资讯襄阳网站seo
  • 如何做网上水果网站系统网站seo优化
  • 可以做问卷挣钱的网站域名交易域名出售
  • 烟台的网站建设网站秒收录
  • 梧州做网站的公司广州疫情已经达峰
  • 网站源码怎么写北京优化靠谱的公司
  • 泰州北京网站建设广点通推广登录入口
  • 中国制造网建站承德seo
  • 重庆网站建设leco tecseo顾问赚钱吗
  • 怎么查询公司名字是否被注册seol英文啥意思
  • 怎样学做企业网站百度有效点击软件
  • 动态网站建设论文宁波seo怎么做优化
  • wordpress 隐藏路径seo运营是什么意思
  • 网站设计如何做吉林seo关键词
  • 长沙市模板网站seo知识是什么意思