我正在为(here it comes)家庭作业写我的第一个顶点着色器,不能让它正常工作
我需要实现一个顶点着色器(只有一个顶点着色器),而不是完全模仿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);
我将场景中每个光的环境,漫反射和镜面相加,并将其存储为"sum",后面跟着:
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 = vec3(someOtherVec3)代替了vec3 test = someOtherVec3。
2)当规范化时,我将变量的规范化结果赋值给自身,而不是仅仅调用normalize()。例如:normal = normalize(normal),而不是normalize(normal);
3)我在每一步直接添加gl_FrontColor,而不是将中间值存储在sum中,并在最后将sum添加到gl_FrontColor。
除此之外,一切都保持不变。我不能确定为什么会这样,所以如果有人知道的话,请给出解释。
从你的描述,我想知道你的颜色是否溢出。如果您尝试:
gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0);