Weston 纹理倒置(render-gl)

news2025/1/16 15:47:29

纹理倒置

背景

render-gl 接入 frame buffer object 实现 off-screen 渲染后,发现得到的渲染图发生了180°的倒置.

查阅了有关资料后,在 eglspec.1.5 中的 2.2.2.1 Native Surface Coordinate Systems 找到了答案:

The coordinate system for native windows and pixmaps in most platforms is in-
verted relative to the OpenGL, OpenGL ES, and OpenVG client API coordinate
systems. In such systems, native windows and pixmaps have (0, 0) in the upper
left of the pixmap, while the client APIs have (0, 0) in the lower left. To accomo-
date this, client API rendering to window and pixmap surfaces must invert their
own y coordinate when accessing the color buffer in the underlying native win-
dow or pixmap, so that the resulting images appear as intended by the application
when the final image is displayed by eglSwapBuffers or copied from a pixmap to
a visible window using native rendering APIs.

原生 render-gl 依赖于 native window system 实现 on-screen 渲染,其 frame buffer 的起始坐标为左下角; 而使用 frame buffer object 实现的 off-screen 渲染其坐标与 texture 保持一致,起始坐标为左上角,如下图所示:

请添加图片描述

weston 原生只支持基于 native window system 的渲染方式,故其已经做过 texture 顶点左上角至 default framebuffer 顶点左下角的适配了;而在引入 frame buffer object 之后, frmae buffer object 的顶点坐标重新变为左上角,而其逻辑却与之前保持一致,结果就是图像发生了180°倒置.

解决方案

解决这个问题的方案有很多种,因为归根结底是因为顶点坐标的 y 在最终渲染前没有进行一次正确的翻转;所以无论怎么样,只要能够完成一次正确的翻转,就能够解决问题; 大体上分为两大种解决方案:

  • 软件上进行适配
  • Vertex Shader 中修改顶点坐标

实际上第一次解决纹理倒置时使用的第一种方案,但是软件上的顶点倒置并没有那么简单,需要正确处理所有与之相关的业务逻辑;而有关与此的上下文又散落在各种零碎的代码片段,正确处理起来的难度实际上相当之大.

Vertex Shader 中修改坐标顶点实际上讲的就是修改 gl_Position, render-glVertex Shader 如下所示:

uniform mat4 proj;
attribute vec2 position;
attribute vec2 texcoord;
varying vec2 v_texcoord;

void main()
{
    gl_Position = proj * vec4(position, 0.0, 1.0);
    v_texcoord = texcoord;
}

要想正确地处理顶点坐标,就需要正确地处理 gl_Position, 有关于 gl_Postion 的描述可以参见 GLSLangSpec.4.60 :

The variable gl_Position is intended for writing the homogeneous vertex position. It can be written
at  any  time  during  shader  execution.  This  value  will  be  used  by  primitive  assembly,  clipping,
culling, and other fixed functionality operations, if present, that operate on primitives after vertex
processing  has  occurred.  Its  value  is  undefined  after  the  vertex  processing  stage  if  the  vertex
shader executable does not write gl_Position.

简单地将, gl_Position 是一个四元组,分别为 x、 y、 z 、w, 取值范围为 [-1, 1]; 对于上层用户而言,坐标应当是整数,比如我的屏幕尺寸是1080x1920,那么右下角的坐标就应当是 (1920, 1080),对应到 Vertex Shader 中即是 attribute position, 所以从 positiongl_Position 的过程中需要做一个归一化处理.

OpenGL 使用的坐标系并不是笛卡尔坐标系,即不是由 x, y, z 组成; 而是使用齐次坐标系,即由 x, y, z, w 组成; 当 w 恒为 1 时, 齐次坐标系等价于笛卡尔坐标系, 这里就是这种情况.

Vertex Shader 中, gL_Position 的结果由 proj 和由 position 组成的四元组相乘得到, 这里的相乘实际上一个矩阵运算,更具体一点是由 proj 这个 4x4 的矩阵与由 position 组成的 4x1 的矩阵得到 gl_Position 这个 4x1 且范围在 [-1, 1] 之间的矩阵.

