网站建设验收合同微信小程序登录入口在哪
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:42
当前位置: 首页 > news >正文
网站建设验收合同,微信小程序登录入口在哪,网站建设与管理大作业总结,电脑系统优化软件前面两节已经学会了如何使用opengl创建窗口并绘制三角形#xff0c;我们可以看出有些步骤是固定的#xff0c;而且都写在main.cpp#xff0c;这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中#xff0c;简化开发流程#xff0c;且提高代码复…前面两节已经学会了如何使用opengl创建窗口并绘制三角形我们可以看出有些步骤是固定的而且都写在main.cpp这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中简化开发流程且提高代码复用性。 文章目录 一些概念Factory设计模式 实战简介utilswindowFactory.hTriangleModel.hTriangleMode.cpp main.cppCMakeLists.txt最终效果 一些概念 Factory设计模式 概述 提供了一种将对象的实例化过程封装起来的方式 使得客户端可以通过调用Factroy类的方法来创建对象。 作用 封装对象的创建过程将对象的实例化过程封装在Factory类中客户端可以通过调用工厂类的方法来创建对象而无需知道对象的具体实现细节隐藏对象的创建逻辑从而实现对象的创建逻辑和客户端代码的分离提高代码的可维护性和可扩展性以及复用性 实战 简介 怎么在vscode上使用cmake构建项目具体可以看这篇Windows上如何使用CMake构建项目 - 凌云行者的博客 目的 使用Factory设计模式绘制一个三角形 环境 编译工具链使用msys2安装的mingw-gcc依赖项glfw3:x64-mingw-staticglad:x64-mingw-static通过vcpkg安装 utils 创建utils目录将windowFactory.hTriangleModel.hTriangleMode.cpp文件放到这个目录下面 windowFactory.h 作用 实现创建窗口对象的Factory类 #pragma once #include glad/glad.h // gald前面不能包含任何opengl头文件 #include GLFW/glfw3.h #include functional #include iostreamusing std::cout; using std::endl;class GLFWWindowFactory { public:// 默认构造函数GLFWWindowFactory() {}// 构造函数初始化窗口GLFWWindowFactory(int width, int height, const char* title) {// 初始化glfwglfwInit();// 设置opengl版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 使用核心模式确保不使用任何被弃用的功能glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建glfw窗口this-window glfwCreateWindow(width, height, title, NULL, NULL);if (this-window NULL) {cout Failed to create GLFW window endl;glfwTerminate();exit(-1);}// 设置当前窗口的上下文glfwMakeContextCurrent(this-window);// 设置窗口大小改变的回调函数glfwSetFramebufferSizeCallback(this-window, framebuffer_size_callback);// 加载所有opengl函数指针if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {cout Failed to initialize GLAD endl;}// 再次设置当前窗口的上下文确保当前上下文仍然是刚刚创建的窗口是一个安全措施glfwMakeContextCurrent(this-window);// 设置窗口大小改变的回调函数glfwSetFramebufferSizeCallback(this-window, framebuffer_size_callback);}// 获取窗口对象GLFWwindow* getWindow() {return this-window;}// 运行窗口传入一个自定义的更新函数void run(std::functionvoid() updateFunc) {// 启用深度测试opengl将在绘制每个像素之前比较其深度值以确定该像素是否应该被绘制glEnable(GL_DEPTH_TEST);// 循环渲染while (!glfwWindowShouldClose(this-window)) { // 检查是否应该关闭窗口// 清空屏幕所用的颜色glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 清空颜色缓冲主要目的是为每一帧的渲染准备一个干净的画布glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 处理输入GLFWWindowFactory::process_input(this-window);// 执行更新函数updateFunc();// 交换缓冲区glfwSwapBuffers(this-window);// 处理所有待处理事件去poll所有事件看看哪个没处理的glfwPollEvents();}// 终止GLFW清理GLFW分配的资源glfwTerminate();}// 窗口大小改变的回调函数static void framebuffer_size_callback(GLFWwindow* window, int width, int height) {// 确保视口与新窗口尺寸匹配注意在视网膜显示器上宽度和高度会显著大于指定值glViewport(0, 0, width, height);}// 处理输入static void process_input(GLFWwindow* window) {// 按下ESC键时进入if块if (glfwGetKey(window, GLFW_KEY_ESCAPE) GLFW_PRESS)// 关闭窗口glfwSetWindowShouldClose(window, true);}private:// 窗口对象GLFWwindow* window; };TriangleModel.h 作用 三角模型的头文件 #include glad/glad.hclass TriangleModel { public: // 默认构造函数TriangleModel();// 默认析构函数~TriangleModel();// 绘制三角形void draw();private:unsigned int VAO;unsigned int VBO;// 着色器程序unsigned int shaderProgram;// 编译着色器void compileShaders();// 设置缓冲区void setupBuffers(); };TriangleMode.cpp 作用 三角形模型的具体实现 #include TriangleModel.h #include iostreamusing std::cout; using std::endl;// 顶点属性位置 const int VERTEX_ATTR_POSITION 0; // 每个顶点的组件数 const int NUM_COMPONENTS_PER_VERTEX 3;// 默认构造函数 TriangleModel::TriangleModel() {// 编译着色器compileShaders();// 设置缓冲区setupBuffers(); }// 析构函数 TriangleModel::~TriangleModel() {// 删除VAOglDeleteVertexArrays(1, this-VAO);// 删除VBOglDeleteBuffers(1, this-VBO); }/// public // 绘制三角形 void TriangleModel::draw() {// 使用着色器程序glUseProgram(this-shaderProgram);// 绑定VAOglBindVertexArray(this-VAO);// 绘制三角形glDrawArrays(GL_TRIANGLES, 0, 3); }/// private // 编译着色器 void TriangleModel::compileShaders() {// 顶点着色器源码const char* vertexShaderSource #version 330 core\n // 指定了GLSLOpenGL着色器语言的版本layout (location 0) in vec3 aPos;\n // 定义了一个输入变量aPos它是一个vec3类型的变量, 并且指定了它的位置值为0, 这意味着顶点属性数组的第一个属性将被绑定到这个变量void main()\n{\n gl_Position vec4(aPos.x, aPos.y, aPos.z, 1.0);\n // 将输入的顶点位置aPos转换为一个四维向量gl_Postion是OpengGL固定功能管线中用于存储顶点位置的变量}\0;// 片段着色器源码const char* fragmentShaderSource #version 330 core\n // 指定了GLSLOpenGL着色器语言的版本out vec4 FragColor;\n // 定义了一个输出变量FragColor它是一个vec4类型的变量表示片段颜色out关键字表示这个变量将输出到渲染管线的下一个阶段void main()\n{\n FragColor vec4(1.0f, 0.5f, 0.2f, 1.0f);\n // 将输出颜色设置为橙色}\n\0;// 构建并编译顶点着色程序// 创建一个着色器对象GL_VERTEX_SHADER表示顶点着色器unsigned int vertexShader glCreateShader(GL_VERTEX_SHADER);// 将着色器源码附加到着色器对象上glShaderSource(vertexShader, 1, vertexShaderSource, NULL);// 编译着色器glCompileShader(vertexShader);// 检查着色器是否编译成功int success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, success);if (!success) {glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);cout ERROR::SHADER::VERTEX::COMPILATION_FAILED\n infoLog endl;}// 构建并编译片段着色器// 创建一个着色器对象GL_FRAGMENT_SHADER表示片段着色器unsigned int fragmentShader glCreateShader(GL_FRAGMENT_SHADER);// 将着色器源码附加到着色器对象上glShaderSource(fragmentShader, 1, fragmentShaderSource, NULL);// 编译着色器glCompileShader(fragmentShader);// 检查着色器是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, success);if (!success) {glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);cout ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n infoLog endl;}// 创建着色器程序对象this-shaderProgram glCreateProgram();// 将着色器对象附加到着色器程序上glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);// 链接程序对象glLinkProgram(shaderProgram);// 检查链接是否成功glGetProgramiv(shaderProgram, GL_LINK_STATUS, success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);cout ERROR::SHADER::PROGRAM::LINKING_FAILED\n infoLog endl;}// 删除着色器对象glDeleteShader(vertexShader);glDeleteShader(fragmentShader); }// 设置缓冲区 void TriangleModel::setupBuffers() {// 顶点数据float vertices[] {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f,1.0f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.25f, 0.0f, 0.0f};// 生成一个VAOglGenVertexArrays(1, this-VAO);// 绑定VAO使其成为当前操作的VAOglBindVertexArray(this-VAO);// 生成一个VBOglGenBuffers(1, this-VBO);// 绑定VBO, 使其成为当前操作的VBOGL_ARRAY_BUFFER表示顶点缓冲区glBindBuffer(GL_ARRAY_BUFFER, this-VBO);// 为当前绑定的VBO创建并初始化数据存储GL_STATIC_DRAW表示数据将一次性提供给缓冲区并且在之后的绘制过程中不会频繁更改glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 定义顶点属性的布局// - index顶点属性的索引// - size每个顶点属性的数量每个顶点有三个分享// - type数据类型// - normalized是否将非浮点数值归一化// - stride连续顶点属性之间的间隔// - pointer数据在缓冲区中的偏移量glVertexAttribPointer(VERTEX_ATTR_POSITION, NUM_COMPONENTS_PER_VERTEX, GL_FLOAT, GL_FALSE, NUM_COMPONENTS_PER_VERTEX * sizeof(float), (void*)0);// 启用顶点属性数组glEnableVertexAttribArray(VERTEX_ATTR_POSITION); }main.cpp #include utils/TriangleModel.h #include utils/windowFactory.hint main() {// 创建一个窗口Factory对象GLFWWindowFactory myWindow(800, 600, This is Title);// 创建一个三角形模型对象TriangleModel triangle;// 运行窗口传入一个lambda表达式用于自定义渲染逻辑myWindow.run( {// 绘制三角形triangle.draw();});return 0; }CMakeLists.txt
设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)
设置项目名称
project(HelloFactory)# vcpkg集成, 这里要换成你自己的vcpkg工具链文件和共享库路径 set(VCPKG_ROOT D:/software6/vcpkg/) set(CMAKE_TOOLCHAIN_FILE \({VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake) set(CMAKE_PREFIX_PATH \){VCPKG_ROOT}/installed/x64-mingw-static/share)# 查找所需的包 find_package(glad CONFIG REQUIRED) find_package(glfw3 CONFIG REQUIRED)# 搜索并收集utils文件夹下的所有源文件 file(GLOB UTILS utils/.cpp, utils/.h)# 添加可执行文件还要加入utils文件夹下的源文件 add_executable(HelloFactory main.cpp ${UTILS})# 链接所需的库 target_link_libraries(HelloFactory PRIVATE glad::glad glfw)最终效果
- 上一篇: 网站建设验收方式免费素材库网站
- 下一篇: 网站建设验收内容seo搜索引擎优化排名
相关文章
-
网站建设验收方式免费素材库网站
网站建设验收方式免费素材库网站
- 技术栈
- 2026年04月20日
-
网站建设颜色seo推广网站
网站建设颜色seo推广网站
- 技术栈
- 2026年04月20日
-
网站建设研究背景如何介绍自己的网页
网站建设研究背景如何介绍自己的网页
- 技术栈
- 2026年04月20日
-
网站建设验收内容seo搜索引擎优化排名
网站建设验收内容seo搜索引擎优化排名
- 技术栈
- 2026年04月20日
-
网站建设要不要工商注册互站网源码商城
网站建设要不要工商注册互站网源码商城
- 技术栈
- 2026年04月20日
-
网站建设要会英语吗江西宜春市城市建设档案馆网站
网站建设要会英语吗江西宜春市城市建设档案馆网站
- 技术栈
- 2026年04月20日
