2015-08-23 31 views
0

我在Win7 x64上使用Python OpenGL,版本'3.3.0 - Build 8.15.10.2725'。OpenGL線出現灰色,啓用照明

我正在使用GL_LINES在3D空間中繪製2D網格和XYZ軸。 當我禁用照明網格顏色出來罰款。

當我啓用照明和光Z位置> 0時,網格顏色很好。

但是,當我把光Z位置< 0時,即使模型的3D部分正常渲染,網格顏色幾乎是灰色的。由於線條是一維的,我不認爲它們有表面;我不確定OpenGL如何在照明環境下考慮線條。

我能獲得彩色與照明Z位置線< 0,如果我用一個愚蠢的片段着色器如下:

# From http://bazaar.launchpad.net/~mcfletch/openglcontext/trunk/view/head:/tests/shader_2.py 
self.color_fragmentshader = shaders.compileShader(""" 
    varying vec4 vertex_color; 
    void main() { 
     gl_FragColor = vertex_color; 
    } 
    """, GL.GL_FRAGMENT_SHADER) 

但是,如果我離開了默認着色器(不是通過調用glUseProgram),或使用一些其他我找到的着色器,然後2D線變灰。

我的網格和軸功能如下:

def drawGrid(self, size, squares): 
    GL.glLineWidth(0.1) 
    GL.glColor((trolltechGreen.light().red()/255, 
       trolltechGreen.light().green()/255, 
       trolltechGreen.light().blue()/255)) 
    GL.glBegin(GL.GL_LINES) 
    for x in np.linspace(-size, size, squares+1, True): 
     GL.glVertex2f(x, -size) 
     GL.glVertex2f(x, size) 
    for y in np.linspace(-size, size, squares+1, True): 
     GL.glVertex2f(-size, y) 
     GL.glVertex2f(size, y) 
    GL.glVertex2f(-size,-size) 
    GL.glVertex2f(size,-size) 
    GL.glVertex2f(size,size) 
    GL.glVertex2f(-size,size) 
    GL.glEnd() 

def drawAxes(self, size): 
    GL.glLineWidth(5) 
    GL.glBegin(GL.GL_LINES) 
    GL.glColor(1,0,0,1) 
    GL.glVertex2f(0,0) 
    GL.glVertex2f(size,0) 
    GL.glColor(0,1,0,1) 
    GL.glVertex2f(0,0) 
    GL.glVertex2f(0,size) 
    GL.glColor(0,0,1,1) 
    GL.glVertex2f(0,0) 
    GL.glVertex3f(0,0,size) 
    GL.glEnd() 

我還可以得到線的顏色出來罰款,如果我每次我渲染線時間而改變的着色器,然後再切換到呈現3D對象,但我不認爲這是正確的解決方案。

這是問題的樣子。照明位於-Z的茶壺「後面」。如何強制線條忽略光線,而不需要不斷更改着色器?謝謝!

enter image description here

回答

3

我不知道怎麼的OpenGL照明的存在對於線。

當你能夠在固定管線燈光,它會affec你畫所有元 - 點,燈光,三角形。

線條可能未定義數學曲面,但您仍然有爲它們定義的法線向量。請記住,OpenGL是一個狀態機,所以如果你沒有用你的線幾何體來指定它們,你仍然會使用一些「當前」法向量。

當您使用着色器時,您自己控制生成的顏色。着色器也適用於所有原始類型。

如果您希望線條不受燈光影響,請在固定功能管線中繪製網格時禁用照明,或者如果使用可編程管線,則使用純色着色器。

當然,您可以設置一些材質屬性,以便在啓用燈光時,您的線條只會以您喜歡的顏色顯示。在固定功能GL中,例如,可以通過將「發射」材料系數設置爲所需的顏色,並將所有其他顏色系數設置爲0來實現。如果使用着色器,當然取決於着色器的工作方式。