【问题标题】:glsl dot function indirectly causing a segmentation fault in programglsl dot 函数间接导致程序中的分段错误
【发布时间】:2013-01-14 22:55:57
【问题描述】:

这是我的顶点着色器代码:

#version 330

layout(location = 0) in vec3 vertex_position;
layout(location = 0) in vec3 vertex_normal;

//model space
uniform vec3 toLight;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

smooth out vec3 color;

void main()
{
  gl_Position = projection * view * model * vec4(vertex_position, 1.0f);
  
  vec3 normal = normalize(vertex_normal);
  
  float intensity = dot(normal, toLight);
  intensity = clamp(intensity, 0, 1);
  
  color = vec3(intensity);
}

在这段代码中,我尝试使用Learning Modern 3D Graphics Programming site 的教程计算光照。顺便说一句,这是一本很棒的书,但是这里的代码与列出的代码基本相同,只是更改了几个名称,但是通过一些实验,我发现了一些非常奇特的东西。分段错误发生在

颜色 = vec3(强度);

行,我知道是因为去掉那行会导致程序正常运行,(当然不亮的除外)

但是当我换行时

浮动强度 = dot(normal, toLight);

与:

浮动强度 = 3.14159;

它钳位到 1.0f,一切正常,立方体是白色的,如果我输入一个负数也会发生同样的情况:数字被钳位为零,立方体是黑色...

所以这很奇怪,这是事实:

  • 删除将输出矢量设置为请求颜色的行时,分段错误消失。
  • 删除点积的计算时,分段错误也消失了
  • 当强度为常数浮动时,一切正常。
  • 将颜色设置为不涉及强度的任何东西都可以正常工作。
  • 编辑:发现了一些有趣的信息,当使用强度变量设置除颜色变量以外的变量时工作正常,例如vec3 temp = vec3(intensity); 不会导致段错误,但是将颜色设置为与强度无关的东西变量也可以正常工作 color = vec3(1.0f); 虽然,如果我将颜色设置为 temp 它也会崩溃,这很奇怪。

非常感谢任何建议。谢谢

另外,我会包含我的 opengl、c++ 代码,但我认为没有必要,如果我错了,请纠正我。

【问题讨论】:

  • 您是否在着色器编译/链接或着色器运行时 (glDraw...) 出现段错误?您是否正在检查着色器/程序的编译/链接结果?
  • 使用 glDrawElements 函数绘图时,segfault在运行时,编译和链接工作正常
  • 我可能会尝试使用isinfisnan GLSL 函数来查看infNaN 是否会潜入您的计算中。之前我的 GLSL 代码中的 NaN 遇到了一些问题,比如遇到除以零之类的错误,或者尝试对长度为零的向量进行归一化,导致整个程序失败。
  • 好主意,但我刚刚通过让着色器输出红色来测试这一点,如果强度为 inf 或 isnan,它并没有变成红色。
  • 如何将颜色设置为等于派生强度计算的值?可能是一个有趣的数据点。试试color = normalcolor = toLight。或者color = intensity_unclamped(省略钳位指令)。

标签: segmentation-fault glsl opengl-3 dot-product


【解决方案1】:

最佳猜测:设置toLight 统一的代码中有一个错误——它看起来像glUniform3fv(toLight_location, 3, pointer),但pointer 是假的(NULL 或其他无效)。 GL 驱动程序代码尝试取消引用此指针并崩溃。当您在着色器中删除所有使用 toLight 时,它不会崩溃,因为 toLight_location 在不活动时变为 -1 并且 glUniform3fv 调用变为 noop。

【讨论】:

  • 不,我尝试修改代码以不计算点积,而是使用 toLight 的组件作为颜色,一切正常,我也使用 glUniform3f 而不是 glUniform3fv,不过是个好主意,有可能有一些奇怪的统一数据漂浮在周围,我会调查一下......
【解决方案2】:

天哪!我犯了一个大错误,就在这里:

layout(location = 0) in vec3 vertex_position;
layout(location = 0) in vec3 vertex_normal;

注意vertex_positionvertex_normal 的位置相同,我也没有。将vertex_normal 位置设置为 1 修复了所有问题,对不起,我浪费了您的大部分时间,但感谢大家的建议和蒂姆,他让我意识到正常情况下发生了段错误,使我达到了顶峰来源,谢谢大家... =D

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2013-11-13
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2013-09-16
    • 2013-04-11
    相关资源
    最近更新 更多