- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在阅读this OpenGL4.1新功能评论。我真的不理解GL_ARB_separate_program_objects用法背后的想法,至少基于帖子作者的说法:
它允许独立使用着色器阶段,而无需更改其他阶段
着色器阶段。我看到了两个主要原因:Direct3D,Cg甚至
旧的OpenGL ARB程序可以做到,但更重要的是它带来了一些
软件设计灵活性允许查看图形管线
较低的粒度。例如,我最好的敌人VAO是
链接缓冲区数据,顶点布局数据和GLSL的容器对象
程序输入数据。没有专用的软件设计,这意味着
当我更改对象的材质(新的片段着色器)时,
我需要不同的VAO ...很幸运,可以保持相同的VAO
并且仅通过定义有关如何
在C ++程序和GLSL程序之间进行通信。有用
即使有些弊端仍然存在。
现在,这一行:
例如,我最大的敌人VAO是一个链接缓冲区数据,顶点布局数据和GLSL程序输入数据的容器对象,而没有专用的软件设计,这意味着当我更改对象的材质时(新的片段着色器) ,我需要不同的VAO ...
让我感到奇怪。在我的OpenGL程序中,我使用VAO对象,并且可以在不同的着色器程序之间进行切换,而无需对VAO本身进行任何更改。因此,我是否误解了整个想法?也许他是说我们可以为同一程序切换着色器而无需重新链接?
最佳答案
我将这个答案分为多个部分。
ARB_separate_shader_objects的目的是什么
此功能的目的是能够轻松地在顶点/片段/几何/细分着色器之间进行混合和匹配。
当前,您必须将所有着色器阶段链接到一个整体程序中。因此,我可以将相同的顶点着色器代码与两个不同的片段着色器一起使用。但这导致了两个不同的程序。
每个程序都有自己的一套制服和其他状态。这意味着,如果要更改顶点着色器中的某些统一数据,则必须在两个程序中都进行更改。我必须在每个上使用glGetUniformLocation
(因为它们可能具有不同的位置)。然后,我必须分别设置每个值。
这是一个很大的痛苦,而且是非常不必要的。使用单独的着色器,您不必这样做。您有一个仅包含顶点着色器的程序,以及两个包含两个片段着色器的程序。更改顶点着色器制服不需要两个glGetUniformLocation
调用。确实,由于只有一个顶点着色器,因此缓存数据更容易。
此外,它还处理着色器组合的组合爆炸式增长。
假设您有一个顶点着色器,可以进行简单的刚性变换:它需要一个模型到相机矩阵和一个相机到剪辑矩阵。也许也是法线的矩阵。并且您有一个片段着色器,它将从某些纹理中采样,根据法线进行一些照明计算,然后返回颜色。
现在,假设您添加了另一个片段着色器,它需要额外的照明和材质参数。它没有来自顶点着色器的任何新输入(没有新的纹理坐标或其他任何东西),只有新的制服。也许是用于投影照明,而顶点着色器不参与其中。随你。
现在假设我们添加了一个新的顶点着色器,用于顶点加权蒙皮。它提供与旧的顶点着色器相同的输出,但具有一堆制服和用于蒙皮的输入权重。
这给了我们2个顶点着色器和2个片段着色器。总共4个程序组合。
当我们再添加2个兼容的片段着色器时会发生什么?我们得到8个组合。如果我们有3个顶点和10个片段着色器,则总共有30种程序组合。
如果使用单独的着色器,则3个顶点着色器和10个片段着色器需要30个程序管道对象,但仅需要13个程序对象。与不分开的情况相比,程序对象减少了50%以上。
为什么引用文字错误
现在,这一行让我感到奇怪。
它应该使您感到奇怪;在几种方面都是错误的。例如:
VAO是一个容器对象,它链接缓冲区数据,顶点布局数据和GLSL程序输入数据。
不,不是的。它将提供顶点数据的缓冲区对象与该数据的顶点格式联系起来。并指定要访问的顶点属性索引。但是,这与“ GLSL程序输入数据”的紧密程度完全取决于您。
没有专用的软件设计,这意味着当我更改对象的材质(新的片段着色器)时,我需要不同的VAO ...
除非此行将“专用软件设计”等同于“合理的编程实践”,否则这完全是胡说八道。
这就是我的意思。您将在线看到示例代码,当他们设置顶点数据时会执行以下操作:
glBindBuffer(GL_ARRAY_BUFFER, buffer_object);
glEnableVertexAttribArray(glGetAttribLocation(prog, "position"));
glVertexAttribPointer(glGetAttribLocation(prog, "position"), ...);
prog
指定的着色器是否不受您的直接控制。如果是这样的话……您怎么知道
prog
根本没有一个名为“ position”的属性?
prog
具有名为“ position”的属性的方式。但是,如果您知道每个程序都将具有一个名为“ position”的属性,那为什么不更进一步呢?当需要链接程序时,请执行以下操作:
GLuint prog = glCreateProgram();
glAttachShader(prog, ...); //Repeat as needed.
glBindAttribLocation(prog, 0, "position");
glGetAttribLocation
了。表示“位置”时只需使用0。
prog
没有名为“ position”的属性,这仍将成功链接。 OpenGL不在乎是否绑定不存在的属性位置。因此,您可以将一系列
glBindAttribLocation
调用应用于您创建的每个程序,而不会出现问题。实际上,属性名称可以有多种约定,只要坚持使用一套或另一套,就可以了。
glBindAttribLocation
解决方案:
#version 330
layout(location = 0) in vec4 position;
glGetAttribLocation
,请认为该代码有气味。这样,您可以对任何程序使用任何VAO,因为VAO只是根据约定编写的。
关于opengl - OpenGL 4.1 GL_ARB_separate_program_objects的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809888/
XML可以应用于 WEB 开发的许多方面,常用于简化数据的存储和共享 XML 把数据从 HTML 分离 现在的HTML 文档一般都是显示动态数据,每当数据改变时将花费大量的时间来编辑 HTML
在类(class)(方案)中,我们最近学习了允许函数接受任意数量参数的语法,例如; (define len (lambda args (length args))) >(len 1 2 3
在 redis-cli 中执行 info 命令时,会列出与该服务器相关的所有信息。 “evicted_keys”的目的是什么? 最佳答案 Redis 可以配置为根据需要自动清除键。如果这样配置,red
golang 空结构体 struct{} 可以用来节省内存 ? 1
有人可以解释一下资源文件夹中的 Info.plist 是什么吗?我如何在我的应用程序中使用它?提前致谢。 最佳答案 您可以在Info.plist文件中为所有类型的设备指定不同的常规资源和应用程序配置,
我需要减小可执行文件的大小,并且经常在我的可执行文件中将某些“不必要的” uses占用一定的大小。 例如: Unit1连接到Unit2,但是两个单元的导入为“ System.SysUtils”。 然后
我是 OOP 的新手。虽然我了解多态是什么,但我无法真正使用它。我可以有不同名称的函数。为什么我应该尝试在我的应用程序中实现多态性。 最佳答案 在严格类型化的语言中,多态性对于拥有不同类型对象的列表/
Possible Duplicate: What is the difference between a delegate and events? Possible Duplicate: Differ
这个问题在这里已经有了答案: Custom index.html javadoc page? (2 个答案) 关闭 7 年前。 我使用的是eclipse。一般情况下我们可以使用javadoc.exe
你能解释一下吗ValidateAntiForgeryToken目的并向我展示有关 MVC 4 中的 ValidateAntiForgeryToken 的示例? 我找不到任何解释此属性的示例? 最佳答案
我正在学习 RxSwift 并试图了解 Observable 和 PublishSubject aka Sequence 之间的主要区别。 据我了解,Sequences/PublishesSubjec
有时有人说,在使用 Azure 表时,实际上存在第三个关键分区数据 - 表名称本身。 我在执行分段查询时注意到 TableContinuationToken 有一个 NextTableName 属性。
在Apple提供的aurioTouch项目中,听说在performRender()函数下的AudioController文件中的AudioBufferList ioData携带了mic到音频播放器的音
MSDN 文档没有详细解释它的用途。 由于它是可选的,我几乎假设它类似于某种元数据。 我现在如何看待它,我想用它来为特定用户指定缓存,例如: new CacheItem(key: "keyName",
我正在学习 browserify,我正在尝试用它做两件基本的事情: 转换(通过 shim)非 CommonJS 模块以实现易用性和依赖跟踪 捆绑项目特定的库 我找到了一个工作流程,说明如何使用 Gul
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
在 codeLabs 教程(Android - Kotlin - Room with a View)中,他们使用“viewModelScope.launch(Dispatchers.IO)”来调用插入
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
请耐心等待,因为我没有太多地使用压缩算法,所以这对你们中的一些人来说可能是显而易见的。当某些流媒体视频开始滞后时,我总是注意到这一点。当我看到这个问题时我才意识到我很好奇: Twitter image
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我是一名优秀的程序员,十分优秀!