GPU 驱动程序究竟如何解释 GLSL 的“连贯”内存限定符以进行多通道渲染?

2023-12-25

GLSL 规范规定,对于“一致”内存限定符:“内存变量的读取和写入与其他着色器调用的读取和写入一致”.

实际上,我不确定现代 GPU 驱动程序如何解释多个渲染过程。当 GLSL 规范规定“其他着色器调用”时,这是指仅在当前通道期间运行的着色器调用,还是指过去或未来通道中任何可能的着色器调用?出于我的目的,我将通行证定义为“glBindFramebuffer-glViewPort-glUseProgram-glDrawABC-glDrawXYZ-glDraw123”循环;我目前在每个“渲染循环迭代”中执行 2 个这样的传递,但稍后每次迭代可能会执行更多传递。


当 GLSL 规范规定“其他着色器调用”时,这是指仅在当前通道期间运行的着色器调用,还是指过去或未来通道中任何可能的着色器调用?

它的意思正是它所说的:“其他着色器调用”。它可能是相同的程序代码。它可能是不同的代码。没关系:不是这个着色器调用。

通常,OpenGL 会为您处理同步,因为 OpenGL 可以相当轻松地跟踪同步。如果您映射一个缓冲区对象的范围,修改它,然后取消映射它,OpenGL 知道您(可能)更改了多少内容。如果您使用 glTexSubImage2D,它知道您更改了多少内容。如果您进行转换反馈,它可以准确地知道有多少数据写入了缓冲区。

如果您确实将反馈转换为缓冲区,然后将其绑定为顶点数据源,OpenGL 知道这将导致管道停顿。它必须等到变换反馈完成,然后清除一些缓存才能将缓冲区用于顶点数据。

当您处理图像加载/存储时,您失去这一切。由于很多内容都可以以完全随机、未知和不可知的方式编写,因此 OpenGL 通常对规则非常宽松,以便让您能够灵活地获得最大可能的性能。这会触发很多未定义的行为。

一般来说,您可以遵循的唯一规则是 OpenGL 4.2 规范第 2.11.13 节中概述的规则。最重要的一个(对于着色器到着色器的讨论)是舞台上的规则。如果您使用片段着色器,则可以安全地假设专门计算点/线/三角形的顶点着色器你的三角形已完成。因此,您可以自由加载它们存储的值。但只来自那些造就了你的人.

您的着色器无法假设先前渲染命令中执行的着色器已完成(我知道这听起来很奇怪,考虑到刚才所说的内容,但请记住:“仅来自那些使您成为可能的着色器”)。您的着色器不能假设在同一渲染命令中使用相同制服、图像、纹理等的同一着色器的其他调用已完成,除非上述情况适用。

您唯一可以假设的是,编写着色器实例本身使其对其自身可见。所以如果你做一个imageStore并做一个imageLoad到相同的内存位置通过同一个变量,那么您一定会得到相同的值。

好吧,除非有人同时写信给它。

您的着色器不能假设稍后的渲染命令将当然获取前一个写入的值(通过图像存储或原子更新)。不管多久之后!你将什么绑定到上下文并不重要。您上传或下载的内容并不重要(从技术上讲)。在某些情况下您可能会得到正确的行为,但未定义的行为仍然存在不明确的).

如果您需要这种保证,如果您需要发出一个渲染命令来获取由图像存储/原子更新写入的值,则必须在发出写入调用之后和发出读取调用之前的某个时间明确要求同步内存。这是用完成的glMemoryBarrier http://www.opengl.org/wiki/GLAPI/glMemoryBarrier.

因此,如果你渲染一些进行图像存储的东西,你cannot渲染使用存储数据的内容,直到发送适当的屏障(在着色器中显式或在 OpenGL 代码中显式发送)。这可能是图像加载操作。但它可以从着色器代码编写的缓冲区对象进行渲染。它可能是纹理获取。它可能正在对附加到 FBO 的图像进行混合。没关系;你做不到。

请注意,这适用于all处理图像加载/存储/原子的操作,而不仅仅是着色器操作。因此,如果您使用图像存储写入图像,则不一定会读取正确的数据,除非您使用GL_TEXTURE_UPDATE_BARRIER_BIT​障碍。

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

GPU 驱动程序究竟如何解释 GLSL 的“连贯”内存限定符以进行多通道渲染? 的相关文章

  • 存储 OpenGL 状态

    假设我正在尝试用 C 制作某种小型 opengl 图形引擎 我读过通过访问 opengl 状态glGet 函数可能非常昂贵 虽然访问 opengl 状态似乎是一个经常操作 并且强烈建议将 opengl 状态的副本存储在具有快速读 写访问权限
  • OpenGL ES 片段着色器显然不可能返回白色

    这是一个奇怪的现象 我有一个片段着色器 据我所知只能返回黑色或红色 但它将像素渲染为白色 如果我删除一根特定的线 它会返回我期望的颜色 它适用于 WebGL 但不适用于 Raspberry Pi 上的 OpenGL ES 这是着色器代码 如
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • 简单的openGL程序无法在ubuntu中链接

    我正在尝试进入 opengl 编程 但无法编译我的第一个非常非常简单的程序 链接过程每次都会失败 我发现这个答案 https stackoverflow com questions 859501 learning opengl in ubu
  • 如何在 Visual Studio 2012 中安装 GLUT 和 OpenGL?

    我今天刚安装了Visual Studio 2012 我想知道如何在该平台上安装GLUT和OpenGL OpenGL 应该已经存在 可能会缺少 Freeglut GLUT GLUT 现在已经非常过时并且没有得到积极的支持 所以你当然应该使用
  • wglCreateContextAttribsARB 函数崩溃

    我尝试写下代码 我有InitializeOGL 的代码 bool Ogl InitializeOGL bool vSync cout lt lt Init OpenGL lt
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • glColor4f() - alpha 值的效果

    我正在使用 glColor4f 令人惊讶的是 更改 alpha 即第四个参数 不会导致透明度发生任何变化 代码段是 const GLfloat squareVertices 0 5 0 5 0 0 0 5 0 5 0 0 0 5 0 5 0
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • 如何计算正切和副法线?

    谈谈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 世界空间中点光源的位置 例如
  • GL_COLOR_ATTACHMENT 有什么作用?

    我现在正在学习帧缓冲区 但我只是不明白颜色附件的作用 我了解帧缓冲区 第二个参数的意义是什么 glFramebufferTexture2D GL FRAMEBUFFER GL COLOR ATTACHMENT0 GL TEXTURE 2D
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • OpenGL什么时候完成函数中指针的处理?

    OpenGL有多项功能 http www opengl org wiki GLAPI glTexSubImage2D直接获取指针 他们中有一些从这些指针读取数据 http www opengl org wiki GLAPI glBuffer
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到

随机推荐