GLSL顶点着色器会导致闪烁的颜色或全部红色

时间:2013-03-02 05:14:02

标签: function opengl fixed vertex-shader

我正在编写我的第一个顶点着色器,用于(此处)作业分配,但无法使其正常运行。

我需要实现顶点着色器(并且只有一个顶点着色器),而不是完全模仿openGL中的固定函数管道顶点着色器,并使用FFP片段着色器(因此不为FS写任何内容)。我知道内置的统一变量,我正在使用它们来计算基于openGL光照方程的顶点的最终颜色。为了便于阅读,我重命名了一些值(normal和lightVec已经标准化):

    //given as part of the assignment, not modifable
    vec4 position = gl_ModelViewMatrix * gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    //my (partial) code below here

    lightVec = (lightPos - position).xyz;
    distance = length(lightVec);
    vec3 normal = gl_NormalMatrix * gl_Normal;

    //I've stored a lot of the values in variables I defined locally
    //to make the code easier to read.
    //eg - constAtten = gl_LightSource[].constantAttenuation

    atten = 1/max((constAtten + distance*linearAtten + distance*distance*quadAtten),1); 
    ambient = ambInt * matAmbInt * atten;
    diffuse = difCol * matDifInt * max(dot(normal, lightVec),0.0) * atten;
    specular = specInt * matSpecInt * atten * pow(max(dot(normal, (gl_LightSource[i].halfVector).xyz),0.0), gl_FrontMaterial.shininess);

我正在为场景中的每个灯求和环境,漫反射和高光,并将其存储为“总和”,然后是:

    gl_FrontColor = gl_FrontMaterial.emission + sum;
    gl_FrontColor.a = 1.0;

每次移动场景的相机时,结果都是疯狂闪烁的颜色。这是openGL v1.2。

编辑:链接到图片

http://i305.photobucket.com/albums/nn208/wolverine1190/shadercomp_zpsc546ac31.png

每当我移动相机时,左边的颜色都会改变。这可能表示正常计算不正确,或者可能是我不应该使用的相机坐标吗?

=============================================== ==================

解决

我已经解决了这个问题。不确定为什么它现在有效,但确实如此。我废弃了所有内容,并使用相同的方法和计算从头开始重新编写代码。我的不同之处是:

1)我用构造函数设置值而不是赋值。例如 - 而不是vec3 test = someOtherVec3,我做了vec3 test = vec3(someOtherVec3)。

2)当规范化时,我将变量的归一化结果分配给自身而不是仅仅调用normalize()。例如 - 而不是normalize(normal),normal = normalize(normal);

3)我在每一步直接添加到gl_FrontColor,而不是在sum中存储中间值,并在末尾向gl_FrontColor添加sum。

除此之外,一切都保持不变。我不能确定为什么要修复这些东西,所以如果有人知道,请用解释进行评论。

1 个答案:

答案 0 :(得分:0)

从你的描述中我想知道你的颜色是否溢出。如果你尝试会发生什么:

    gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0);