2013-07-26 72 views
0

我遇到了我的底紋問題。OpenGL和GL_SMOOTH底紋

我將我的模型從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],.. 。]
  • 模型[[1]]對於模型=索引順序[0]
  • 模型[2] =法線向量進行模型[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() 
    

回答

2

glNormal()每次呼叫face

如果你想平滑着色,你必須提供一個不同正常的ea三角形的頂點。

編輯:如果你只有臉部正常,你可以average the face normals for a vertex to get smoother per-vertex normals

+0

EH我在想OpenGL自動計算:S。我知道如何計算頂點的法線,但是有計算法線的優化算法嗎?我會搜索谷歌... – urosjarc

+0

OOOOOOh更好,一些模型文件應該爲每個頂點提供一個法向量。 enyone知道嗎? – urosjarc

+0

@ user2081554:OpenGL不會爲你做任何工作,你可以做得比OpenGL更好。由於預計算總是擊敗在線計算,因此OpenGL期望您可以執行此任務。同時計算每個頂點的法線很容易。對於每個頂點總結出貢獻面法線並歸一化爲單位長度。 – datenwolf