关于 OpenGL 不变限定符的困惑

2024-02-19

我在翻阅橙皮书(第 3 版)时,在第 9 章中发现了一段关于不变限定符的段落。它说:

The 不变的限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数。

这段话出现在两个类似的代码片段之后:

uniform mat4 MVPmatrix;
// ...

in vec4 MCVertex;
// ...

a(); // does not modify gl_Position, MVP or MCVertex

// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;

and

uniform mat4 MVPmatrix;
// ...

invariant gl_Position;
in vec4 MCVertex;
// ...

a(); // does not modify gl_Position, MVP or MCVertex

// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;

该书接着指出:

第一种情况可能会或可能不会以完全相同的方式计算变换位置,无论什么不相关的函数或表达式链接到着色器。如果使用多通道算法多次渲染相同的几何体,这可能会导致渲染出现问题。

这让我很困惑。如果a()绝对不会影响计算变换位置所涉及的变量,那么计算会如何变化? (以及到底如何添加invariant帮忙吗?)。参考第一句话,“忽略不相关的功能”到底是什么意思?他们只是不被处决吗?


的目的invariant是为了确保您所做的计算始终会产生相同的结果,无论着色器优化器对着色器执行什么操作(尤其是跨多个着色器编译)。

我发现橙皮书的措辞很差(并且具有误导性,正如您所指出的)。 GLSL 规范(语言 1.2)第 4.6 节更加清晰:

在本节中,方差是指获得的可能性 不同程序中相同表达式的不同值。为了 例如,假设有两个顶点着色器,在不同的程序中,每组 gl_Position 在两个着色器中具有相同的表达式,并且输入 当两个着色器运行时,该表达式中的值是相同的。这是 由于两个着色器的独立编译,有可能 当两个值分配给 gl_Position 的值不完全相同时 着色器运行。在此示例中,这可能会导致对齐问题 多通道算法中的几何形状。一般来说,这样的方差 着色器之间是允许的。当这样的方差不存在时 特定的输出变量,该变量被称为不变的。

它继续解释说invariant限定符可以保证您避免此问题。

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

关于 OpenGL 不变限定符的困惑 的相关文章

  • 给定焦点和相机主中心,如何创建透视投影矩阵

    我设法使用 OpenCV 获取相机的内在和外在参数 因此我有 fx fy cx 和 cy 我还有屏幕 图像的宽度和高度 但是如何根据这些参数创建 OpenGL 透视投影矩阵呢 glFrustum 展示了如何在给定 Z 近 Z 远以及图像宽度
  • glBitmap 问题

    我正在使用一些遗留代码来工作 它使用 glBitmap 调用来绘制位图图标 我的问题是 一旦你一次绘制大约 1000 个图标 它就会变得相当慢 它会减慢到大约 1 到 2 秒的刷新率 我想看看是否可以让它更快 首先我应该描述当前代码是如何工
  • 从活动顶点数组生成平滑法线

    我正在尝试通过挂钩 OpenGl 调用来破解和修改旧版 opengl 固定管道游戏的多个渲染功能 而我当前的任务是实现着色器照明 我已经创建了一个适当的着色器程序 可以正确照亮大部分对象 但该游戏的地形是在没有提供正常数据的情况下绘制的 游
  • 模拟绘画应用的笔触

    我正在尝试编写一个应用程序 可用于使用模拟笔触创建看起来像绘画的图片 是否有任何好的资源可以提供模拟笔触的简单方法 例如 给定用户拖动鼠标经过的鼠标位置列表 画笔宽度和画笔纹理 如何确定要在画布上绘制的内容 我尝试将画笔纹理倾斜到鼠标移动的
  • LWJGL 窗口具有透明背景?

    我想创建一个没有 黑色背景 区域的窗口 但您可以看到任何其他打开的窗口等 也就是说 渲染场景并且仅渲染场景 不留框架 不留背景区域 我读过一种方法 该方法涉及渲染到隐藏的 OpenGL 窗口并将其缓冲在内存中 创建透明分层窗口以及从内存复制
  • glGenerateMipmap 是否在 sRGB 纹理的线性空间中执行平均?

    OpenGL 3 3 规范似乎没有要求 mipmap 生成在线性空间中完成 我能找到的只有以下内容 派生的 mipmap 数组的内部格式都与 levelbase 数组和派生数组的维度如下 第 3 8 14 节中描述的要求 的内容 派生数组是
  • VBO - 没有指数化的指数化

    我正在尝试将 VBO 与元素数组缓冲区一起用于我的三角形 如下所示 glBindBuffer GL ARRAY BUFFER g Buffer 0 glVertexPointer 3 GL FLOAT 0 BUFFER OFFSET 0 g
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis

