OpenGL笔记二十一之几何类设计

OpenGL笔记二十一之几何类设计

—— 2024-09-16 下午


bilibili赵新政老师的教程看后笔记

code review!

文章目录

  • OpenGL笔记二十一之几何类设计
    • 1.运行
      • 1.1.立方体运行
      • 1.2.球体运行
    • 2.几何类搭建
    • 1.立方体分析
    • 2.球体分析
    • 3.图片资源文件
    • 4.关键实现
      • 4.1.geometry.h
      • 4.2.geometry.cpp
      • 4.3.vertex.glsl
      • 4.4.fragment.glsl
      • 4.5.main.cpp

1.运行

1.1.立方体运行

在这里插入图片描述

1.2.球体运行

在这里插入图片描述

2.几何类搭建

在这里插入图片描述

在这里插入图片描述

1.立方体分析

在这里插入图片描述
将0.5替换成halfSize就可以了。

2.球体分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.图片资源文件

goku.jpg
在这里插入图片描述

earth.png
在这里插入图片描述

4.关键实现

4.1.geometry.h

在这里插入图片描述

代码

#pragma once#include "core.h"class Geometry {
public:Geometry();~Geometry();static Geometry* createBox(float size);static Geometry* createSphere(float radius);GLuint getVao()const { return mVao; }uint32_t getIndicesCount()const { return mIndicesCount; }private:GLuint mVao{ 0 };GLuint mPosVbo{ 0 };GLuint mUvVbo{ 0 };GLuint mEbo{ 0 };uint32_t mIndicesCount{ 0 };
};

4.2.geometry.cpp

在这里插入图片描述

代码