proj 的全称为 projection, 在这里翻译成投影应该是比较合适的,它主要做了两件事:

  • 坐标映射 (Clamp)
  • 坐标旋转 (Rotate)

这两步可以通过 proj 来一起完成,用图示来表示如下:

请添加图片描述

所以实际上的解决办法就是修改 proj 这个矩阵的值,将其 (2,1) 位置的值由负修改为正,那么最终得到的顶点齐次坐标系的参考点就为左上角,或者也可以说是垂直翻转180°.

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

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

相关文章

2023届毕业生职场第一步:挡飞刀

这篇博客不会教你某一段代码怎么写,某一个知识点怎么入门,但却可以让你在2023年的职场上,躲避飞刀。 目录 1、啥是挡飞刀 2、其他知名大厂也好不到哪里去 3、 毕业生如何躲飞刀? 4、毕业生首选什么样的公司 5、不建议去这样的…

工具学习——ubuntu轻量桌面对比

因为最近要做一些ubuntu上的开发,然后使用ssh问题是经常会出现中断,虽然可以使用等tmux方法来挂起进程,但是感觉不如界面方便,然后现在问题来了,我的ubuntu服务器是一个双核的性能很差内存也少的机器,我怎么…

13-Golang中for循环的用法

Golang中for循环的用法for循环基本语法for循环流程图注意事项和使用细节for循环 就是让一段代码循环的执行。 基本语法 for循环变量初始化&#xff1b;循环条件&#xff1b;循环变量迭代{循环操作(语句)}package main import "fmt"func main(){for i : 1; i < …

C#,谷歌(Google)CityHash64与CityHash128散列哈希算法的C#源程序

1、CityHash简史 Google 2011年发布了 CityHash 系列字符串散列算法 。今天发布的有两种算法&#xff1a;CityHash64 与 CityHash128 。它们分别根据字串计算 64 和 128 位的散列值。这些算法不适用于加密&#xff0c;但适合用在散列表等处。 Google 一直在根据其数据中心常…

“刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!

很多人感染新冠后&#xff0c;咽痛、鼻塞、干咳和其他不适&#xff0c;非常不舒服&#xff0c;在网上讨论也总结了“刀片嗓”、“水泥鼻”、“咳出肺”三个字生动地展现了他们的不适。今天&#xff0c;对于这三种症状&#xff0c;今天就为大家带来一些缓解的小方法。 病症一&am…

机器学习中的评价指标

1.MSE&#xff08;mean squared error&#xff09; 叫做均方误差&#xff0c;又称L2损失。取平方有一个特性&#xff0c;它惩罚更大的错误更多&#xff08;毕竟都取平方了&#xff09;。方差一般用来计算样本的离散程度&#xff0c;而均方误差则可以用做衡量模型拟合的一个度量…

Linux串口编程详解(阻塞模式、非阻塞模式、select函数)

前言&#xff1a;之前一直觉得串口编程很简单&#xff0c;这两天仔细研究后发现串口里的各种参数还挺复杂&#xff0c;稍不注意就容易出错&#xff0c;这里总结一下网上的各种文章及自己的理解与实践。 open 函数 功能描述&#xff1a;用于打开或创建文件&#xff0c;成功则返…

【05】概率图表示之马尔可夫随机场

概率图表示之马尔可夫随机场 文章目录马尔可夫随机场正式定义与贝叶斯网络的比较马尔可夫随机场中的独立性条件随机场示例正式定义示例&#xff08;续&#xff09;CRF特性因子图贝叶斯网络可以以一种紧凑的方式表示许多概率分布。然而&#xff0c;我们在前一章中已经看到&…

笔试强训(8)

笔试题1:密码强度等级密码强度等级_牛客题霸_牛客网 在这个题中: 1)统计密码的长度直接通过length()来进行解决 2)统计大写字母和小写字母的个数分别在函数里面定义两个变量来进行解决 3)统计数字和富豪也是分别用两个变量来进行保存 import java.util.Scanner;// 注意类名必须…

