【8】shader写入类中
上一篇将 vao vbo写入类中进行封装,本篇将shader进行封装。
Shader shader("res/shaders/Basic.shader");shader.Bind(); shader.SetUniform4f("u_Color", 0.2f, 0.3f, 0.8f, 1.0f);
shader.h
#pragma once#include <string>
#include <unordered_map>struct ShaderProgramSource
{std::string VertexSource;std::string FragmentSource;
};class Shader
{
private:std::string m_FilePath;unsigned int m_RendererID;// caching for uniformsstd::unordered_map<std::string, int> m_UniformLocationCache;
public:Shader(const std::string& filepath);~Shader();void Bind() const;void UnBind() const;//Set Uniformvoid SetUniform4f(const std::string& name, float v0, float v1, float v2, float v3);
private: ShaderProgramSource ParseShader(const std::string& filepath); unsigned int CompileShader(unsigned int type, const std::string& source);unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader);int GetUniformLocation(const std::string& name);};
shader.cpp
#include "Shader.h"#include <fstream>
#include <sstream>
#include <string>
#include <iostream>#include "Renderer.h"Shader::Shader(const std::string& filepath): m_FilePath(filepath), m_RendererID(0)
{ShaderProgramSource source = ParseShader(filepath);m_RendererID = CreateShader(source.VertexSource, source.FragmentSource);
}Shader::~Shader()
{GLCall(glDeleteProgram(m_RendererID));
}void Shader::Bind() const
{GLCall(glUseProgram(m_RendererID));
}void Shader::UnBind() const
{GLCall(glUseProgram(0));
}void Shader::SetUniform4f(const std::string& name, float v0, float v1, float v2, float v3)
{GLCall(glUniform4f(GetUniformLocation(name), v0, v1, v2, v3));
}int Shader::GetUniformLocation(const std::string& name)
{if (m_UniformLocationCache.find(name) != m_UniformLocationCache.end()){return m_UniformLocationCache[name];}GLCall( int location = glGetUniformLocation(m_RendererID, name.c_str()));if (location == -1){std::cout << "Warning: unifrom '" << name << "' doesn't exist!" << std::endl;} m_UniformLocationCache[name] = location;return location;
}ShaderProgramSource Shader::ParseShader(const std::string& filepath) {std::ifstream stream(filepath);enum class ShaderType { /* 带作用域的枚举类型,不是类*/NONE = -1, VERTEX = 0, FRAGMENT = 1};std::string line;std::stringstream ss[2];ShaderType type = ShaderType::NONE;while (getline(stream, line)) {if (line.find("#shader") != std::string::npos) { /* 找到了*/if (line.find("vertex") != std::string::npos) {// set mode to vertextype = ShaderType::VERTEX;}else if (line.find("fragment") != std::string::npos) {// set mode to fragmenttype = ShaderType::FRAGMENT;}}else {ss[(int)type] << line << '\n';}}return { ss[0].str(), ss[1].str() };
}unsigned int Shader::CompileShader(unsigned int type, const std::string& source) {unsigned int id = glCreateShader(type);/*vertex 或者 fragment */const char* src = source.c_str(); /*或者写 &source[0]*/glShaderSource(id, 1, &src, nullptr);glCompileShader(id);int result;glGetShaderiv(id, GL_COMPILE_STATUS, &result);if (result == GL_FALSE) {int length;glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);// char message[length]; /*这里会发现因为长度不定,无法栈分配,但你仍要这么做*/char* message = (char*)alloca(length * sizeof(char));glGetShaderInfoLog(id, length, &length, message);std::cout << "Failed to compile " <<(type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader!请定位到此行" << std::endl;std::cout << message << std::endl;glDeleteShader(id);return 0;}return id;
}unsigned int Shader::CreateShader(const std::string& vertexShader, const std::string& fragmentShader) {/*使用unsigned是因为它接受的参数就是这样,或者可以使用 GLuint,但是作者不喜欢这样,因为它要使用多个图像api*/unsigned int program = glCreateProgram();unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);glAttachShader(program, vs);glAttachShader(program, fs);glLinkProgram(program);glValidateProgram(program);glDeleteShader(vs);glDeleteShader(fs);return program;
}相关文章:
【8】shader写入类中
上一篇将 vao vbo写入类中进行封装,本篇将shader进行封装。 Shader shader("res/shaders/Basic.shader");shader.Bind(); shader.SetUniform4f("u_Color", 0.2f, 0.3f, 0.8f, 1.0f);shader.h #pragma once#include <string> #include &l…...
Servlet注册迭代史
Servlet注册迭代史 1、第一代,xml注册 <web-app><display-name>Archetype Created Web Application</display-name><!-- 定义一个Servlet --><servlet><!-- Servlet的名称,用于在配置中引用 --><servlet-name&…...
合创汽车V09纵享商务丝滑?预售价32万元起,正式宣布大规模生产
合创汽车正式宣布,旗下新款车型V09已于9月10日开始大规模生产,并预计将于10月13日正式上市。V09作为中大型纯电动MPV的代表之一,备受瞩目。该车型是广汽新能源和蔚来汽车共同成立的广汽蔚来改为广汽集团和珠江投管共同投资的高端品牌——合创…...
49. 视频热度问题
文章目录 实现一题目来源 谨以此笔记献给浪费掉的两个小时。 此题存在多处疑点和表达错误的地方,如果你看到了这篇文章,劝你跳过该题。 该题对提升HSQL编写能力以及思维逻辑能力毫无帮助。 实现一 with info as (-- 将数据与 video_info 关联&#x…...
【力扣练习题】加一
package sim;import java.math.BigDecimal; import java.util.Arrays;public class Add1 {/*给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 …...
Linux--I/O复用之select
目录 一:概念 二:使用 三:参数介绍: 1.ndfs: 2.fd_set类型: 3.readfds: 4.writefds: 5.exceptfds: 6.timeout: 7.返回值: 四࿱…...
数据结构大作业 成绩分析c语言程序设计
界面加载 界面展示 成绩输入 求平均成绩 升序排列 降序排列 名字排序 按名字搜索 按ID搜索 每门课成绩分析 成绩单展示 -...
Consul学习笔记之-初识Consul
文章目录 1. What is consul?2. Consul能干什么3. Consul的架构3.1 概念 4. Consul VS Eureka4.1 CAP4.2 对比 1. What is consul? 根据官方文档的定义: HashiCorp Consul is a service networking solution that enables teams to manage secure network connec…...
python实现读取并显示图片的两种方法
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片。 本人偏爱 matpoltlib,因为它的语法更像 matlab。 👇 👇 👇 更多精彩机密、教程&…...
Spring Boot 整合 MyBatis
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...
2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享
文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…...
手机木马远程控制复现
目录 目录 前言 系列文章列表 渗透测试基础之永恒之蓝漏洞复现http://t.csdn.cn/EsMu2 思维导图 1,实验涉及复现环境 2,Android模拟器环境配置 2.1,首先从官网上下载雷电模拟器 2.2,安装雷电模拟器 2.3, 对模拟器网络进行配置 2.3.1,为什么要进行配置…...
linux 安装Docker
# 1、yum 包更新到最新 yum update # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo h…...
Java中的值传递与引用传递 含面试题
面试题分享 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 史上最全文档…...
SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft SQL Server™ 表达式。。 data_type 目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。 length nchar、nva…...
借助各大模型的优点生成原创视频(真人人声)Plus
【技术背景】 众所周知,组成视频的3大元素,即文本语音图片。接着小编逐一介绍生成原创视频的过程。 【文本生成】 天工AI搜索(thttp://iangong.cn) 直接手机短信验证就可以使用,该大模型已经接入互联网,…...
技能大赛物联网赛项参赛软件建设方案
一、概述 信息与通信技术的目标已经从任何时间、任何地点连接任何人,发展到连接任何物品的阶段,而万物的连接就形成了物联网。物联网的主要特征是通过条码识读设备、射频识别 (RFID)装置、红外感应器、全球定位系统、激光扫描器等信息传感设备…...
蓝桥杯官网练习题(凯撒加密)
题目描述 给定一个单词,请使用凯撒密码将这个单词加密。 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移 3 位后被替换成密文。即 a 变为 d,b 变为 e,⋯⋯,w 变为z,x 变为 a&#x…...
JavaScript 数组中常用的方法
添加 push:数组末尾添加unshift:数组首位添加splice(1, 0, ‘新增内容’):再指定位置插入,第二参数为0,表示新增;大于0,表示修改 删除 pop:删除末尾shift:删除首位slice(…...
YOLOV7改进-添加基于注意力机制的目标检测头(DYHEAD)
DYHEAD 复制到这: 1、models下新建文件 2、yolo.py中import一下 3、改IDetect这里 4、论文中说6的效果最好,但参数量不少,做一下工作量 5、在进入IDetect之前,会对RepConv做卷积 5、因为DYHEAD需要三个层输入的特征层一致&am…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