#include "geometry.h"
#include <vector>Geometry::Geometry() {}Geometry::~Geometry() {if (mVao != 0) {glDeleteVertexArrays(1, &mVao);}if (mPosVbo != 0) {glDeleteBuffers(1, &mPosVbo);}if (mUvVbo != 0) {glDeleteBuffers(1, &mUvVbo);}if (mEbo != 0) {glDeleteBuffers(1, &mEbo);}
}Geometry* Geometry::createBox(float size) {Geometry* geometry = new Geometry();geometry->mIndicesCount = 36;float halfSize = size / 2.0f;float positions[] = {// Front face-halfSize, -halfSize, halfSize, halfSize, -halfSize, halfSize, halfSize, halfSize, halfSize, -halfSize, halfSize, halfSize,// Back face-halfSize, -halfSize, -halfSize, -halfSize, halfSize, -halfSize, halfSize, halfSize, -halfSize, halfSize, -halfSize, -halfSize,// Top face-halfSize, halfSize, halfSize, halfSize, halfSize, halfSize, halfSize, halfSize, -halfSize, -halfSize, halfSize, -halfSize,// Bottom face-halfSize, -halfSize, -halfSize, halfSize, -halfSize, -halfSize, halfSize, -halfSize, halfSize, -halfSize, -halfSize, halfSize,// Right facehalfSize, -halfSize, halfSize, halfSize, -halfSize, -halfSize, halfSize, halfSize, -halfSize, halfSize, halfSize, halfSize,// Left face-halfSize, -halfSize, -halfSize, -halfSize, -halfSize, halfSize, -halfSize, halfSize, halfSize, -halfSize, halfSize, -halfSize};float uvs[] = {0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,};unsigned int indices[] = {0, 1, 2, 2, 3, 0,   // Front face4, 5, 6, 6, 7, 4,   // Back face8, 9, 10, 10, 11, 8,  // Top face12, 13, 14, 14, 15, 12, // Bottom face16, 17, 18, 18, 19, 16, // Right face20, 21, 22, 22, 23, 20  // Left face};//2 VBO创建GLuint& posVbo = geometry->mPosVbo, uvVbo = geometry->mUvVbo;glGenBuffers(1, &posVbo);glBindBuffer(GL_ARRAY_BUFFER, posVbo);glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);glGenBuffers(1, &uvVbo);glBindBuffer(GL_ARRAY_BUFFER, uvVbo);glBufferData(GL_ARRAY_BUFFER, sizeof(uvs), uvs, GL_STATIC_DRAW);//3 EBO创建glGenBuffers(1, &geometry->mEbo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, geometry->mEbo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//4 VAO创建glGenVertexArrays(1, &geometry->mVao);glBindVertexArray(geometry->mVao);glBindBuffer(GL_ARRAY_BUFFER, posVbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);glBindBuffer(GL_ARRAY_BUFFER, uvVbo);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, (void*)0);//5.4 加入ebo到当前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, geometry->mEbo);glBindVertexArray(0);return geometry;
}Geometry* Geometry::createSphere(float radius) {Geometry* geometry = new Geometry();//目标:1 位置 2 uv 3 索引//1 主要变量声明std::vector<GLfloat> positions{};std::vector<GLfloat> uvs{};std::vector<GLuint> indices{};//声明纬线与经线的数量int numLatLines = 60;//纬线int numLongLines = 60;//经线//2 通过两层循环(纬线在外,经线在内)->位置、uvfor (int i = 0; i <= numLatLines; i++) {for (int j = 0; j <= numLongLines; j++) {float phi = i * glm::pi<float>() / numLatLines;float theta = j * 2 * glm::pi<float>() / numLongLines;float y = radius * cos(phi);float x = radius * sin(phi) * cos(theta);float z = radius * sin(phi) * sin(theta);positions.push_back(x);positions.push_back(y);positions.push_back(z);float u = 1.0 - (float)j / (float)numLongLines;float v = 1.0 - (float)i / (float)numLatLines;uvs.push_back(u);uvs.push_back(v);}}//3 通过两层循环(这里没有=号)->顶点索引for (int i = 0; i < numLatLines; i++) {for (int j = 0; j < numLongLines; j++) {int p1 = i * (numLongLines + 1) + j;int p2 = p1 + numLongLines + 1;int p3 = p1 + 1;int p4 = p2 + 1;indices.push_back(p1);indices.push_back(p2);indices.push_back(p3);indices.push_back(p3);indices.push_back(p2);indices.push_back(p4);}}//4 生成vbo与vaoGLuint& posVbo = geometry->mPosVbo, uvVbo = geometry->mUvVbo;glGenBuffers(1, &posVbo);glBindBuffer(GL_ARRAY_BUFFER, posVbo);glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(float), positions.data(), GL_STATIC_DRAW);glGenBuffers(1, &uvVbo);glBindBuffer(GL_ARRAY_BUFFER, uvVbo);glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(float), uvs.data(), GL_STATIC_DRAW);glGenBuffers(1, &geometry->mEbo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, geometry->mEbo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);glGenVertexArrays(1, &geometry->mVao);glBindVertexArray(geometry->mVao);glBindBuffer(GL_ARRAY_BUFFER, posVbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);glBindBuffer(GL_ARRAY_BUFFER, uvVbo);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, (void*)0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, geometry->mEbo);glBindVertexArray(0);geometry->mIndicesCount = indices.size();return geometry;
}

4.3.vertex.glsl

代码

#version 460 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aUV;out vec2 uv;uniform mat4 transform;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;//aPos作为attribute(属性)传入shader
//不允许更改的
void main()
{vec4 position = vec4(aPos, 1.0);position = projectionMatrix * viewMatrix * transform * position;gl_Position = position;uv = aUV;
}

4.4.fragment.glsl

代码

#version 460 core
out vec4 FragColor;in vec2 uv;uniform sampler2D sampler;void main()
{FragColor = texture(sampler, uv);
}

4.5.main.cpp

在这里插入图片描述

代码

#include <iostream>#include "glframework/core.h"
#include "glframework/shader.h"
#include <string>
#include <assert.h>//断言
#include "wrapper/checkError.h"
#include "application/Application.h"
#include "glframework/texture.h"//引入相机+控制器
#include "application/camera/perspectiveCamera.h"
#include "application/camera/orthographicCamera.h"
#include "application/camera/trackBallCameraControl.h"
#include "application/camera/gameCameraControl.h"#include "glframework/geometry.h"/*
*┌────────────────────────────────────────────────┐
*│ 目	   标: 设计并实现Geometry系统,用于学习方便
*│ 讲    师: 赵新政(Carma Zhao)
*│ 拆分目标:
*			搭建Geometry类框架
*└────────────────────────────────────────────────┘
*/Geometry* geometry = nullptr;
Shader* shader = nullptr;
Texture* texture = nullptr;
glm::mat4 transform(1.0f);PerspectiveCamera* camera = nullptr;
TrackBallCameraControl* cameraControl = nullptr;void OnResize(int width, int height) {GL_CALL(glViewport(0, 0, width, height));std::cout << "OnResize" << std::endl;
}void OnKey(int key, int action, int mods) {cameraControl->onKey(key, action, mods);
}//鼠标按下/抬起
void OnMouse(int button, int action, int mods) {double x, y;app->getCursorPosition(&x, &y);cameraControl->onMouse(button, action, x, y);
}//鼠标移动
void OnCursor(double xpos, double ypos) {cameraControl->onCursor(xpos, ypos);
}//鼠标滚轮
void OnScroll(double offset) {cameraControl->onScroll(offset);
}void prepareVAO() {geometry = Geometry::createBox(3.0f);// geometry = Geometry::createSphere(3.0f);
}void prepareShader() {shader = new Shader("assets/shaders/vertex.glsl","assets/shaders/fragment.glsl");
}void prepareTexture() {texture = new Texture("assets/textures/goku.jpg", 0);// texture = new Texture("assets/textures/earth.png", 0);
}void prepareCamera() {float size = 6.0f;//camera = new OrthographicCamera(-size, size, size, -size, size, -size);camera = new PerspectiveCamera(60.0f, (float)app->getWidth() / (float)app->getHeight(),0.1f,1000.0f);cameraControl = new TrackBallCameraControl();cameraControl->setCamera(camera);cameraControl->setSensitivity(0.4f);
}void prepareState() {glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);
}void render() {//执行opengl画布清理操作GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));//绑定当前的programshader->begin();shader->setInt("sampler", 0);shader->setMatrix4x4("transform", transform);shader->setMatrix4x4("viewMatrix", camera->getViewMatrix());shader->setMatrix4x4("projectionMatrix", camera->getProjectionMatrix());//绑定当前的vaoGL_CALL(glBindVertexArray(geometry->getVao()));//发出绘制指令GL_CALL(glDrawElements(GL_TRIANGLES, geometry->getIndicesCount(), GL_UNSIGNED_INT, 0));GL_CALL(glBindVertexArray(0));shader->end();
}int main() {if (!app->init(800, 600)) {return -1;}app->setResizeCallback(OnResize);app->setKeyBoardCallback(OnKey);app->setMouseCallback(OnMouse);app->setCursorCallback(OnCursor);app->setScrollCallback(OnScroll);//设置opengl视口以及清理颜色GL_CALL(glViewport(0, 0, 800, 600));GL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));prepareShader();prepareVAO();prepareTexture();prepareCamera();prepareState();while (app->update()) {cameraControl->update();render();}app->destroy();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425877.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCL 曲线点云提取

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 提取曲线点云的方法主要分为两种:参数化与非参数化,其中参数化是指事先直线曲线的形状,反之,非参数化则是不依赖与曲线的参数,通常是一种聚类的行为。这里我们采用非参数方法(TriplClust),将点集划分为一个未…

Redis的配置与优化

目录 一、关系数据库与非关系型数据库 1.1、关系型数据库 1.2、非关系型数据库 1.3、关系型数据库和非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 1.4、非关系型数据库产生背景 二、Redis简介 2.1、Redis优点 2.2、Redis为什么这么快 三、…

如何编写智能合约——基于长安链的Go语言的合约开发

场景设计&#xff1a;文件存证系统 在数字化时代&#xff0c;文件存证和版本追踪变得越来越重要。设想一个场景&#xff1a;在一个法律事务管理系统中&#xff0c;用户需要提交和管理各种文件的版本记录&#xff0c;以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库基本信息数据库配置设置密码控制台开启…

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录&#xff1a; ❄️一、习题一(前序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(中序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(后序遍历非递归)&#xff1a; ▶ 思路&#xff1a; …

一款源码阅读的插件

文章目录 进度汇报功能预览添加高亮标记高亮风格设置笔记颜色设置数据概览高亮数据详情 结尾 进度汇报 之前提到最近有在开发一个源码阅读的IDEA插件&#xff0c;第一版已经开发完上传插件市场了&#xff0c;等官方审批通过就可以尝鲜了。插件名称&#xff1a;Mark source cod…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

java企业办公自动化OA

技术架构&#xff1a; sshjbpm 功能描述&#xff1a; 用户管理&#xff0c;岗位管理&#xff0c;部门管理&#xff0c;权限管理&#xff0c;网上交流&#xff0c;贴吧&#xff0c;审批流转。权限管理是树状结构人性化操作&#xff0c;也可以用作论坛。 效果图&#xff1a;

三维手势 第一人称 汽车驾驶 handpose 3D RGB 单目相机手势识别 手势检测 手势3D建模 三维建模

三维手势 第一人称 汽车驾驶 handpose 3D RGB 单目相机手势识别 手势检测 手势3D建模 三维建模 第一人称汽车安全驾驶 &#xff1a;三维手势建模 RGB 单目相机手势识检测 手势3D建模 咨询合作 DataBall 项目&#xff0c;欢迎加以下微信。 助力快速掌握数据集的信息和使用方式…

OpenAI API key not working in my React App

题意&#xff1a;OpenAI API 密钥在我的 React 应用中不起作用 问题背景&#xff1a; I am trying to create a chatbot in my react app, and Im not able to generate an LLM powered response. Ive been studying documentation and checking out tutorials but am unable …

PostgreSQL维护——解决索引膨胀和数据死行

注意&#xff1a; 本文内容于 2024-09-16 00:40:33 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;PostgreSQL维护——解决索引膨胀和数据死行。感谢您的关注与支持&#xff01; 我有一张表&#…

Android相关线程基础

线程基础 进程与线程 进程:可以被看做是程序的实体, 是系统进行资源分配和调度的基本单位. 线程:是操作系统调度的最小单元, 也叫轻量级进程 使用多线程的优点 可以减少程序的响应时间。如果某个操作很耗时, 能够避免陷入长时间的等待, 从而有着更好的交互性. 线程较之进…

《深度学习》深度学习 框架、流程解析、动态展示及推导

目录 一、深度学习 1、什么是深度学习 2、特点 3、神经网络构造 1&#xff09;单层神经元 • 推导 • 示例 2&#xff09;多层神经网络 3&#xff09;小结 4、感知器 神经网络的本质 5、多层感知器 6、动态图像示例 1&#xff09;一个神经元 相当于下列状态&…

Minio环境搭建(单机安装包、docker)(一)

前言&#xff1a; 项目中客户不愿意掏钱买oss&#xff0c;无奈只能给他免费大保健来一套。本篇文章只是记录验证可行性&#xff0c;毕竟minio太少文档了&#xff0c;参考着官网来。后面还会再出一套验证集群部署的文章。 一、资料 MinIO官网&#xff1a; MinIO | S3 Compatib…

CSP-J算法基础 树状结构与二叉树

文章目录 前言树状结构树状结构的基本概念&#xff1a;为什么需要树状结构&#xff1f;优点树状结构的示例 二叉树什么是二叉树&#xff1f;二叉树的类型什么样的树不是二叉树&#xff1f;二叉树的五种形态 完全二叉树相关概念完全二叉树的定义&#xff1a; 相关概念1. **高度&…

使用iperf3测试局域网服务器之间带宽

文章目录 一、下载安装1、windows2、centos 二、使用0、参数详解1、centos 一、下载安装 1、windows https://iperf.fr/iperf-download.php 拉到最下面选最新版&#xff1a; 2、centos yum install iperf3二、使用 0、参数详解 服务器或客户端&#xff1a; -p, --port #…

初识网络原理

网络的发展史 电报时代&#xff08;19世纪中叶&#xff09;&#xff1a;电报是最早的远程通信方式之一&#xff0c;它通过电线传输编码信息&#xff0c;极大地缩短了信息传递的时间电话的发明&#xff08;1876年&#xff09;&#xff1a;亚历山大格拉汉姆贝尔发明了电话&#…

前端单独实现 vue 动态路由

前端单独实现 vue 动态路由 Vue 动态路由权限是指在 Vue 应用程序中&#xff0c;根据用户的权限动态生成和控制路由的行为。这意味着不是所有的路由都在应用启动时就被硬编码到路由配置中&#xff0c;而是根据用户的权限信息&#xff0c;在运行时动态地决定哪些路由应该被加载…

VirtualBox Install MacOS

环境搭建 git clone https://github.com/myspaghetti/macos-virtualbox 脚本配置 修改macos-guest-virtualbox.sh部分内容为 vm_name"macOS" # name of the VirtualBox virtual machine macOS_release_name"Catalina" # install &quo…