2013-03-02 78 views
0

我正在編寫我的第一個頂點着色器(,它來自)作業分配並無法使其正常工作。GLSL Vertex Shader會導致閃爍的顏色或全部紅色

我需要實現一個頂點着色器(並且只有一個頂點着色器),而不是完全模仿openGL中的固定功能流水線頂點着色器,並使用FFP片段着色器(因此不會爲FS寫任何東西)。我知道內置的統一變量,我使用它們來計算基於openGL光照方程的vertice最終顏色。我已經改名爲一些可讀性的緣故值(正常和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。

除此之外,一切都保持不變。我不能肯定地說爲什麼那些固定的東西,所以如果有人知道,請評論和解釋。

+0

你可以發佈片段着色器嗎? – 2013-03-02 05:26:52

+0

我正在寫的沒有片段着色器。使用默認的固定功能片段着色器。 – user2125891 2013-03-02 05:36:11

+0

發佈問題的圖片。它可能會爲某人敲響警鐘。 – 2013-03-02 08:16:56

回答

0

從你的描述我不知道你的顏色溢出。如果嘗試:

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

沒有骰子,仍然是相同的結果。作爲一個方面說明,我已經更新了我的最終計算,以包含全局氛圍,所以現在它是 'gl_FrontColor = gl_FrontMaterial.emission + gl_LightModel.ambient * gl_FrontMaterial。環境+總和;' 如果我從等式中刪除和,問題就消失了,但沒有任何東西點亮。這一切都很暗淡。我檢查了總和的長度(以檢查溢出),並且它不是一個非常大的值,所以我不確定它爲什麼會導致問題。 – user2125891 2013-03-02 08:15:11

+0

反正我錯了:我查了一下,它們被OpenGL隱式地夾住了。 – 2013-03-02 08:19:25

+0

所以我發現了一些有趣的東西。只要向量「sum」中的值不爲零,我就有問題。不管它的值是多麼小,如果它們大於零,我都有閃爍的顏色。 – user2125891 2013-03-02 08:33:02