OpenGL中图片尺寸和上屏尺寸不一致的变形问题解决

news2025/1/31 8:08:55

一、尺寸不一致问题:

图片加载到OpenGL纹理,再将纹理进行上屏的时候,可能会出现图片尺寸和屏幕尺寸不一致,导致图片绘制到屏幕时出现变形的问题:
在这里插入图片描述
在这里插入图片描述

二、根本原因:

原始图片的纹理尺寸(Texture),和用于绘制上屏的渲染缓冲区(RBO,画布)尺寸不一致。
而OpenGL内部对图像顶点坐标运算都是归一化的运算(-1.0 ~ 1.0),并且默认绘制的时候都是填满整个渲染缓冲区

三、解决办法:

根据原始图片尺寸和画布的尺寸,计算在绘制时的新的顶点坐标。

计算过程:

我们假设:
原始图片的宽高分别是ab
上屏的渲染缓冲区的宽高分别是:wh
在这里插入图片描述

1.我们先讨论图片宽高比 大于> 屏幕宽高比的情况:(a/b > w/h)

在这里插入图片描述
如上图,把图片居中到屏幕中央,不变形的情况。
此时,图片的宽 = 屏幕的宽w
按照不变形的情况,图片的高也要做一样比例的缩放,此时图片的高 = wb/a(图中蓝色虚线的部分)
在这里插入图片描述
如上如,OpenGL的顶点坐标系是在屏幕中央。
对于上图这种情况,x坐标不变,y坐标需要缩小到某个值。如何计算y需要缩小到什么数值?
我们考虑最极端的情况:
原来占满屏幕的情况下,y最大值为 h/2 (半个屏幕,因为原点在中央)(绿线 + 一段红线的长度)
缩放之后,y最大值变为 wb/2a(绿线的长度)
因此,y的变化系数就是 (wb/2a)÷(h/2) = wb/ha

2.对于图片宽高比 小于< 屏幕宽高比的情况:(a/b < w/h)

推导过程与上述类似,y不变,x值的变化系数是ha/wb(跟上面y的系数互为倒数),有兴趣的同学可以自行推导

四、结论:

1.图片宽高比 > 屏幕宽高比(a/b > w/h)时:
顶点坐标变换:(x,y) >>>>> (x,y × wb/ha)
2.图片宽高比 < 屏幕宽高比(a/b < w/h)时:
顶点坐标变换:(x,y) >>>>> (x × ha/wb,y)

五、OpenGL实现:

在OpenGL中,对坐标的变换都在顶点着色器进行。
按上述结论,可以在顶点着色器中,对顶点的x值和y值分别计算,把计算后的坐标赋值给gl_Position

可以在外部计算宽高比值,也可以在着色器里计算比值

  • 在外部计算宽高比值的例子:
//c++代码部分
float xRatio = ha / wb;
float yRatio = wb / ha;
program->setUniform2f("correctFactor", xRatio, yRatio);
//顶点着色器
attribute vec2 a_position;
attribute vec2 a_texCoord;
varying vec2 texcoordOut;
uniform vec2 correctFactor;

void main()
{
    texcoordOut = a_texCoord;
    vec2 position = a_position * correctFactor;
	gl_Position = vec4(clamp(position, 0.0, 1.0), 0.0, 1.0);
}

缩放之后的效果:
在这里插入图片描述

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

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

相关文章

计网之IP协议和以太网

文章目录一. IP协议1. IPv4报头介绍2. 解决IPv4地址不够用的问题3. IP地址管理4. 路由选择二. 以太网三. 浅谈DNS域名解析系统一. IP协议 IP协议是位于OSI模型中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但IP协议是网络层传输所使用的最主流的一种协议, 有IPv4和…

C语言——指针进阶

目录 前言 一. 字符指针 二. 指针数组 三. 数组指针 3.1 何为数组指针&#xff1f; 3.2 &数组名与数组名 四. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 五. 函数指针 六. 函数指针数组 七. 指向函数指针数组…

Java 继承中构造函数的问题

继承中构造函数的问题 父类构造函数和子类构造函数的关系 new一个之类对象时默认调用了父类的无参构造函数 ,创建了父类对象 父类的成员变量和成员方法才能创建出来 子类才能继承下来使用 首先创建一个父类&#xff0c;动物类 接下来创建一个子类&#xff0c;狗类&#xff…

基于OSG的虚拟校园系统的设计与实现

基于open scene graph的虚拟校园系统的设计与实现 摘要 •引言 • OSG基本原理 •OSG操作与动画 •视点的定位和切换 •自由漫游 •路径漫游 • 路径动画 • 点选和文字 • 粒子系统 • 3DMAX • 无线通信与数据库设计 • 实现步骤 • 结论 摘要 随着科技的不断发展,人工智能&a…

2023年,8种必备Selenium编写自动化用例的技巧

在开始自动化时&#xff0c;您可能会遇到各种可能包含在自动化代码中的方法&#xff0c;技术&#xff0c;框架和工具。有时&#xff0c;与提供更好的灵活性或解决问题的更好方法相比&#xff0c;这种多功能性导致代码更加复杂。在编写自动化代码时&#xff0c;重要的是我们能够…

2023年网络安全十大发展趋势

