【问题标题】:Missing GLSL functionality缺少 GLSL 功能
【发布时间】:2015-01-09 23:06:47
【问题描述】:

我已将 Visual Studio 项目移至另一台计算机,现在 GLSL 无法编译以前运行良好的着色器。例如,它将 vec4s 隐式转换为 vec3s 并告诉我“点”函数未定义。

我正在使用 GLSDK 并且项目构建正确,并且 glGetString(GL_SHADING_LANGUAGE_VERSION) 告诉我 4.40。这显然是我没有安装但习惯的东西,但我已经四处搜索,无法弄清楚是什么。

【问题讨论】:

  • 诚然,我通常处理 GLSL ES,这就是为什么我不热衷于立即尝试这个作为答案,但我不认为不同大小向量之间的隐式转换是规范——类型可以隐式转换,大小不能。
  • 我刚刚选择了一个在另一台计算机上运行的项目并将其转储到这台计算机上,因此我可以确认着色器正常运行。除了转换之外,它不会将 dot(vec3, vec3) 函数识别为存在,如果我经历并纠正每个错误,可能会有更多。
  • 它是否真的在抱怨缺少dot(vec3, vec4)

标签: opengl glsl


【解决方案1】:

抱歉,听起来你的老司机有点过于宽容了。您的新驱动程序拒绝着色器是正确的。

vec4 a = vec4(1.0, 2.0, 3.0, 4.0);
vec3 x = vec3(a); // Ok
// vec3 y = a;    error

确实,如果我通过reference compiler 运行隐式转换,我会收到以下错误消息:

错误:0:4:“=”:无法从“浮动的 4 分量向量”转换为“浮动的 3 分量向量” 错误:1 个编译错误。没有生成代码。

尝试使用reference compiler 验证您的脚本,它可能会遇到一些类似这样的可移植性问题。您唯一真正的选择是修复损坏的着色器。

dot() 呢?

试试这个:

#version 330
void main() {
    vec4 x = vec4(1.0);
    vec3 y = vec3(2.0);
    float z = dot(x, y);
}

当我运行验证器时,我得到:

错误:0:5:“点”:找不到匹配的重载函数 错误:1 个编译错误。没有生成代码。

这里的错误是我对dot() 的参数类型错误。同样,问题出在我的着色器中。

【讨论】:

  • 是的,就是这样。我很困惑,因为当我将它们更改为 vec4s 时,它使 dot() 进一步分解,让我相信我没有一些 GLSL 命令库或其他东西。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2022-01-21
  • 2021-06-15
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多