openGl2

news/2025/3/21 18:34:02/文章来源:https://www.cnblogs.com/zwf4/p/18765604

图元装配(Primitive Assembly)

Primitive
也就是对顶点坐标,进行装配,形成形状

裁剪

原文:片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率
裁剪默认在片段着色前

最后一个阶段

在着色后,是Alpha测试和混合。会进行深度测试、会检测透明度进行混合

必须定义的着色器

现代openGl有必须定义的着色器,因为GPU没有默认的。他们是:顶点shader、片段shader

顶点缓冲对象(Vertex Buffer Objects, VBO)

用于一次性CPU给GPU发送顶点,多次发送慢,所以缓存后一次发送
生成buffer->设置当前绑定buffer->设置buffer内容
genBuffer->bind->bufferData

glBufferData函数里有一个选项,可以选择buffer的性能。分为几乎不会变的、常变的、每帧变的
好的,至此,显存里有数据了

继续根据https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

有点不同的是,我分解成了class,为后续更方便添加代码

运行后出现了一个问题,窗口上画了一个橙色的方块,有时也不会画出方块而是完全黑屏,而且方块的位置不固定,有时在右上角,有时在左下角



分析一下:首先,没有报错,说明shader编译之类的都是对的,也就是整个流程是跑通的。那么大概率是数据的问题。读入数据的时候有一个地方我和教程不一样,我用了vector。将vector改为float v2[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};后,正常了
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices, GL_STATIC_DRAW);//异常
glBufferData(GL_ARRAY_BUFFER, sizeof(v2), v2, GL_STATIC_DRAW);//正常
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], GL_STATIC_DRAW);//三角形高度减半,也就是一个点变成了0,0,0
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*vertices.size(), &vertices[0], GL_STATIC_DRAW);//正常
由此,有2件之前没注意的事,vector是一个obj,里面封装了一些指针,sizeof(vec)=32,有的资料说里面只有3个指针,不过是32的话,显然是4个,可能因为我在debug模式下MSVC会加一个debugSize,不过这不重要,重要的是传读取长度得用size算。其次是传入的指针,bufferData需要传入的是连续地址0位的指针,传&vec的话,是obj的指针

异常分析:用renderDoc


因为传成了地址。所以点取成了一些 接近0 or 接近无穷的点,当恰好能形成三角形的时候,渲染就会这样。虽然看到的是四边形,但实际上是三角形,只是因为y太大或太小,导致视角内看起来是四边形。

EBO (IBO)

教程里本章用的术语是EBO,个人认为从特性层面看,IBO更符合。简单来说,重复的点不重复传入,加传点的索引,从而获得更高的效率
EBO在active vao 中的时候,不能解绑,会运行错误

练习

玩玩

2个点相同,然后注意第三个点不要在第一个三角形内就行
以为之前封装好了操作,所以第二个只要复制一下就行
int main()
{
auto myWindow = MyWindow();
if (myWindow.IsSuccess() == false) {
return -1;
}

auto v = VertexShader();
auto f = FragmentShader();
auto shaderProgram = Tool::LinkShader(v, f);
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);auto vbo = VBObject(triangleVertices);
auto ebo = EBObject(indces);glBindBuffer(GL_ARRAY_BUFFER, 0);//解绑
glBindVertexArray(0);//解绑unsigned int VAO2;
glGenVertexArrays(1, &VAO2);
glBindVertexArray(VAO2);auto vbo2 = VBObject(triangleVertices2);
auto ebo2 = EBObject(indces);glBindBuffer(GL_ARRAY_BUFFER, 0);//解绑
glBindVertexArray(0);//解绑std::vector<unsigned int>vaos={VAO, VAO2};
Tool::BindAutoAdaptSize(myWindow.GetWindow());
Tool::RenderLoop(myWindow.GetWindow(), shaderProgram, vaos);return 0;

}
不同色也差不多

#include<glad/glad.h>
#include"Tool.h"
#include"VBObject.h"
#include"MyWindow.h"
#include"EBObject.h"
#include <vector>std::vector<float> triangleVertices = {0.0f, 0.0f, 0.0f,   // 右上角0.0f, -0.5f, 0.0f,  // 右下角-0.5f, -0.5f, 0.0f, // 左下角0.5f, 0.5f, 0.0f,   // 左上角0.5f, 0.0f, 0.0f ,  // 左上角};std::vector<int> indces = {0, 1, 2, // 第一个三角形};
std::vector<int> indces2 = {0, 4, 3  // 第二个三角形};int main()
{auto myWindow = MyWindow();if (myWindow.IsSuccess() == false) {return -1;}auto v = VertexShader();auto f = FragmentShader("#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\0");auto f2 = FragmentShader("#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(0.2f, 0.5f, 0.2f, 1.0f);\n""}\0");auto shaderProgram = Tool::LinkShader(v, f);auto shaderProgram2 = Tool::LinkShader(v, f2);unsigned int VAO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);auto vbo = VBObject(triangleVertices);auto ebo = EBObject(indces);glBindBuffer(GL_ARRAY_BUFFER, 0);//解绑glBindVertexArray(0);//解绑unsigned int VAO2;glGenVertexArrays(1, &VAO2);glBindVertexArray(VAO2);auto vbo2 = VBObject(triangleVertices);auto ebo2 = EBObject(indces2);glBindBuffer(GL_ARRAY_BUFFER, 0);//解绑glBindVertexArray(0);//解绑std::vector<unsigned int>vaos = { VAO, VAO2 };std::vector<unsigned int>shaderPrograms ={ shaderProgram,shaderProgram2};Tool::BindAutoAdaptSize(myWindow.GetWindow());Tool::RenderLoop(myWindow.GetWindow(), shaderPrograms, vaos);return 0;
} 

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

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