近日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;计算机安全专委会中来自国家网络安全主管部门、高校、科研院所、大型央企、民营企业的委员投票评选出2023年网络安全十大发展趋势。 趋势一 数据安全治理成为数字经济的基石 我国《数据安全法》提出“建立健全数据…

spring的启动过程(一) :IOC容器的启动过程

一、web容器的加载 首先我们要先知道一个web项目的启动过程。 将Web项目部署到Tomcat中的方法之一&#xff0c;是部署没有封装到WAR文件中的Web项目。要使用这一方法部署未打包的webapp目录&#xff0c;只要把我们的项目&#xff08;编译好的发布项目&#xff0c;非开发项目&am…

掌握MySQL分库分表(五)SpringBoot2+MybatisPlus整合Sharding-Jdbc水平分表实现

文章目录创建Java-Maven项目创建数据库、表创建Java实体类配置启动类水平分表配置文件配置测试分库分表实现分析控制台SQL逻辑SQL真实SQL主键重复问题创建Java-Maven项目 添加依赖 <properties><java.version>11</java.version><maven.compiler.source&…

PMP考试有没有什么技巧可以介绍一下么?

一、试题形式 ——中英文对照 即每道题都是一遍英文&#xff0c;一遍翻译的中文&#xff0c;在审题的时候有一些小的技巧需要注意。首先如果你的英文水平足够好&#xff0c;建议直接阅读原文。PMP试题毕竟是美国人出的&#xff0c;语言的组织、思想的表达&#xff0c;肯定更符…

python居然能语音控制电脑壁纸切换,只需60行代码

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 家在日常的电脑使用中&#xff0c;都会有自己喜爱类型的桌面 单纯的桌面有时候会让人觉得单调 今天&#xff0c;就由我带领大家只用60行代码打造一款语音壁纸切换器程序&#xff0c; 让大家能够通过语音的方式来控制电脑去…

c++模板的简单认识

文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言 ADD函数很好写&#xff0c;但是如果我们要有int类型的&#xff0c;double类型的&#xff0c;char类型的等等各种类型&#xff0c;难道要写这么多不同的ADD函数吗&#xff0c;这么写简直太麻…

Linux:基于bufferevent epoll tcp服务器代码

基于bufferevent epoll tcp服务器代码: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <event2/event.h> #include <event2/buffer…

Excel/Word的一些快捷操作整理

Excel/Word的一些快捷操作整理 1. 给Word文件导入目录 前提&#xff1a;大致内容已经定稿&#xff0c;文章中各标题分级明确&#xff0c;最好各级标题字体大小设置不一样。 步骤&#xff1a;在头部导航栏&#xff0c;选择**“引用”–“目录”**&#xff0c;根据自己需求选择其…

KDJB1200六相继电保护测试仪

一、概述 KDJB1200继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件(讨论稿)》的基础上&#xff0c;广泛听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代新的的微电子技术和器件实现的一种新型小型化微机继电保护测试仪。可…

DataWhale 大数据处理技术组队学习task3

四、分布式数据库HBase 1. 产生背景 1.1 Hadoop的局限性 优点&#xff1a;存储结构化、半结构甚至非结构化的数据&#xff0c;是传统数据库的补充&#xff0c;是海量数据存储的最佳方法。缺陷&#xff1a; 只能进行批处理&#xff0c;并且只能以顺序的方式访问数据。&#x…

【C++】-- 异常

目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和捕获 自定义异常体系 异常的重新抛出 异常安全 异常规范&#xff08;C期望&#xff09; C标准库的异常体系 异常的优缺点 C异常的优点 C异常的缺点 总结 C语言传统的处理错误的方式 传统的错误…

zookeeper单机部署

一.下载zookeeper压缩包 二.上传解压安装包到/data/zookeeper目录&#xff0c;并解压 tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz 三.修改配置文件 cd apache-zookeeper-3.5.10-bin/conf mv zoo_sample.cfg zoo.cfg vi zoo.cfg 修改为如下&#xff1a; dataDir/data/zooke…

【研究空间复用及函数调用问题】

本篇总结函数调用过程会存在的一些奇怪现象&#xff0c;空间复用问题&#xff0c;其实本质上涉及函数调用的底层原理&#xff0c;理解函数栈帧的创建和销毁这样的问题直接迎刃而解。1.空间复用问题案例1案例22.函数调用过程不清晰问题案例33.总结1.空间复用问题 案例1 我们先…

程职场人必备微软出品的实用小工具

系统增强工具PowerToys 下载地址&#xff1a;https://github.com/microsoft/PowerToys 什么是 Windows 系统中&#xff0c;最好的辅助工具&#xff1f; PowerToys 一定可以获得提名。PowerToys 是一款来自微软的系统增强工具&#xff0c;就像是一个神奇的系统外挂&#xff0c;…

精确控制 AI 图像生成的破冰方案,ControlNet 和 T2I-Adapter

ControlNet 和 T2I-Adapter 的突破性在哪里&#xff1f;有什么区别&#xff1f;其它为 T2I 扩散模型施加条件引导的相关研究ControlNet 和 T2I-Adapter 的实际应用效果如何&#xff1f;使用体验上&#xff0c;跟 SD原生支持的 img2img 有什么区别&#xff1f;ControlNet 在插画…