首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >YUYV OpenGL片段着色机

YUYV OpenGL片段着色机
EN

Code Review用户
提问于 2015-04-27 15:29:55
回答 1查看 3.4K关注 0票数 2

我制作了一个着色器来显示YUYV表面(数据排列为: Y0 U0 Y1 V0)。这是可行的,但我不知道任何关于着色器,或openGL,或任何图形相关的事情,事实上。我觉得我更像是一个疯狂的科学家,把随机的代码拼凑在一起,而不是程序员。因此,如果有人能查一查,告诉我我能改进什么,性能上,逻辑上还是语法上,我会很感激。我也有一些问题:

  • 这将在哪些桌面硬件上工作?是否有任何限制,或它会在任何10年前的桌面上工作?
  • 这在android平板电脑上能用吗?
  • 如果我的渲染表面和纹理大小相同,会进行像素插值吗?是否有可能有插补(有一些标志,而不是通过实现)?

我将YUYV纹理作为width/2的RGBA纹理通过height加载。其余的应该是不言自明的:

代码语言:javascript
运行
AI代码解释
复制
#version 330 core
uniform sampler2D tex;
uniform mat4 convMat; /* Color conversion matrix */
uniform vec2 dim; /* Width and height of image */
in vec2 UV;
out vec3 color;

void main(){
    vec4 yuv;
    ivec2 iUV = ivec2(UV*dim*vec2(0.5, 1)); /* Absolute coordinate of desired pixel in texture */

    yuv = texelFetch(texy, iUV, 0);
    if (int(UV.x*dim.x) % 2 == 1){
        /* There are 2 Y in a texture RGBA pixel, choose the right one based on absolute pixel coordinate */
        yuv.x = yuv.z;
    };
    yuv.z = yuv.w;
    yuv.w = 1;
    color = (convMat*yuv).rgb;
};
EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-27 20:36:08

好吧,据我所知,试着回答你的几个问题:

这将在哪些桌面硬件上工作?是否有任何限制,或它会在任何10年前的桌面上工作?

可能不是在10溜溜的电脑里。您的代码目前的目标是GLSL版本3.3,该版本大约在2010年发布。您可以检查版本历史记录这里。但是,如果需要向后兼容,则可以对此代码进行更改,以针对较早的OpenGL版本。我会在结尾提到这些。

这在android平板电脑上能用吗?

不是的。安卓设备使用OpenGL-ES,这是桌面OpenGL 2.0版本的一个变体。您将不会有texelFetch()函数,也不会在当前的OpenGL中使用iOS和Android设备中的整数类型。

如果我的渲染表面和纹理大小相同,会进行像素插值吗?是否有可能有插补(有一些标志,而不是通过实现)?

你所说的插值到底是什么意思?你说的是纹理滤波吗?通过使用texelFetch(),您已经选择了退出纹理过滤。不过,我不清楚你为什么这么做。如果您要将纹理采样切换到像texture() (或者texture2D,如果针对旧版本)这样的函数,您将能够进行过滤查找并避免不可移植的texelFetch()texture()/texture2D()还将UV作为归一化的0-1范围纹理坐标,因此它将消除整数转换,从而使您的着色器更快。

向后兼容性:正如我前面提到的,您可以通过用OpenGL替换texelFetch()来使此代码向后兼容旧的texture()/texture2D()版本。这对于当前的OpenGL-ES公司也是必要的。您还必须删除任何整数转换。较老的OpenGL和OpenGL-ES硬件只能在浮点类型上操作!(无intivec)。

对性能的评论:在许多图形硬件上,分支仍然是一项昂贵的操作。因此,这里最明显的改进是消除条件if测试。你也许可以用几个聪明的技巧来完成它。也许mod函数会有所帮助。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/88174

复制
相关文章
GTX/GTH/GTY/GTP/GTZ/GTM有什么区别?
  不同芯片上使用的高速收发器也不同,而且同样是GTX,不同系列芯片上的速率也可能不同。
猫叔Rex
2022/01/24
1.8K0
GTX/GTH/GTY/GTP/GTZ/GTM有什么区别?
都是net,有什么区别
pin与pin之间都是通过net相连的,可以看到net举足轻重的地位。通过net可以找到与之相连的pin或cell,而net本身也有一些重要的属性。
Lauren的FPGA
2020/02/17
1.6K0
都是net,有什么区别
都是pin,有什么区别
打开任何阶段的DCP,选中一个cell,按F4,都会显示其Schematic视图。在这个视图中,可以清楚地看到每个cell的pin。小到一个触发器、查找表,大到用户的RTL模块甚至整个顶层设计,都有相应的pin。这里,我们重点了解一下pin的特征,借助这些特征可以帮助我们高效地搜到到目标pin。
Lauren的FPGA
2020/02/17
3.8K0
都是pin,有什么区别
网站https证书种类有哪些?有什么区别
  网站https证书可分为2大类,一类按照验证方式进行分类,即:DV SSL证书、OV SSL证书、EV SSL证书。另一类按照域名数量进行分类,即:单域名SSL证书、多域名SSL证书、通配符证书。
