OpenGL的着色器内存访问

着色器内存访问 Shader Memory Access

着色器在高度流水线化的系统中执行时,由于其读写操作的顺序在很大程度上未定义,可能会引发排序和同步问题。

  1. 着色器内存访问顺序

    • 对于顶点着色器和细分评估着色器,尽管对于应用程序指定的每个唯一顶点至少执行一次,但在某些情况下可能因实现相关的因素而多次执行。
    • 片段着色器的执行次数取决于多种因素,如像素所有权测试、剪裁测试结果及多重采样片段操作的影响;启用早期每片段测试时,若片段在早期测试阶段被丢弃,则不会执行片段着色器。当帧缓冲区不包含多重采样缓冲时,每个片段仅执行一次着色器调用;否则,根据覆盖的样本数,调用次数在1到N之间,如果声明了按样本着色,则精确执行N次。
    • 若片段着色器处理的是由几何着色器生成的但并未被当前正在光栅化处理的图元覆盖的片段或样本,那么存储操作、原子操作和原子计数器更新将无效。
    • 同一类型的着色器调用之间的相对顺序是未定义的,不同着色器类型的调用顺序也是如此。不过,一个着色器阶段产生的输出作为下一阶段输入时,保证前一阶段的所有着色器调用已经执行完毕并生成最终值。
  2. 着色器内存访问同步

    • 着色器调用间由于限制导致无法在单一图元集合内部实现某种形式的同步。例如,一个调用依赖另一个调用写入的内存时,不能确保另一个调用已经被启动且完成写入。
    • 在单个着色器调用内部针对不同内存位置发出的存储指令可能不会按照执行顺序对其他调用可见。
    • 内置函数memoryBarrier可用于提供单个着色器调用内读写操作的更强排序保证。调用memoryBarrier后,可以确保调用之前的所有内存事务在调用之后的事务之前完成。
    • 原子内存交易和原子计数器内置函数允许着色器以原子方式读写给定内存地址,并确保在这次读取和写入之间不会有其他内存事务对底层内存进行写入。
  3. 显式同步要求

    • 着色器对纹理或缓冲对象的写入可能被其他着色器调用、固定管线其他阶段或者应用程序读取。为了避免自动同步带来的性能开销,OpenGL实现不为着色器执行的缓冲区和纹理存储操作自动与其他使用相同内存的GL操作进行同步,而是需要显式同步来确保这些存储操作的效果对后续操作可见,且不会覆写先前请求的操作尚未读取的数据。
  4. MemoryBarrier命令

    • MemoryBarrier命令定义了一个屏障,用于规定命令之前和之后发出的内存事务之间的相对顺序。该命令接受一个标志位参数barriers,用于指定与着色器存储操作同步的操作集。不同的标志位分别影响特定类型的数据同步,如顶点属性数组、元素索引数组、统一变量、纹理获取、着色器内建图像访问、命令数据、像素缓冲、纹理更新、缓冲区更新、持久映射缓冲区、查询缓冲、帧缓冲、变换反馈、原子计数器和着色器存储等。
  5. Coherent内存访问

    • OpenGL着色语言中的图像变量可声明为coherent,以便独立的着色器调用通过读写共同内存地址进行通信。使用coherent声明的变量访问的缓冲对象或纹理图像内存将在任何其他着色器调用发出存储时自动更新缓存。
    • 使用coherent变量和MemoryBarrier命令的选择应基于数据共享的需求和场景,例如,细粒度共享数据应在生产者和消费者着色器中均使用coherent变量,而在多个渲染通道间传递数据则需在通道间调用带相应屏障标志的MemoryBarrier
  6. MemoryBarrierByRegion命令

    • 该命令提供了更细粒度的同步功能,它只考虑帧缓冲区较小区域内的片段着色器读写操作的完成和反映,并且只适用于可能被片段着色器读取或写入的内存交易。支持的屏障标志比特包括与片段着色器相关的部分屏障类型,相比MemoryBarrier而言,它对于散点/聚集类算法的读写操作的完成和反映并不一定适用,但在某些场景(如延迟着色)下,能够针对特定帧缓冲区地址上的前后执行进行更有效的同步。

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

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

相关文章

【jenkins】主从机制及添加Slave节点操作

一、master-slave 日常构建Jenkins任务中,会经常出现下面的情况: 自动化测试需要消耗大量的 CPU 和内存资源,如果服务器上还有其他的服务,可能会造成卡顿或者宕机这样的情况; Jenkins 平台上除了这个项目&#xff0c…

【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】

前言 大家好吖,欢迎来到 YY 滴Linux 系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

