为什么我的灯光计算导致颜色跳到黑色?

时间:2014-04-28 21:59:41

标签: java opengl lwjgl

我有一个包含从高度图生成的地图的场景。我可以在X和Y轴上移动此贴图,其中地图向上或向下移动,使得贴图几何与原点相交。有一盏灯悬停在地图上,在x和y坐标处的几何高度上总是高出5个单位。

当相机靠近场景原点时,所有照明都表现良好。然而,我越远离它,越多的三角形首先快速跳到亮白色,之后它们几乎立即变黑。我无法弄清楚造成这种情况的原因。

以下是场景图结构的概述:

scene graph overview

  • 容器实例不会更改openGL状态
  • 着色器节点激活下面显示的着色器对。
    • 使用固定功能管道时也存在问题。
  • 在渲染场景图之前翻译并旋转场景

我很确定问题在于场景的构建,但我并不完全确定。

以下是效果的一些截图。第一个是光线靠近相机,相机位于距离场景原点一定距离的位置:

up close

请注意,灯光显示为球体,以红色圆圈标记。第二,光线远离相机的地方:

far away

我也在绘制法线以供参考。无论光线相对于相机的位置如何,此照片中可见的光线始终存在。

以下是我的着色器。我相当肯定他们按照自己的意愿工作,因为他们在ShaderMaker中正常工作:

顶点着色器:

varying vec3 normal;
varying vec3 position;

void main( void )
{
    gl_Position = ftransform();
    gl_TexCoord[0] = gl_MultiTexCoord0;

    normal = gl_NormalMatrix * gl_Normal;
    position = ( gl_ModelViewMatrix * gl_Vertex ).xyz;
}

片段着色器:

varying vec3 normal;
varying vec3 position;

vec4 lightSource(vec3 norm, vec3 view, gl_LightSourceParameters light)
{
    vec3 lightVector = normalize(light.position.xyz - view);
    vec3 reflection = normalize(lightVector - view.xyz);

    float diffuseFactor = max(0, dot(norm, lightVector));
    float specularDot = max(0, dot(norm, reflection));

    float specularFactor = pow(specularDot, gl_FrontMaterial.shininess);

    return 
        gl_FrontMaterial.ambient * light.ambient +
        gl_FrontMaterial.diffuse * light.diffuse * diffuseFactor +
        gl_FrontMaterial.specular * light.specular * specularFactor;
}

vec4 lighting()
{
    // normal might be damaged by linear interpolation.
    vec3 norm = normalize(normal);

    return
        gl_FrontMaterial.emission +
        gl_FrontMaterial.ambient * gl_LightModel.ambient +
        lightSource(norm, position, gl_LightSource[0]);
}

void main()
{
    gl_FragColor = lighting();
}

1 个答案:

答案 0 :(得分:1)

问题的解决方案是我在modelView矩阵上应用了glFrustrum()。当我在调用glFrustrum之前将glMatrixMode设置为投影矩阵时,场景会正确呈现。