安信SSL证书
2019/07/31
5.5K0
网站https证书种类有哪些?有什么区别
蓝牙和WiFi有什么区别?
如果您拥有手机、笔记本电脑、计算机或任何其他现代电子设备,知道蓝牙和 WiFi 。
网络技术联盟站
2021/11/05
2.2K0
蓝牙和WiFi有什么区别?
OracleJDK和OpenJDK有什么区别?
Oracle JDK与OpenJDK里的JVM都是HotSpot VM。从源码层面说,两者基本上是同一个东西。
码农架构
2021/09/18
2K0
OracleJDK和OpenJDK有什么区别?
Closeable和AutoCloseable有什么区别?
导读:我们知道,在java中jvm虚拟机会自动去调用gc(垃圾回收器)去回收堆中没有被引用的对象,至于什么时候回收,是不确定的,同时有些是用到其他资源,jvm也不会进行回收,类似Io流中的FileInputStream使用到了硬盘资源,垃圾回收器是不会去回收的,因此,必须手动关闭掉。我们进行手动的编写close()方法进行关闭,然而,每次这些写会造成代码冗余不优雅,JDK中对于释放资源有Closeable和AutoCloseable可以使用,以下为详解。
码农架构
2021/04/22
3.2K0
Closeable和AutoCloseable有什么区别?
String、StringBuffer、StringBuilder有什么区别?
String 是 Java 语言非常基础和重要的类, 提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
葆宁
2019/04/18
4660
Exception和Error有什么区别?
世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确处理好意外情况,才能保证程序的
灬沙师弟
2022/09/06
1.5K0
int和Integer有什么区别?
Java虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等Java语言特性。
灬沙师弟
2022/10/07
4.1K1
kubernetes和docker有什么区别
本教程操作环境:linux5.9.8系统、docker-1.13.1版、Dell G3电脑。
码农编程进阶笔记
2023/03/23
2.1K0
kubernetes和docker有什么区别
声明和定义有什么区别
问题 C/C++ 中,声明和定义有什么区别? 回答 1. 声明不分配存储空间,定义会分配。 定义会实实在在地创造这个东西,而声明只是告诉编译器有这么个东西,它的创造在别处。 extern int bar; // 声明 extern int g(int, int); // 声明 double f(int, double); // 声明 class foo; // 声明 int bar; // 定义 int g(int lhs, int rhs) {return lhs*rhs;} // 定义 double
ClearSeve
2022/02/11
1.6K0
沪市和深市有什么区别?
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168351.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
1.6K0
列表和元组有什么区别
如果有了解过python中的列表和元组,你可能会知道相对于列表,元组是不可变的,也就是说元组中的数据不能随意更改。除了列表是用中括号表示而元组是用小括号表示之外,这两种数据类型好像并没有什么不同,都是用来存放一系列的数据,事实真是如此吗? TypeError Traceback (most recent call last) in() 4 5 # 现在改变b中数据的值 — 6 b[2] = 4 TypeError: ‘tuple’ obje
企鹅号小编
2018/02/26
2K0
列表和元组有什么区别
Jsp和Servlet有什么区别?
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
李红
2019/08/28
2.5K0
Jsp和Servlet有什么区别?
集群 跟 分片 有什么区别
而 redis  这样的 “集群” 强调的是  数据 ,(因为redis 主要是来存数据的嘛)
矿泉水
2018/05/21
2.7K0
Exception和Error 有什么区别
checkedException 一般是外部错误,这个异常发生在编译阶段。Java 编译器会强制去捕获此类异常。一般会要求把这段可能出现的异常程序进行 try catch。
王小明_HIT
2019/10/15
1.7K0
final 、finally、finalize有什么区别
finall 是Java中保证代码一定要被执行的一种机制,我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭JDBC,unlock 锁等动作。
王小明_HIT
2019/11/04
8340
int 和 Integer 有什么区别?
int 是 java 的原始数据类型,Integer 是 java 为 int 提供的封装类。
MickyInvQ
2020/09/27
1.6K0
集群 跟 分片 有什么区别
而 redis  这样的 “集群” 强调的是  数据 ,(因为redis 主要是来存数据的嘛)
用户2141593
2019/02/20
7850

相似问题

BreakPointObserver角

34

BreakpointObserver不点火

10

wolfSSL对MBEDTLS对OpenSSL -有什么区别?

16

IoTivity对AllJoyn -有什么区别?

617

$dirty对$invalid:有什么区别?

53
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文