单调队列优化DP,LeetCode1696. 跳跃游戏 VI

一、题目 1、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i 1, min(n - 1, i k)] 包含 两个…

开源软件在技术革新和行业变革中的作用

引言: 在数字化浪潮推动下,开源软件以其独特的魅力重构了软件开发的生态系统,成为技术创新和行业变革的催化剂。它通过低成本、高协作性、极致透明度的特征,成为企业和个人的首选。本文将深度探讨开源软件的影响力,展…

【C++刷题】二叉树的深搜

二叉树的深搜 一、计算布尔二叉树的值1、题目描述2、代码3、解析 二、求根节点到叶节点数字之和1、题目描述2、代码3、解析 三、二叉树剪枝1、题目描述2、代码3、解析 四、验证二叉搜索树1、题目描述2、代码3、解析 五、二叉搜索树中第K小的元素1、题目描述2、代码3、解析 六、…

16.docker删除redis缓存数据、redis常用基本命令

1.进入redis容器内部 (1)筛选过滤出redis容器 docker ps | grep "redis"(2)进入redis容器 #说明:d24为redis容器iddocker exec -it d24 /bin/bash2.登陆redis (1) 进入redis命令行界面 redis-cli说明&a…

重写Sylar基于协程的服务器(7、TcpServer HttpServer的设计与实现)

重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务…

算法随想录第五十一天打卡|309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费 ,总结

309.最佳买卖股票时机含冷冻期 本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰 视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖…

CAN通信----(创芯科技)CAN分析仪----转CANTest使用

点击进入官方链接进行下载创芯科技 CAN分析仪资料包: 创芯科技的官网:https://m.zhcxgd.com/ 我使用的是至尊版红色带OBD转接头的: 所有下图是我选择…

MyBatis一些常见知识点!

什么是 ORM 框架? MyBatis 有哪些优缺点? 典型回答: ORM(Object-Relational Mapping,对象关系映射)框架是一种将关系型数据库中的数据 与 应用程序中的对象进行映射的技术。它通过在程序代码中定义的类和属…

c语言--assert断言(详解)

目录 一、断言的概念二、assert断言2.1 代码12.1.1运行结果2.1.2分析 2.2代码22.2.1运行结果2.2.2分析2.3代码32.3.1运行结果及其分析 三、优点四、缺点五、注意 一、断言的概念 assert.h 头⽂件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如…

酷开系统 | 拓展内容营销边界,酷开科技大屏价值全面升维

丰富的内容是智能大屏吸引消费者的关键。随着智能大屏各类垂直应用的增多,和长、短视频等多元内容的加入,使消费者的使用需求进一步激发和释放,这些流量的加入,也使大屏成为了营销的天然宝藏。酷开科技一直致力于OTT大屏营销&…

9个Linux 查看系统硬件信息命令(实例详解)

在Linux下,我们精要遇到需要查看系统的硬件信息, 这里我罗列了查看系统硬件信息的实用命令,并做了分类,实例解说。 执行环境:ubuntu 16.04 1. cpu lscpu命令,查看的是cpu的统计信息. rootubuntu:/home/…

Hive与PrestoSQL中的并列列转行

并列列转行 1、背景描述2、Hive实现3、PrestoSQL实现 1、背景描述 通常我们在处理数据时,如果遇到一个字段存储多个值,常常需要把一行数据转换为多行数据,形成标准的结构化数据 例如,将下面的两列数据并列转换为三行,…

使用CHATGPT进行论文写作的缺点和风险

为了真正感受 ChatGPT 的写作潜力,让我们先将其与传统的论文写作方法进行一下比较分析 CHATGPT论文写作的缺点和风险 传统论文写作的考验和磨难很深:费力的研究、组织想法和精心设计的逻辑论证,往往以牺牲你的理智为代价。 进入ChatGPT&am…

【复现】WordPress html5-video-player SQL 注入漏洞_39

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 在WordPress中播放各种视频文件。一个简单,可访问,易于使用和完全可定制的视频播放器,适用于所…

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果(升级版) 7.P1618 三连击&…

go消息队列RabbitMQ - 订阅模式-fanout

1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…

c++阶梯之类与对象(中)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 构造函数概念的引出 2.2 构造函数的特性 3. 析构函数 3.1 析构函数的概念 3.2 特性 未使用构造与析构的版本 使用了构造与析构函数的版本 4. 拷贝构造函数 4.1 拷贝构造函数的概念 4.2 特性 结语 本节我们来认识…

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话,可以帮助用户完成任务或寻求信息。随着深度学习的最新进展,聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人,涵盖模型架构、数据准备、训练循环…