【发布时间】: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在运行时,编译和链接工作正常
-
我可能会尝试使用
isinf和isnanGLSL 函数来查看inf或NaN是否会潜入您的计算中。之前我的 GLSL 代码中的 NaN 遇到了一些问题,比如遇到除以零之类的错误,或者尝试对长度为零的向量进行归一化,导致整个程序失败。 -
好主意,但我刚刚通过让着色器输出红色来测试这一点,如果强度为 inf 或 isnan,它并没有变成红色。
-
如何将颜色设置为等于派生强度计算的值?可能是一个有趣的数据点。试试
color = normal或color = toLight。或者color = intensity_unclamped(省略钳位指令)。
标签: segmentation-fault glsl opengl-3 dot-product