2011-11-03 97 views
5

我必须把光照在OpenGL的图片,但我不知道如何把一个正确的点光源照明像下面的图片:OpenGL的照明光亮

Right

现在我曾试图不同模式下的照明,但结果如下:(

Wrong

我重视你,我用我的结果的代码。有什么不对?

float specref[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    // Light values and coordinates 
    float ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f }; 
    float diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f }; 
    float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f}; 
    float lightPos[] = { 0.0f, -150.0f, -150.0f, 1.0f }; 

    glEnable (GL_LIGHTING) ; 

    glLightfv(GL_LIGHT0,GL_AMBIENT, ambientLight); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
    glEnable(GL_LIGHT0); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,specref); 
    glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,128); 
    glEnable (GL_COLOR_MATERIAL) ; 

    glClearColor (1.0, 1.0, 1.0, 1.0); 
    glColor3f(0.0,0.0,0.0); 

编辑04/11/2011 0.39 CET

我还附上由glutDisplayFunc(显示)打电话给我的显示器()函数;

void display(void) 

    { 

    [...] 

    //Draw polygons in 3d 

    glColor3f(0.0,1.0,1.0); 

    glBegin(GL_QUADS); 

    for(i=0;i<NVERT-1;i++) { 

     for (j=0;j<NVERT-1;j++) { 

       glVertex3f((GLfloat)((sb[i*NVERT+j]).x()), 

             (GLfloat)((sb[i*NVERT+j]).y()), 

             (GLfloat)((sb[i*NVERT+j]).z())); 


       glVertex3f((GLfloat)((sb[i*NVERT+j+1]).x()), 

             (GLfloat)((sb[i*NVERT+j+1]).y()), 

             (GLfloat)((sb[i*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j+1]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).z())); 


     } 



    } 

    glEnd(); 
    glFlush(); 

    } 

在具有显示实践我写构成该2°的数字,I表示的小区域(I省略了算法,因为它的工作各区域的点的计算)。

我的目标是有类似的结果,以图1为图的闪电和渲染,但我只是得到的结果如图2

我不知道如何把正确的光,以及如何设置我的身材以获得此渲染(如镜像)。

+2

邮政演示该问题的完整,最小的例子。 – genpfault

+4

可能是几件事情。我猜你没有任何法线,而是猜测。 @genpfault指出我们需要一个简单的例子。 – larsmoa

+0

是你想要达到的第一个图像和第二个你现在拥有的图像? – NickLH

回答

1

你缺少法线。您需要为每个顶点提供一个法线(glNormal),或者如果您使用glMap2(您不是),则可以启用GL_AUTO_NORMALS。有一篇关于如何在opengl.org上使用compute normals for a triangle or polygons的文章,你可能会觉得有用。

Begin Function CalculateSurfaceNormal (Input Polygon) Returns Vector 

    Set Vertex Normal to (0, 0, 0) 

    Begin Cycle for Index in [0, Polygon.vertexNumber) 

     Set Vertex Current to Polygon.verts[Index] 
     Set Vertex Next to Polygon.verts[(Index plus 1) mod Polygon.vertexNumber] 

     Set Normal.x to Sum of Normal.x and (multiply (Current.y minus Next.y) by (Current.z plus Next.z)) 
     Set Normal.y to Sum of Normal.y and (multiply (Current.z minus Next.z) by (Current.x plus Next.x)) 
     Set Normal.z to Sum of Normal.z and (multiply (Current.x minus Next.x) by (Current.y plus Next.y)) 

    End Cycle 

    Returning Normalize(Normal) 

End Function 

从您发布的结果的图像看来你是计算和绘图法线(红色箭头),只是没有付诸。

0

无法真正弄清楚你的代码发生了什么。我希望你的坐位在-1到+1之间。我建议你使用简单的基元进行照明。与您的表面世代的工作。光源的位置和计算法线是最重要的一点。

http://www.falloutsoftware.com/tutorials/gl/gl8.htm

http://glprogramming.com/red/chapter05.html

+1

我不知道为什么坐标应该在[-1,1]中,除非你指的是法线,实际上并不存在。 –

+0

灯光参数似乎在-1到+1之间,如果映射值较高,他将无法看到效果。这就是我所确认的 – sarat

+0

[-1,1]中的照明参数是什么?我希望你不是指那些与任何坐标无关的颜色(无论如何都在[0,1]中)。灯的位置(与坐标有关的唯一“灯光参数”)是(0,-150,-150)。 –