我正在編寫我的第一個頂點着色器(,它來自)作業分配並無法使其正常工作。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。
除此之外,一切都保持不變。我不能肯定地說爲什麼那些固定的東西,所以如果有人知道,請評論和解釋。
你可以發佈片段着色器嗎? – 2013-03-02 05:26:52
我正在寫的沒有片段着色器。使用默認的固定功能片段着色器。 – user2125891 2013-03-02 05:36:11
發佈問題的圖片。它可能會爲某人敲響警鐘。 – 2013-03-02 08:16:56