GLSL #define GL_SPIRV 100说明

2023-11-14

                              GLSL #define GL_SPIRV 100说明

 

版权

 

hankern

https://blog.csdn.net/hankern/article/details/90690297

 

Standard, Portable Intermediate Representation - V (SPIR-V)

OpenGL 4.6的最大变化就是 支持SPIR-V,一种用于GPU通用计算和图形学的中间语言,Khronos开发设计,最初是为OpenCL规范准备的,和下一代图形标准Vulkan差不多同时提出,也在不断发展完善。

 

SPIR-V是一种简单的二元中间语言,用于图形着色和计算内核。SPIR-V模块包含多个入口点,在入口点的调用树中具有潜在的共享函数。每个函数都包含基本块的控制流图(CFG),以及表示结构化控制流的可选指令。加载/存储指令用于访问声明的变量,其中包括所有输入/输出(IO)。绕过加载/存储的中间结果使用静态单一分配(SSA)表示。数据对象是用分层类型信息逻辑表示的:不存在聚合的扁平化或对物理寄存器组的分配等。可选的寻址模型确定是否可以使用常规指针操作,或者内存访问是纯逻辑的。

SPIR-V的目标是:

为出现在khronos shaders/kernels中的所有功能提供一种简单的二进制中间语言。
具有简洁、透明、独立的规范(章节规范和二进制形式)。
很容易映射到其他中间语言。
是API传递给驱动程序以设置着色器/内核的形式。
可以被新的高端语言的前端所瞄准。
允许脱机完成编译和反射的第一步。
足够低的级别,需要反向工程步骤来重新构造源代码。
通过启用共享工具来生成或操作它来提高可移植性。
允许将核心规范与特定于源语言的内置函数集分离。
减少应用程序运行时的编译时间。(在应用程序运行时消除大部分编译时间不是此中间语言的目标。目标特定的寄存器分配和调度仍然需要花费大量时间。)
允许脱机进行一些优化。

 

SPIR-V工作过程是这样的:

 

glsl代码是这样的

 
  1. #version 450

  2.  
  3. in vec4 color1;

  4. in vec4 multiplier;

  5. noperspective in vec4 color2;

  6. out vec4 color;

  7.  
  8. struct S {

  9. bool b;

  10. vec4 v[5];

  11. int i;

  12. };

  13.  
  14. uniform blockName {

  15. S s;

  16. bool cond;

  17. };

  18.  
  19. void main()

  20. {

  21. vec4 scale = vec4(1.0, 1.0, 2.0, 1.0);

  22.  
  23. if (cond)

  24. color = color1 + s.v[2];

  25. else

  26. color = sqrt(color2) * scale;

  27.  
  28. for (int i = 0; i < 4; ++i)

  29. color *= multiplier;

  30. }