相关文章

Mac安装php8.3配置Swoole环境

1、查看可安装的PHP版本brew search php 2、安装8.3的版本brew install php@8.3 3、设置环境变量vim ~/.zshrc放入上述第二步完成后提示的内容export PATH="/opt/homebrew/opt/php@8.3/bin:$PATH"export PATH="/opt/homebrew/opt/php@8.3/sbin:$PATH" e…

buuctf re rsa

先下载文件,然后打开压缩包有这样的文件,enc为二进制文件,key丢入文档读取文件就可以读取。得到n和e,然后取尝试分解n。分解成功,得到p和q,然后进行rsa解密算法的设计,因为enc为二进制文件,所以需要用open函数读取,然后使用rsa库文件进行解密。解出flag是flag{decrypt…

中高通量基因测序芯片有何不同-基因测序-测序芯片-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

中高通量基因测序芯片的区别主要体现在样本处理能力、应用场景、技术设计以及数据产出效率等方面。以下是两者的详细对比: 中通两芯片外观:高通量芯片外观:定义与核心目标中通量基因测序芯片目标:适合中等规模样本的测序需求(例如数百至数千个样本/反应),平衡通量与成本…

ui自动化测试——unittest框架(自动化框架)

一、自动化框架介绍 1、unittest 框架是python中自带的框架 2、作用:管理和组织测试用例 当我们写的用例越来越多,我们就要考虑用例的编写的规范和组织,以便于后期的维护 3、常见的自动化框架:po框架、pytest 框架、unittest框架(我们讲解) 4、unitest 框架自带标准的库:…

代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践

通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。…

信创麒麟V10操作系统安装Kong网关

总览 随着国家对信息安全和自主可控技术的日益重视,信创改造正成为各大企业及政府部门的重要任务。公司目前在x86架构的Red Hat系统上部署了Kong网关2.2.1,并且通过官方RPM包实现了快速部署。为了顺应信创转型,现阶段需要在aarch64架构的信创麒麟v10系统上部署Kong网关。 由…

wsl kali 系统安装gvm (openVAS)

1. 更新系统 首先,确保系统是最新的: sudo apt update sudo apt upgrade -y2. 安装GVM(OpenVAS) Kali Linux官方仓库中已经包含了GVM(OpenVAS)的安装包。你可以通过以下命令安装: sudo apt install gvm3. 初始化GVM 安装完成后,需要初始化GVM。运行以下命令: sudo gvm…

day34 rsync备份任务的实战

06-备份任务实战 今天的任务主要以实际备份任务入手,完成综合练习,完成对rsync的综合运用。先看需求 再讲解 再次动手实践客户端需求 客户端需求: 1.客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录) 2.客户端备份的数据必须存放至以 "主机名_ip地址_当…

dotnet-cnblogs-tool-cnblog

1. 解决的问题: 在本地编辑 md 后,如果有图像,直接复制该 md 到 博客园,或者使用 vscode 插件,会自动上传到博客园,但是上传后,因为没有真正上传图片,图片会无法显示。 2. 解决方法: 参考: dotnet-cnblogs-tool 本文环境为 linux 环境。直接下载 dotnet-cnblogs-tool…

可视化图解算法:链表相加( 两数相加)

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表…

VUE中使用BroadcastChannel实现同源多页面实时通信

使用BroadcastChannel广播通信 准备工作:1.channel.js文件,内容如下const Channel = {/*** BroadcastChannel对象Map*/channelMap: new Map(),/*** 发送消息,重载方法,可直接调用,省略对象实例化操作* @param {*} channelName 通道名称,用以区分不同的通道* @param {*} o…

halcon 入门教程(五) 缺陷检测

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18785484有兴趣可以多看其他的halcon教程halcon 学习教程目录本篇主要讲一些常见的缺陷检测方法,目前只会讲一些,后面有空的话会不断的补充完整。因为缺陷的种类实在太多太多了,各种各样的缺陷可能都要用各种…