【问题标题】:OpenGL and GL_SMOOTH shadingOpenGL 和 GL_SMOOTH 着色
【发布时间】:2013-07-27 01:50:51
【问题描述】:

我的阴影有问题。

我将模型从 SolidWorks 导出到 .wrl 文件。我读了这个文件并用 glShadeModel(GL_SMOOTH) 显示它,结果不像在 GL_FLAT 模式下那样光滑。

结果:http://shrani.si/f/2y/Ah/E8gXzGH/model.png

这很有趣,因为当我绘制 glutSolidSphere(1,10,10) 时,球体是光滑的。 我想知道我做错了什么?我是否必须同时计算每个顶点的阴影颜色,或者我必须在我的程序中全局更改某些内容?应该很容易解决吧?

初始化 OpenGL 的代码:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(31, float(screen_px[0])/screen_px[1],0.1, 1000)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(0,0,0,0,0,-1,0,1,0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glDepthFunc(GL_LESS)
glShadeModel(GL_SMOOTH)
glClearColor(0.5, 0.5, 1, 1)
glMaterial(GL_FRONT, GL_AMBIENT,  (0.5, 0.5, 0.5, 1))
glMaterial(GL_FRONT, GL_DIFFUSE,  (0.8,0.8,0.8,0.8))
glMaterial(GL_FRONT, GL_SPECULAR, (0.4, 0.4, 0.4, 1))
glMaterial(GL_FRONT, GL_SHININESS, (128))
glLight(GL_LIGHT0, GL_POSITION,  (100, 100, 0, 1))
glLight(GL_LIGHT0, GL_AMBIENT,  (0.4,0.4,0.4,0.4))
glLight(GL_LIGHT0, GL_DIFFUSE,  (0.4,0.4,0.4,0.4))
glLight(GL_LIGHT0, GL_SPECULAR, (0.4,0.4,0.4,0.4))

绘图代码

  • 模型[0]=[[vertex0],[vertex1], ...]
  • model[[1]]=model[0] 的索引顺序
  • model[2]=model[0] 的法线向量

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLight(GL_LIGHT0, GL_POSITION,(10, 10,10, 1))
    glBegin(GL_TRIANGLES)
    j=0
    for i in range(0,len(model[2]),1):
        glNormal3f(model[2][i][0],model[2][i][1],model[2][i][2])
        k=model[1][j]
        glVertex3f(model[0][k][0],model[0][k][1],model[0][k][2])
        j=j+1
        k=model[1][j]
        glVertex3f(model[0][k][0],model[0][k][1],model[0][k][2])
        j=j+1
        k=model[1][j]
        glVertex3f(model[0][k][0],model[0][k][1],model[0][k][2])
        j=j+1
    glEnd()
    
    pygame.display.flip()
    

【问题讨论】:

    标签: python opengl pyopengl


    【解决方案1】:

    glNormal() 每张脸调用一次

    如果你想要平滑的阴影,你必须为三角形的每个顶点提供一个不同的法线。

    编辑:如果你只有面部法线,你可以average the face normals for a vertex to get smoother per-vertex normals

    【讨论】:

    • EH 我在想 OpenGL 自动计算这个:S。我知道如何计算顶点的法线,但是是否有计算优化法线的算法?我会在谷歌上搜索...
    • OOOOOOh 更好,一些模型文件应该为每个顶点提供一个法线向量。有人知道吗?
    • @user2081554:OpenGL 不会为你做任何事情,你可以比 OpenGL 做得更好。由于预计算总是胜过在线计算,因此 OpenGL 期望您完成这项任务。计算每个顶点法线也很容易。对于每个顶点,总结贡献的面法线并归一化为单位长度。
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多