0

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

#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 网站上的教程来计算光照。顺便说一句,这是一本很棒的书,但是这里的代码与列出的代码基本相同,只是更改了几个名称,但是通过一些实验,我发现了一些非常奇特的东西。分段错误发生在

颜色 = vec3(强度);

行,我知道因为删除该行会导致程序正常运行,(当然除了没有照明)

但是,当我更换线路时

浮动强度=点(正常,toLight);

和:

浮动强度 = 3.14159;

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

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

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

非常感谢任何建议。谢谢

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

4

2 回答 2

2

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

于 2013-01-14T23:25:52.220 回答
0

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

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

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

于 2013-01-15T00:07:41.190 回答