0

我正在为(来了)家庭作业编写我的第一个顶点着色器,但无法使其正常运行。

我需要实现一个顶点着色器(并且只有一个顶点着色器),而不是完全模仿 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 中存储中间值并在最后将 sum 添加到 gl_FrontColor 。

除此之外,一切都保持不变。我不能确定为什么会解决问题,所以如果有人知道,请发表评论并给出解释。

4

1 回答 1

0

根据您的描述,我想知道您的颜色是否溢出。如果您尝试:

    gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0);
于 2013-03-02T08:04:41.210 回答