【发布时间】:2013-02-16 17:42:03
【问题描述】:
我正在为(来了)家庭作业编写我的第一个顶点着色器,但无法使其正常工作。
我需要实现一个顶点着色器(并且只有一个顶点着色器),而不是完全模仿 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。
除此之外,一切都保持不变。我不能确定为什么会解决问题,所以如果有人知道,请发表评论并给出解释。
【问题讨论】:
-
你能发布片段着色器吗?
-
我没有写片段着色器。使用默认的固定函数片段着色器。
-
发布问题的图片。它可能会为某人敲响警钟。
标签: function opengl fixed vertex-shader