2013-08-23 51 views
1

我正在從OGL直接模式遷移到VBO。我正在渲染四邊形,我的法線以即時模式工作。但我無法正常使用VBO正常工作。如何設置VBO四邊形法線

設置:

  vertexData = BufferUtils.createFloatBuffer(12); 
      vertexData.put(new float[]{xCor[0], yCor[0], zCor[0],xCor[1], yCor[1], zCor[1],xCor[2], yCor[2], zCor[2],xCor[3], yCor[3], zCor[3]}); 
      vertexData.flip(); 

      texData = BufferUtils.createFloatBuffer(8); 
      texData.put(new float[]{tCor[0],tCor[1],tCor[2],tCor[3],tCor[4],tCor[5],tCor[6],tCor[7]}); 
      texData.flip(); 

      normalData = BufferUtils.createFloatBuffer(3); 
      normalData.put(new float[]{nCor[0],nCor[1],nCor[2]}); 
      normalData.flip(); 

      normalHandle = glGenBuffers(); 
      glBindBuffer(GL_ARRAY_BUFFER, normalHandle); 
      glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW); 
      glBindBuffer(GL_ARRAY_BUFFER, 0); 

      vboVertexHandle = glGenBuffers(); 
      glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
      glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
      glBindBuffer(GL_ARRAY_BUFFER, 0); 

      vboTexHandle = glGenBuffers(); 
      glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle); 
      glBufferData(GL_ARRAY_BUFFER, texData, GL_STATIC_DRAW); 
      glBindBuffer(GL_ARRAY_BUFFER, 0); 

渲染:

glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glVertexPointer(3, GL_FLOAT, 0, 0L); 

    glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, normalHandle); 
    glNormalPointer(GL_FLOAT,0,0L); 


    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 


    glDrawArrays(GL_QUADS, 0, 4); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 

在它的當前狀態,只亮起一出兩個三角形組成的四邊形。我可以看到爲什麼,但將緩衝區大小加倍並重復法向矢量座標並不能完全解決這個問題。一個人應該如何向一個四邊形的VBO輸入一個法向量,即兩個三角形?

回答

1

你的正常數據是怎樣的?記住每個頂點由幾個屬性組成,在你的情況下它是[position, normal, texture_coordinate]

很多剛剛從立即模式轉換的新手都有這種誤解,即「頂點」只是位置。他們有1次調用glNormal,接着3或4次調用glVertex,使他們認爲每3或4個頂點有1個正常。不是這種情況。實際上,glVertex複製了所有其他頂點屬性狀態,其中glVertex的參數提供了position屬性。

一個更貼切的API本來:

glNormal(…); 
glPosition(…); /* that one doesn't exist */ 
glTexCoord(…); 
glEmitVertex(); /* doesn't exist either, takes no parmeters */ 

然而頂點數組只看到容易使用的數據。所以每個頂點都需要完整的monty,可以這麼說。從你的代碼中不清楚你是否做到了這一點。但考慮到你的問題的描述聽起來很像這個問題。

+0

感謝您的支持。把normalData緩衝區加到12,重複法線就行了。 – everling