2013-10-04 26 views
3

我正在爲我的OpenGL 2.1/GLSL 1.2應用程序添加一個頂點和片段着色器。如何將固定功能材質和照明傳遞給片段着色器?

頂點着色器:

#version 120 

void main(void) 
{  
    gl_Position = ftransform(); 
    gl_FrontColor = gl_Color; 
} 

片段着色器:

#version 120 

void main(void) 
{ 
    if (/* test some condition */) { 
     discard; 
    } else { 
     gl_FragColor = gl_Color; 
    } 
} 

的問題是,如果條件不滿足,gl_FragColor只是被設置爲任何給gl.glColor3f()最後一次通話是在我的固定功能方法。

取而代之,我想通過從材質和照明參數派生的正常顏色。例如,這樣的:

gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, lightingAmbient, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, lightingDiffuse, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, lightingSpecular, 0); 
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, directionalLightFront, 0); 

gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, materialAmbient, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, materialDiffuse, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, materialSpecular, 0); 
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_EMISSION, materialEmissive, 0); 
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, shininess); 

有沒有指定這個值gl_FragColor的方法嗎?或者我是否需要在片段着色器中從頭開始實施照明?

(注意,我沒有試圖做任何形式的先進的照明技術。我使用的着色器裁剪目的,只想使用標準的照明方式。)

回答

3

不幸的是沒有辦法做你想做的事。使用固定功能流水線和頂點/像素着色器是互斥的。您渲染的每個原始圖必須使用其中一個或另一個。

因此,您必須在着色器中自己進行光照計算。 This tutorial提供您需要這樣做的所有代碼。由於它是針對每個像素而不是每個頂點執行光照計算,所以結果實際上看起來好多了!

相關問題