解码视频流在opengl中的贴图投影计算

news2024/10/6 20:36:44

解码视频流在opengl中的贴图投影计算

  • 修改顶点着色器
  • cpp 文件
  • 放大缩小

我们把视频当成纹理,首先要确定贴入的坐标,原始坐标如下所示


static float vertices[] = {
	//     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -
		 1.0f,  1.0f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // 右上
		 1.0f, -1.0f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // 右下
		-1.0f, -1.0f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下
		-1.0f,  1.0f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f   // 左上
};

实际上我们要确定的是opengl的投影视窗,视窗大小就是位置,相当于把解码图像放到窗口中的什么位置,这里并不是纹理位置,纹理位置是具体取到那一块的纹理,涉及到放大缩小,我们写一个顶点着色器,如下所示

#version 330 core
layout(location = 0) in vec3 aPos;				   
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;

out vec4 vertexColor;
out vec2 TexCoord;
void main(){
    vec3 pos;
	gl_Position = vec4(aPos, 1.0);
	vertexColor = vec4(aColor, 1.0);
	TexCoord = aTexCoord;
	//TexCoord1 = aTexCoord1;
}

没有任何约束,放出来的贴图会随着窗口的变化而变化,问题是不成比例,视频展现失比例拉伸,对展现并不友好。我们要使用向量的运算来修改投影视窗
在这里插入图片描述

修改顶点着色器

当然就是使用uniform来做这个事情,窗口事件宽高改变

#version 330 core
layout(location = 0) in vec3 aPos;				   
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;

out vec4 vertexColor;
out vec2 TexCoord;

//out vec2 TexCoord1;
uniform float v_scalex;
uniform float v_scaley;

void main(){
    vec3 pos;
	pos = aPos * vec3(v_scalex,v_scaley,1);
    //pos.x = aPos.x * v_scalex;
	//pos.y = aPos.y * v_scaley;
	//pos.z = aPos.z;
	gl_Position = vec4(pos, 1.0);
	vertexColor = vec4(aColor, 1.0);
	TexCoord = aTexCoord;
	//TexCoord1 = aTexCoord1;
}

其中,直接运算

pos.x = aPos.x * v_scalex;
pos.y = aPos.y * v_scaley;
pos.z = aPos.z;

也是可以的,不过更为直接的计算是向量积,和矩阵运算不同,向量积是对应的x,y,z 直接运算,不要把它当成直接的矩阵运算。

cpp 文件

窗口事件:

void windowResize_callback(GLFWwindow* window, int width, int height)
{
	//printf("windowResize_callback\n");
	c_data::Instance().func_calc_scale_vertex(width, height);
}

再使用glUniform1f 改变x 和 y的投影比例

glUniform1f(glGetUniformLocation(myShader.ID, "v_scalex"), c_data::Instance().vetex_scale_x); 
glUniform1f(glGetUniformLocation(myShader.ID, "v_scaley"), c_data::Instance().vetex_scale_y);  

我们会看到正确的投影视口,与图像成正比,如下所示
在这里插入图片描述

放大缩小

放大和缩小又是改变纹理坐标,和视口投影不是一回事,并且涉及到更多的计算,下次再聊。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js计算点到直线的距离并使用canvas可视化

使用方程计算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Distance to Line Visualization</…

题目:小明的背包2(蓝桥OJ 1175)

问题描述&#xff1a; 解题思路&#xff1a; 本题是完全背包模板题&#xff0c;与01背包的不同处在于状态是由小到大转移。 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e3 9;int dp[N]; // N表示体积int main() {int n, m;cin >…

健身运动蓝牙耳机什么牌子好?五大业内顶级优品推荐

在当下这个健身热潮席卷的时代&#xff0c;越来越多的人开始注重运动与健康&#xff0c;而音乐作为运动时的最佳伴侣&#xff0c;无疑为锻炼过程增添了不少乐趣。为了在运动时享受音乐&#xff0c;一款优质的健身运动蓝牙耳机显得尤为重要&#xff0c;市场上各大品牌纷纷推出自…

每日面经分享(SpringBoot part4:Controller层)

SpringBoot Controller层的作用 a. 请求映射&#xff1a;Controller层使用注解&#xff08;如RequestMapping、GetMapping、PostMapping等&#xff09;将HTTP请求映射到相应的方法上。这些方法根据URL路径、请求方法、请求参数等来决定要执行的操作。 b. 参数解析&#xff1a;C…

KUKA机器人更改时间和HMI最小化设置

在使用 KUKA 机器人时&#xff0c;示教器上左边有个“表”的图标&#xff0c;点一下就会显示时间。但一般不准&#xff0c;想要更改时间可以通过HMI最小化后进行更改设置。更改时间需要将示教器界面最小化&#xff0c;也就是进入Windows 界面。通过以下步骤可以进行设置&#x…