翻译成SPIR-V是这样的

 
  1. ; Magic: 0x07230203 (SPIR-V)

  2. ; Version: 0x00010000 (Version: 1.0.0)

  3. ; Generator: 0x00080001 (Khronos Glslang Reference Front End; 1)

  4. ; Bound: 63

  5. ; Schema: 0

  6.  
  7. OpCapability Shader

  8. %1 = OpExtInstImport "GLSL.std.450"

  9. OpMemoryModel Logical GLSL450

  10. OpEntryPoint Fragment %4 "main" %31 %33 %42 %57

  11. OpExecutionMode %4 OriginLowerLeft

  12.  
  13. ; Debug information

  14. OpSource GLSL 450

  15. OpName %4 "main"

  16. OpName %9 "scale"

  17. OpName %17 "S"

  18. OpMemberName %17 0 "b"

  19. OpMemberName %17 1 "v"

  20. OpMemberName %17 2 "i"

  21. OpName %18 "blockName"

  22. OpMemberName %18 0 "s"

  23. OpMemberName %18 1 "cond"

  24. OpName %20 ""

  25. OpName %31 "color"

  26. OpName %33 "color1"

  27. OpName %42 "color2"

  28. OpName %48 "i"

  29. OpName %57 "multiplier"

  30.  
  31. ; Annotations (non-debug)

  32. OpDecorate %15 ArrayStride 16

  33. OpMemberDecorate %17 0 Offset 0

  34. OpMemberDecorate %17 1 Offset 16

  35. OpMemberDecorate %17 2 Offset 96

  36. OpMemberDecorate %18 0 Offset 0

  37. OpMemberDecorate %18 1 Offset 112

  38. OpDecorate %18 Block

  39. OpDecorate %20 DescriptorSet 0

  40. OpDecorate %42 NoPerspective

  41.  
  42. ; All types, variables, and constants

  43. %2 = OpTypeVoid

  44. %3 = OpTypeFunction %2 ; void ()

  45. %6 = OpTypeFloat 32 ; 32-bit float

  46. %7 = OpTypeVector %6 4 ; vec4

  47. %8 = OpTypePointer Function %7 ; function-local vec4*

  48. %10 = OpConstant %6 1

  49. %11 = OpConstant %6 2

  50. %12 = OpConstantComposite %7 %10 %10 %11 %10 ; vec4(1.0, 1.0, 2.0, 1.0)

  51. %13 = OpTypeInt 32 0 ; 32-bit int, sign-less

  52. %14 = OpConstant %13 5

  53. %15 = OpTypeArray %7 %14

  54. %16 = OpTypeInt 32 1

  55. %17 = OpTypeStruct %13 %15 %16

  56. %18 = OpTypeStruct %17 %13

  57. %19 = OpTypePointer Uniform %18

  58. %20 = OpVariable %19 Uniform

  59. %21 = OpConstant %16 1

  60. %22 = OpTypePointer Uniform %13

  61. %25 = OpTypeBool

  62. %26 = OpConstant %13 0

  63. %30 = OpTypePointer Output %7

  64. %31 = OpVariable %30 Output

  65. %32 = OpTypePointer Input %7

  66. %33 = OpVariable %32 Input

  67. %35 = OpConstant %16 0

  68. %36 = OpConstant %16 2

  69. %37 = OpTypePointer Uniform %7

  70. %42 = OpVariable %32 Input

  71. %47 = OpTypePointer Function %16

  72. %55 = OpConstant %16 4

  73. %57 = OpVariable %32 Input

  74.  
  75. ; All functions

  76. %4 = OpFunction %2 None %3 ; main()

  77. %5 = OpLabel

  78. %9 = OpVariable %8 Function

  79. %48 = OpVariable %47 Function

  80. OpStore %9 %12

  81. %23 = OpAccessChain %22 %20 %21 ; location of cond

  82. %24 = OpLoad %13 %23 ; load 32-bit int from cond

  83. %27 = OpINotEqual %25 %24 %26 ; convert to bool

  84. OpSelectionMerge %29 None ; structured if

  85. OpBranchConditional %27 %28 %41 ; if cond

  86. %28 = OpLabel ; then

  87. %34 = OpLoad %7 %33

  88. %38 = OpAccessChain %37 %20 %35 %21 %36 ; s.v[2]

  89. %39 = OpLoad %7 %38

  90. %40 = OpFAdd %7 %34 %39

  91. OpStore %31 %40

  92. OpBranch %29

  93. %41 = OpLabel ; else

  94. %43 = OpLoad %7 %42

  95. %44 = OpExtInst %7 %1 Sqrt %43 ; extended instruction sqrt

  96. %45 = OpLoad %7 %9

  97. %46 = OpFMul %7 %44 %45

  98. OpStore %31 %46

  99. OpBranch %29

  100. %29 = OpLabel ; endif

  101. OpStore %48 %35

  102. OpBranch %49

  103. %49 = OpLabel

  104. OpLoopMerge %51 %52 None ; structured loop

  105. OpBranch %53

  106. %53 = OpLabel

  107. %54 = OpLoad %16 %48

  108. %56 = OpSLessThan %25 %54 %55 ; i < 4 ?

  109. OpBranchConditional %56 %50 %51 ; body or break

  110. %50 = OpLabel ; body

  111. %58 = OpLoad %7 %57

  112. %59 = OpLoad %7 %31

  113. %60 = OpFMul %7 %59 %58

  114. OpStore %31 %60

  115. OpBranch %52

  116. %52 = OpLabel ; continue target

  117. %61 = OpLoad %16 %48

  118. %62 = OpIAdd %16 %61 %21 ; ++i

  119. OpStore %48 %62

  120. OpBranch %49 ; loop back

  121. %51 = OpLabel ; loop merge point

  122. OpReturn

  123. OpFunctionEnd

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL #define GL_SPIRV 100说明 的相关文章

  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • OpenGL - 自动生成 glDrawArrays 的索引/步幅参数

    我正在渲染一个包含大量数据点 gt 1M 的网格结构 我的数据结构如图所示 所以我的索引缓冲区的内容看起来像这样0 100 1 101 2 102 3 103 我对索引缓冲区的巨大尺寸有点恼火 我需要它来定义我的三角形带 是否有可能告诉 O
  • 丢弃对 OpenGL 中的程序性能有影响吗?

    我正在读书this http code google com p gdc2011 android opengl wiki TalkTranscript文章 作者写道 以下是如何通过两个简单的步骤在每个平台上编写高性能应用程序 遵循最佳实践
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 与整数纹理进行 Alpha 混合以进行对象拾取

    问题描述 你好 在我们的 WebGL 应用程序中 我们正在绘制许多 甚至数十万 形状 并且我们想要发现当前鼠标位于哪个形状 我正在寻找一种有效的方法 Details 形状定义为有符号距离函数 https en wikipedia org w
  • GPU-android opengl es 3.0中的亮度直方图计算

    用于亮度直方图计算 我使用了 Brad Larson 的 GPU image ios 项目中的代码 他使用混合进行直方图计算 连接顶点和片段着色器 顶点着色器 version 300 es in vec4 position out vec3
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • iPhone glShader二进制

    有谁有如何编译着色器 保存着色器二进制文件以及使用 glShaderBinary 稍后使用 iPhone iOS OpenGL ES 2 0 加载着色器的示例 这是不可能的 至少对于 iOS 4 及更低版本 iOS 不支持任何预编译的二进制
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

    根据我的理解 要在 OpenGL 中进行镜像 您基本上需要绘制场景 然后将所有内容翻转并再次绘制 只是使其通过镜子可见 从而在镜子中创建完美翻转的图像 但我看到的问题是 执行此操作时 唯一可以看到其他镜子的镜子是在前一个镜子之后渲染的镜子
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被

