【问题标题】:GLSL Vertex Shader causes either flashing colors or all redGLSL 顶点着色器导致颜色闪烁或全为红色
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 没有骰子,还是一样的结果。作为旁注,我已经更新了我的最终计算以包含全局环境,所以现在它是gl_FrontColor = gl_FrontMaterial.emission + gl_LightModel.ambient*gl_FrontMaterial.ambient + sum; 如果我从等式中删除 sum,问题就消失了,但没有正确点亮。一切都很暗淡。我检查了 sum 的长度(以检查溢出),它根本不是一个很大的值,所以我不确定它为什么会导致问题。
  • 我错了:我检查过,它们被 OpenGL 隐式限制了。
  • 所以我发现了一些有趣的东西。只要向量“sum”中的值不为零,我就有问题。不管所有的值有多小,如果它们大于零,我就会有闪烁的颜色。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多