ES学习日记(二)-------集群设置

上一节写了elasticsearch单节点安装和配置,现在说集群,简单地说就是在多台服务器上搭建单节点,在配置文件里面增加多个ip地址即可,过程同单节点部署,主要说集群配置 注意:不建议在之前单节点es上修改配置为集群,据说运行之后会生成很多文件,在单点基础上修改容易出现未知问题,…

微信支付平台与微信服务号关联配置要点

目录 JSAPI支付 前期资料及相关准备 申请微信服务号 服务号配置要点 微信认证 基本配置 功能设置 申请微信支付号 支付号配置要点 设置操作密码 API安全 开发设置 与服务号关联 小结 JSAPI支付 我们的开发应用场景以JSAPI支付为举例&#xff0c;这也是常用的一…

基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现

一.项目介绍 前台功能&#xff1a;用户进入系统可以实现首页&#xff0c;系统公告&#xff0c;个人中心&#xff0c;后台管理等功能进行操作 后台由管理员&#xff0c;实习单位&#xff0c;教师和学生&#xff0c;主要功能包括首页&#xff0c;个人中心&#xff0c;班级管理&am…

Python多任务处理---多线程

引入 生活中&#xff0c;我们在电脑上打开了一个word, 这个word对操作系统来说就是一个进程。我们在进行word操作的时候&#xff0c;比如在你打字的时候&#xff0c;该word同时可以进行文字检查。发现了没&#xff0c;在同一个进程中&#xff0c;我们也可以进行同时操作。…

编程语言 MoonBit 本周有超多重磅更新等你来探索:expect 测试添加 inspect 函数,还有……

MoonBit 更新 1. expect 测试添加 inspect 函数 expect 测试添加针对 Show 接口的 inspect 函数&#xff0c;签名如下&#xff1a; pub fn inspect(obj: Show,~content: String "",~loc: SourceLoc _,~args_loc: ArgsLoc _ ) -> Result[Unit, String]⚠️ 此…

【javascript】Promise的介绍和使用方法

简言 什么是Promise&#xff1f; Promise 是一个对象&#xff0c;它代表了一个异步操作的最终完成或者失败。它可以进行链式调用、错误捕捉等操作&#xff0c;轻松解决经典的回调地狱问题&#xff0c;可以像编写同步代码那样&#xff0c;从容、简洁、优雅地实现高复杂度的异步…

【算法分析与设计】丑数 | |

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 示例 1&#xff1a;…

智慧城市数字孪生,综合治理一屏统览

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维&#xff0c;从构成城市诸多要素、结构、功能等方面入手&#xff0c;系统推进…

Python基础之Class类的定义、继承、多态

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、class类1.类属性操作&#xff08;增删改&#xff09;2.类方法操作 二、类的继承1、语法2、方法重写 二、类的多态 一、class类 、三部分组成 1、类名&#xff…

makefile第五讲

更多精彩内容在公众号。 书写命令 每条规则中的命令和操作系统 Shell 的命令行是一致的。 make 会按顺序一条一条的执行命令&#xff0c; 每条命令的开头必须以[Tab]键开头&#xff0c; 除非&#xff0c;命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被…

FreeRTOS系列补充1:重点记忆知识点

1、FreeRTOS的调度策略、内部原理 FreeRTOS采用抢占式优先级调度策略。任务根据其优先级进行调度&#xff0c;优先级高的任务会抢占优先级低的任务的执行权。FreeRTOS使用任务控制块&#xff08;Task Control Block&#xff0c;简称TCB&#xff09;来管理任务信息和状态。调度…

好展位、抢先订!2024第19届亚洲泳池SPA展览会|广州游池展

邀请函/2024第19届亚洲泳池SPA博览会 时间&#xff1a;2024年5月10日--12日 地点&#xff1a;广州中国进出口商品交易会展馆 主办单位&#xff1a;广东省沐浴休闲协会 广东省水处理技术协会 广东鸿威国际会展集团有限公司 支持单位:国际桑拿协会 韩国SPA协会 亚洲水疗康体促…

leecode 331 |验证二叉树的前序序列化 | gdb 调试找bug

计算的本质是数据的计算 数据的计算需要采用格式化的存储&#xff0c; 规则的数据结果&#xff0c;可以快速的按照指定要求存储数据 这里就不得不说二叉树了&#xff0c;二叉树应用场景真的很多 本题讲的是&#xff0c;验证二叉树的前序序列化 换言之&#xff0c;不采用建立树的…

monocle2 orderCells报错

问题&#xff1a;运行monocle2&#xff08;version2.26.0&#xff09;的orderCells出现以下错误 解决方式&#xff1a;出现错误后&#xff0c;运行以下命令&#xff1a; trace(project2MST, edit T, where asNamespace("monocle")) 然后&#xff0c;在弹出的窗口…

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具&#xff0c;只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码&#xff0c;安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…