随机推荐

  • 成员变量与局部变量

    一 成员变量 在类中定义 用来描述对象将要有什么 二 局部变量 在类的方法中定义 在方法中临时保存数据 三 成员变量和局部变量的区别 1 作用域不同 局部变量的作用域仅限于定义它的方法 成员变量的作用域在整个类内部都是可见的 2 初始值不同
  • 【总结】爬虫流程

    爬虫流程 根据所需数据确定爬虫网页 首先考虑resquests 需要提前导入 1 若是文本数据 用response text 2 若是下载视频 图片 音频 用response content 3 若是json接口 用response jso
  • CSS整体界面设计

  • RBAC简介

    RBAC BAC基于角色的访问控制 RBAC认为权限授权的过程可以抽象地概括为 Who是否可以对What进行How的访问操作 RBAC简介 基于角色的权限访问控制模型 在RBAC模型里面 有3个基础组成部分 分别是 用户 角色和权限 RBA
  • Java多线程异常处理

    文章目录 一 线程中出现异常的处理 1 线程出现异常的默认行为 2 setUncaoughtExceptionHandler 方法处理异常 3 setDefaultUncaoughtExceptionHandler 方法进行异常处理 二 线
  • vue3.0的安装配置(含node和npm的配置)

    文章目录 一 下载Node js 二 配置环境变量 三 配置NPM下载存放目录 文件不用事先创建 四 NPM设置镜像仓库 淘宝镜像仓库 五 vue cli脚手架创建Vue3 0项目 一 下载Node js 下载地址 二 配置环境变量 在CM
  • SpringBoot自定义错误页面 与 全局异常处理

    Springboot中需要自定义错误页面 一 使用Springboot默认的配置 1 在templates下穿件一个目录 error 2 在error目录下创建相应的对应的文件即可 如 400 html 500 html 二 自定义错误页面
  • 南大和中大“合体”拯救手残党:基于GAN的PI-REC重构网络,终于有救了

    对于喜欢画画的你来说 总是画得七零八落 不堪入目 但现在 有一种方法可以让你像专业人士那样 让你的糟糕画作变成一副完美的作品 南京大学和中山大学的三位研究人员发布的最新论文中 提出了一种具有边缘和色域的渐进式图像重构网络 PI REC 这是
  • 系统辨识——最小二乘法

    基本原理 数学推导 最小二乘法是通过输入数据与输出数据来拟合已知结构的函数关系 也就是说已知二者的函数关系 通过最小二乘法估计函数的相关参数 假设 x y x y x y存在以下函数关系 但是在实际中 测量数据时存在测量误差或者噪声影响 故
  • pthread 的几个结构体

    Copyright C 2002 2003 2004 2005 2006 2007 Free Software Foundation Inc This file is part of the GNU C Library Contribute
  • Google人机认证解决方法

    针对Chrome浏览器 下载gooreplacer 下载地址1 下载地址2 安装 gooreplacer crx Chrome无法从该网站添加应用 扩展程序和用户脚本 将 crx后缀改为 rar 之后开发者模式安装 重定向网址 重定向 将网
  • cad添加自己线性_创建cad线型的两种方法(线型文件和linetype) - CAD自学网

    作图过程中 我们最常见的线型是实线 虚线 点划线 有的时候这些基本线型可能满足不了你的需求 CAD也有自带的特殊线型 比如 HW 这种自带文字的线型 但你想要的确实 X 那么这便涉及到新线型的建立 建立新线型有两种方法 直接修改线型文档和通
  • CSTrack: Rethinking the competition between detection and ReID in Multi-Object Tracking

    CSTrack Rethinking the competition between detection and ReID in Multi Object Tracking 论文链接 https arxiv org abs 2010 121
  • 什么是标称属性?什么是二元属性?什么是序数属性?

    什么是属性 属性是一个数据字段 表示数据对象的一个特征 一个属性的类型由该属性可能具有的值的集合决定 标称属性 标称意味着 与名称有关 标称属性的值是一些符号或者是事物的名称 每个值代表某种类别 编码或者状态 尽管标称属性有数值 但是不能把
  • 全面剖析《自己动手写操作系统》第四章--FAT12文件系统

    一 FAT12 FAT12是DOS时代就开始使用的文件系统 File System 直到现在仍然在软盘上使用 FAT12软盘的被格式化后为 有两个磁头 每个磁头80个柱面 磁道 每个柱面有18个扇区 每个扇区512个字节空间 所以标准软盘的
  • Android Google Maps 开始

    由于工作需要 最近对Android的各大地图进行了试用 其中有Google地图 百度地图 高德地图 还有开源的OSM 在使用Google地图的时候 官网流程写的非常清楚 但是其中也遇到一些问题 这里我将我的流程写出来 方便他人 这个是官方安
  • 【C++】Boost::circular_buffer——循环缓冲区

    参考 Boost circular buffer 循环缓冲区 一 概述 Boost Circular buffer维护了一块连续内存块作为缓存区 当缓存区内的数据存满时 继续存入数据就覆盖掉旧的数据 它是一个与STL兼容的容器 类似于 st
  • golang json性能分析详解

    原文地址 https www jb51 net article 135264 htm json格式可以算我们日常最常用的序列化格式之一了 Go语言作为一个由Google开发 号称互联网的C语言的语言 自然也对JSON格式支持很好 下面这篇文
  • 基于决策树算法构建员工离职预测模型

    1 1背景介绍 每一个公司都会面临着人才管理的问题 而许多企业在发展中辛苦培养发展起来的技术人才 却不断流失 那么 如何调整公司管理制度 才能最大化保证员工的留任与能力发展 从而促进公司业务持续增长呢 本课程介绍收集了某公司人才流失各方面的
  • GLSL #define GL_SPIRV 100说明

    GLSL define GL SPIRV 100说明 版权 hankern https blog csdn net hankern article details 90690297 Standard Portable Intermediat