OpenGL线呈现灰色,启用了灯光

时间:2015-08-23 15:21:52

标签: python opengl

我正在使用Python OpenGL,版本&#3.3; 3.3.0 - Build 8.15.10.2725'在Win7 x64上。

我使用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对象,我也可以得到线条颜色,但我不认为这是正确的解决方案。“ / p>

以下是问题所在。照明是"背后"在-Z的茶壶。如何在不经常更改着色器的情况下强制线条忽略光线?谢谢!

enter image description here

1 个答案:

答案 0 :(得分:3)

  

我不确定OpenGL在存在照明时如何看待线条。

在固定功能管道中启用光照时,它会影响您绘制的所有基元 - 点,灯光,三角形。

线条可能没有定义数学曲面,但您仍然可以为它们定义法线向量。请记住,OpenGL是一个状态机,所以如果你没有用你的线几何来指定它们,你仍然会使用一些“当前”法线向量。

使用着色器时,您自己控制生成的颜色。着色器也适用于所有原始类型。

如果希望线条不受光照影响,请在固定功能管道中绘制网格时禁用光照,或者如果使用可编程管道,则使用仅颜色着色器。

您当然可以设置一些材质属性,以便在启用光照时,您的线条将以您所要求的颜色显示。在固定功能GL中,这可以通过将“发光”材料系数设置为期望的颜色,并且将所有其他系数设置为0来实现。如果使用着色器,则当然会取决于着色器的工作方式。