我正在使用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的茶壶。如何在不经常更改着色器的情况下强制线条忽略光线?谢谢!
答案 0 :(得分:3)
我不确定OpenGL在存在照明时如何看待线条。
在固定功能管道中启用光照时,它会影响您绘制的所有基元 - 点,灯光,三角形。
线条可能没有定义数学曲面,但您仍然可以为它们定义法线向量。请记住,OpenGL是一个状态机,所以如果你没有用你的线几何来指定它们,你仍然会使用一些“当前”法线向量。
使用着色器时,您自己控制生成的颜色。着色器也适用于所有原始类型。
如果希望线条不受光照影响,请在固定功能管道中绘制网格时禁用光照,或者如果使用可编程管道,则使用仅颜色着色器。
您当然可以设置一些材质属性,以便在启用光照时,您的线条将以您所要求的颜色显示。在固定功能GL中,这可以通过将“发光”材料系数设置为期望的颜色,并且将所有其他系数设置为0来实现。如果使用着色器,则当然会取决于着色器的工作方式。