随机推荐

  • Cassandra 错误 - 无法限制聚类列(前一列受非 EQ 关系限制)

    我们使用 Cassandra 作为车队管理解决方案的数据历史记录 我们在 Cassandra 中有一张表 用于存储车辆行程的详细信息 表结构如下 CREATE TABLE journeydetails bucketid text vehic
  • 使用 Javascript 隐藏 iPhone 的键盘

    有谁知道如何hide用户触摸按钮 开始 而不是 完成 后 iPhone 在 Safari 中的键盘 我需要 Javascript 和 HTML5 的解决方案 使用 jQuery 您应该取消单击按钮的输入焦点 button id clicke
  • Python 3.9 和 3.10 之间 level=0 的 zlib 大小差异

    在这段代码中 使用 zlib 对一些数据进行编码 但 level 0 因此它实际上并未被压缩 import zlib print zlib ZLIB VERSION zlib ZLIB VERSION total 0 print Total
  • 使用 Mockito 模拟具有泛型参数的类

    是否有一种干净的方法来模拟带有泛型参数的类 假设我必须模拟一堂课Foo
  • 如何在 TypeScript 中删除数组项?

    我有一个在 TypeScript 中创建的数组 它有一个用作键的属性 如果我有该密钥 我如何从中删除项目 与 JavaScript 中的方式相同 delete myArray key 请注意 这将元素设置为undefined 更好地使用Ar
  • 如何正确使用drawMyLocation

    我试图用 android 中的默认蓝点向用户显示当前位置 在我的地图页面中 我还有一个显示不同兴趣点的布局 我无法弄清楚要为某些变量添加什么 并且想知道是否有人可以帮助我 这就是我到目前为止用来显示我的位置的方法 Location loca
  • 从完成处理程序返回值 - Swift

    我在实用程序类中使用 loadImage 方法 并且在通过闭包返回图像时遇到一些问题 基本上因为我的代码可能返回图像或错误 所以在调用方法时将其分配给图像属性将不起作用 我在类的方法声明中使用的方法是否错误 或者我应该以不同的方式调用该方法
  • 我的 ffmpeg 输出总是在最后添加额外的 30 秒静音

    这是我用来将 1 个音频和 1 个图像合并为 1 个视频的代码 参数 由于某种原因 无论来源如何 它都会在输出视频的末尾添加 30 秒的静音 我在 Win10 x64 上运行它 安装了最新的 ffmpeg 我检查了代码 但无法确定它在哪里造
  • 自动在句点和逗号后添加空格,同时避免数字

    这是当前的正则表达式 当人们写下以下内容时 我用它来清理句子 你好 我是安德烈斯 对吗 它将自动转换为 你好 我是安德烈斯 对吧 当字符串中有数字时就会出现问题 例子 我有 40 381 32 美元 将转换为 我有 40 381 32 美元
  • 无法找到资源

    我不确切知道这是否是一个错误 但我一直收到运行时 IOException 错误 指出无法找到资源 我正在画布背景中的应用程序 c WPF 中加载一些图像 具体取决于数据库状态 问题是 我无法加载最后一个 按字母顺序排序 文件 例如 我的文件
  • iOS - 缩放和裁剪 CMSampleBufferRef/CVImageBufferRef

    我正在使用 AVFoundation 并从中获取示例缓冲区AVCaptureVideoDataOutput 我可以使用以下方法将其直接写入 videoWriter void writeBufferFrame CMSampleBufferRe
  • Java:获取打印机状态(缺纸/缺纸)

    我是这样打印的 FileWriter imp new FileWriter COM2 while linea br readLine null imp write linea imp write 0x0A 现在我使用端口 COM2 我有一台
  • Unidata 数据库导出 - 如何使用 TO DELIM 添加标题

    在 Unidata 中 将查询转储到分隔文件时 例如 列出 MYFILE 1000 ATB1 ATB2 ATB3 至 DELIM tmp extract txt 是否有任何 UDT OPTIONS 控制是否写入标题行 当前唯一的解决方法涉及
  • 从子线程停止主线程

    我正在编写一个python程序 在主函数中我正在启动一个连续运行的线程 启动线程后 主函数进入 while 循环 连续获取用户输入 如果子线程中出现异常 我也想结束主函数 最好的方法是什么 提前致谢 让线程 控制 其父级并不是一个好的做法
  • 排除日期晚于今天的项目

    我有一个关于 XSLT 的问题 在一个网站上 我有一个简单的日历 显示未来将要发生的事件 但当一个事件完成后 它应该从我的列表中删除 我所说的 完成 是指活动的日期已经过了今天 每个事件都附有日期 看下面的代码
  • 故意依赖 Linq Side Effects 是不好的做法吗?

    像这样的编程模式经常出现 int staleCount 0 fileUpdatesGridView DataSource MultiMerger TargetIds Select id gt FileDatabaseMerger merge
  • 使用 listpreference 并获取密钥有效,但没有“确定”按钮

    我在我的 android 应用程序中使用 listpreference 并获取我的键值 一切都很好并且工作正常 现在你们已经帮助了我 但是 当我的 listpreference 菜单弹出时 它们只包含一个取消按钮 假设用户正在红色 蓝色和绿
  • 在文本文件中附加新行的最佳变体是什么?

    我使用此代码将新行附加到文件末尾 let text New line to string let mut option OpenOptions new option read true option write true option cr
  • JTable 单元格中有两行或多行?

    如何将两行或多行放入一个 JTable 单元格中 我尝试在行尾添加 n 但它不起作用 尝试这样的 HTML lineOne br lineTwo
  • 关于 OpenGL 不变限定符的困惑

    我在翻阅橙皮书 第 3 版 时 在第 9 章中发现了一段关于不变限定符的段落 它说 The 不变的限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数 这段话出现在两个类似的代码片段之后 uniform mat4 MVPmatri