记一次 Maven 打包后,第三方无法使用的排查记录

你好&#xff0c;我是悟空。 本文主要内容如下&#xff1a; 前言 最近遇到一个需求&#xff1a; 写一个工具类的 JAR 包&#xff0c;然后提供给第三方使用。 期间遇到了一些问题&#xff1a; 第三方引入 JAR 包后&#xff0c;无法 import。第三方引入 JAR 包后&#xff0c…

你可以不看世界杯,但你一定要知道这些

2022卡塔尔世界杯&#xff0c;阿根廷夺冠&#xff0c;举世沸腾。 ​夺冠之路&#xff0c;遍布荆棘 时隔36年&#xff0c;阿根廷再次夺得大力神杯&#xff0c;回望夺冠之路&#xff0c;坎坷遍布&#xff0c;荆棘丛生。 2006年夏天&#xff0c;梅西第一次参加世界杯。时任阿根廷…

Mybatis源码(一)获取数据源

前言 Mybatis做为一种半ORM框架&#xff08;半&#xff1a;需要手动写sql&#xff09;。ORM&#xff08;Object Relational Mapping&#xff09;的技术本质是&#xff1a;ORM框架将对象的值 映射到 对应数据库类型&#xff1a; 如 String -> varchar。 且mybatis分为两种实…

数字孪生核电站促进界面监测的应用实践

未来核电站将向着数字化、智能化发展,“少人值守、智能监测”会广泛应用于核电站运行管理。利用数字孪生技术,可以对实体核电站和孪生核电站的数据进行交换分析,促进核电站的运行管理和监测,更好地确保反应堆运行安全。 数字孪生核电站促进界面监测的应用实践 北京智汇云舟科技…

h5中使用微信分享

1.需要 绑定域名&#xff1a; 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”&#xff08;即访问前端项目对应的域名)。 2.在项目中引入sdk: 在需要调用 JS 接口的页面引入如下 JS 文件&#xff0c;&#xff08;支持https&#xff09;&#xff…

搭vue项目(初级版)

这个项目只有 会员管理和直播管理两个模块。创建两个模块是为了验证一下路由跳转。 下载项目&#xff1a; 可以到我的资源中下载压缩包 或者 git clone 前端项目搭建: 前端搭建的项目&#xff0c;仅供学习使用 1.安装vue-cli,全局只需要安装一次&#xff0c;如果安装过一次&am…

MyBatisPlus ---- 入门案例

MyBatisPlus ---- 入门案例1. 开发环境2. 创建数据库及表a>创建表b>添加数据3. 创建SpringBoot工程a>初始化工程b>引入依赖c>idea中安装lombok插件4. 编写代码a>配置application.ymlb>启动类c>添加实体d>添加mappere>测试f>添加日志1. 开发环…

了解 Oracle 中单引号与双引号的用法,一篇文章教会你!

无论测试或者开发&#xff0c;对数据库的增删改查都是家常便饭。但有些小知识是经常被忽略&#xff0c;却又不能不去了解的&#xff0c;例如单引号和双引号的用法和区别&#xff0c;看完这一篇&#xff0c;你肯定会有收获。 首先我们要区别一个概念&#xff0c;即单引号(‘)和双…

docker应用部署示例

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

如何通过文档管理控制合同管理

如何通过文档管理控制合同管理 如果您的公司处理的合同比以往任何时候都多&#xff0c;那么您并不孤单。这种指数级增长的原因包括日益增长的监管要求、供应链问题以及全球化带来的业务关系的复杂性。此外&#xff0c;员工更频繁地换工作&#xff0c;因此&#xff0c;需要管理更…

Unity实用小工具—以对象形式操作Sqlite

一、介绍 1.1、版本说明&#xff1a;使用的Unity版本为个人版2020.3.39&#xff0c;数据库为Sqlite&#xff08;一个轻量级跨平台数据库&#xff09;&#xff0c;Sqlite的查看管理工具可以在网上下载https://dbeaver.io/download/&#xff0c;可以直接保存下来使用。 1.2、数…