2016-08-29 56 views
0

我一直在試圖將我的遊戲的原型渲染器從其即時模式測試實現轉換爲實際的VAO/VBO實現。 VBO正在屏幕上渲染,但拒絕紋理。下面是最簡單的測試類,顯示問題:LWJGL - 交錯VAO/VBO不紋理

public static void main(String[] args) throws Exception { 

    //       VertX,VertY   TexX, TexY 
    float[] data = new float[] {0.0f, 0.0f,  0.25f, 0.75f, 
           0.0f, 64.0f, 0.25f, 1.0f, 
           64.0f, 64.0f, 0.5f, 1.0f, 

           0.0f, 0.0f,  0.25f, 0.75f, 
           64.0f, 64.0f, 0.5f, 1.0f, 
           64.0f, 0.0f, 0.5f, 0.75f}; 

    glfwSetErrorCallback(GLFWErrorCallback.createPrint(System.err)); 
    if (!glfwInit()) 
     throw new IllegalStateException("Unable to initialize GLFW"); 

    long window = GLFW.glfwCreateWindow(1600, 900, "TEST", 0, 0); 
    GLFW.glfwMakeContextCurrent(window); 

    GL.createCapabilities(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 1600, 900, 0, 0.000001, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    int vboId = glGenBuffers(); 
    int vaoId = glGenVertexArrays(); 

    glClientActiveTexture(GL_TEXTURE0); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glBindVertexArray(vaoId); 
    glBindBuffer(GL_ARRAY_BUFFER, vboId); 

    glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 2, GL_FLOAT, false, 4*Float.BYTES, 0); 
    glTexCoordPointer(2, GL_FLOAT, 4*Float.BYTES, 4*Float.BYTES); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    glTranslatef(50, 50, 0); 

    Texture t = new Texture(TEST.class.getClassLoader().getResourceAsStream("test/WallFloor.png")); 

    while (!GLFW.glfwWindowShouldClose(window)) { 
     GLFW.glfwPollEvents(); 
     GLFW.glfwSwapBuffers(window); 

     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 


      glClientActiveTexture(GL_TEXTURE0); 
      glEnableClientState(GL_VERTEX_ARRAY); 
      glEnableClientState(GL_TEXTURE_COORD_ARRAY); 



      glBindVertexArray(vaoId); 
      glEnableVertexAttribArray(0); 

      t.bind(); 

      glDrawArrays(GL_TRIANGLES, 0, 6); 


      glDisableVertexAttribArray(0); 
      glBindVertexArray(0); 

      glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
      glDisableClientState(GL_VERTEX_ARRAY); 

      /* Equivelent immediate mode code - that works 
      t.bind(); 

      glBegin(GL_TRIANGLES); 
      glTexCoord2f(0.25f, 0.75f); 
      glVertex2f(0, 0); 
      glTexCoord2f(0.25f, 1f); 
      glVertex2f(0, 64); 
      glTexCoord2f(0.5f, 0.75f); 
      glVertex2f(64, 0); 

      glTexCoord2f(0.5f, 1f); 
      glVertex2f(64, 64); 
      glTexCoord2f(0.25f, 1f); 
      glVertex2f(0, 64); 
      glTexCoord2f(0.5f, 0.75f); 
      glVertex2f(64, 0); 
      glEnd(); 
      */ 

    } 
} 

質地綁定調用如下(其中包裝= GL_REPEAT和過濾= GL_NEAREST):

public void bind() 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glClientActiveTexture(GL_TEXTURE0); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(target, id); 
    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); 
    glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); 
    glTexParameteri(target, GL_TEXTURE_WRAP_S, wrap); 
    glTexParameteri(target, GL_TEXTURE_WRAP_T, wrap); 
} 

已經度過了週末,Google上搜尋它的沒有找到答案,我正在做一些可怕的錯誤?我也測試過使用即時模式,它仍然使用紋理進行渲染。

回答

4

此外,您在混合非核心配置(glTexCoordPointer

但真正的問題來自於錯誤的步幅和偏移用於核心配置文件代碼(glVertexAttribPointer)。步幅定義了一個頂點的數據有多大,而偏移量指定了實際數據從每個頂點開始有多遠。在你的情況下,每個頂點由4個浮點組成,因此步幅必須是4 * Float.BYTES。位置是每個頂點的前兩個浮點數(偏移量0),而紋理座標是第3個和第4個浮點數,這意味着offset = 2 * Float.BYTES。正確的代碼可能看起來在某種程度上像這樣(注意glVertexPointer代替glVertexAttribPointer使用):

glVertexPointer(2, GL_FLOAT, false, 4*Float.BYTES, 0); 
glTexCoordPointer(2, GL_FLOAT, 4*Float.BYTES, 2*Float.BYTES); 

編輯

您VAOs的使用也是錯誤的。在初始化過程中,您將glVertexPointer/glTexCoordPointer存儲到VAO vaoId。但是在渲染代碼中,您綁定了VAO 0。繪圖時很可能屬性設置不存在。另外,我不確定VAO是否與固定功能調用一起工作。在這種情況下,您可以刪除所有的VAO呼叫。

+0

上面的代碼根據'glVertexAttribPointer'還是'glVertexPointer'產生了一個無紋理的正方形或訪問衝突。另外,作爲一個查詢,那麼'glTexCoordPointer'的核心配置文件替換是什麼? – jediminer543

+0

核心配置文件替換爲'glVertexAttribPointer'。屬性由着色器定義,因此查詢紋理座標屬性的位置並將其用作'glVertexAttribPointer'的第一個參數。 – BDL

+0

有關更多詳細信息,請參閱編輯 – BDL