这是我的顶点着色器代码:
#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++代码,但我认为没有必要,如果我错了,请纠正我。