- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 GLSL 中遇到以下错误。这是片段着色器:
#version 450 core
#define DIFFUSE_TEX_UNIT 0
#define INDEX_UNIFORM_LOC 0
layout(binding = DIFFUSE_TEX_UNIT) uniform sampler2D colorTex;
#ifdef SOME_SPECIAL_CASE
layout (location = INDEX_UNIFORM_LOC) uniform uint u_blendMode;
//...more code here related to the case
#endif
//... rest of the code(not important)
现在,当我在没有声明 SOME_SPECIAL_CASE 的情况下将此着色器编译到程序中,并且在运行时仍然设置 u_blendMode
uniform 时,我从驱动程序中收到以下错误:
GL_INVALID_OPERATION error generated. value is invalid; expected GL_INT or GL_UNSIGNED_INT64_NV.
但我希望得到这样的错误:
GL_INVALID_OPERATION error generated. ' location ' is invalid.
因为如果我不设置 SOME_SPECIAL_CASE
预处理器标志,就没有这样一个索引 (0) 的位置。然后我决定检查我有什么制服,这需要 GL_INT
或 GL_UNSIGNED_INT64_NV
,所以我根据它的位置(零)查询制服名称:
char buff[20];
GLsizei len = 0;
glGetActiveUniformName(prog.progHandle, 0, 20, &len, buff);
并得到名称“colorTex”,这是具有绑定(bind)索引 DIFFUSE_TEX_UNIT
的 sampler2D uniform 的名称,它也是零。直到现在,我相信统一的位置和绑定(bind)点不使用相同的索引,我仍然相信它们不会,因为否则这个着色器,当使用 SOME_SPECIAL_CASE
active 编译时会失败,以及许多其他着色器我已经写了我的工作历史。因此,当我设置不存在的统一位置时,为什么 sampler2D 统一绑定(bind)索引会受到影响,而且我还使用特定类型(GLSL - uint),这看起来非常奇怪
glProgramUniform1ui(prog, location, (GLuint)value);
这也不匹配 sampler2D 的类型(因此错误至少在类型不匹配方面是正确的)。是驱动程序错误吗?
还有一件事,我试着 checkin docs如果绑定(bind)和位置索引确实重叠并发现此语句:
It is illegal to assign the same uniform location to two uniforms in the same shader or the same program. Even if those two uniforms have the same name and type, and are defined in different shader stages, it is not legal to explicitly assign them the same uniform location; a linker error will occur.
这是绝对错误的!多年来我一直这样做。并在阅读这些行后再次尝试。具有相同的制服,在顶点和片段着色器中具有相同的位置可以编译并正常工作。
我的设置:
关于在同一位置使用相同制服的能力,至少在 NVIDIA GPU 上,以下编译和运行良好:
顶点着色器
#version 450 core
#define MVP_UNIFORM_LOC 2
layout(location = 0) in vec2 v_Position;
layout(location = MVP_UNIFORM_LOC) uniform mat4 u_MVP;
smooth out vec2 texCoord;
void main()
{
texCoord = v_Position;
gl_Position = u_MVP * vec4(v_Position,0.0,1.0);
}
片段着色器:
#version 450 core
#define MVP_UNIFORM_LOC 2
#define TEX_MAP_UNIT 5
layout(binding = TEX_MAP_UNIT ) uniform sampler2D texMap;
layout(location = MVP_UNIFORM_LOC) uniform mat4 u_MVP;
smooth in vec2 texCoord;
out vec4 OUTPUT;
void main()
{
vec4 tex = texture(texMap, texCoord);
OUTPUT = u_MVP * tex;
}
最佳答案
Is it a driver bug?
没有。 glGetActiveUniformName
采用统一的索引,而不是统一的位置。不能从着色器设置索引;它们只是所有制服变量,从 0 到事件制服的数量。索引仅用于 introspecting properties of uniforms .
无法获取统一位置并请求统一变量的统一索引(或名称)。
But I would expect to get an error like this: ... Because there is no location with such an index (0) if I don't set SOME_SPECIAL_CASE preprocessor flag.
当然有。不使用显式位置的统一变量永远不会与确实具有显式位置的统一变量具有相同的位置。 但是,这不是这里发生的事情。
如果未定义SOME_SPECIAL_CASE
,则u_blendMode
的声明不存在。由于位置 0 从未被显式统一变量使用,它现在可用于隐式位置分配。
因此实现可以将 colorTex
的位置分配给零(请注意,这与将 binding
分配给零不同)。
如果您想始终保留位置 0,则 u_blendMode
的声明必须始终可见,即使您从未使用它。规范允许实现仍然优化掉这样的声明,但是显式位置本身 没有被优化掉。因此,如果您对未使用的制服使用 location = 0
,则位置 0 可能是也可能不是有效位置。但如果有效,它将始终引用u_blendMode
。
Regarding the ability to use same uniform on same location,at least on NVIDIA GPU the following compiles and runs fine:
GLSL 规范已经解决了这个问题,它是 now OK to have two explicit uniform locations that are the same ,只要这两个声明本身是相同的。因此,跨着色器阶段的统一位置应该可以工作。
关于opengl - 统一显式位置和绑定(bind)点索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55750408/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!