2012-01-30 29 views
0

現在我希望你能幫助我解決這個問題,我已經有好幾天了,沒有找到任何解決辦法。我覺得,我已經盡全力解決了這個問題,但都沒有成功。OpenGL VBO - 數組步幅錯誤?

首先: 我在場景中有一些使用VBOs進行渲染的對象。沒有別的,沒有其他的四邊形,多邊形等只有在屏幕截圖中的,將遵循。

我駐維也納各組織的生成,代碼很簡單,希望明確comprehensable:

生成VBO

public boolean buffer() { 
    FloatBuffer[] vertexBuffer = new FloatBuffer[1]; 
    vertexBuffer[0] = FloatBufferFactory.create(this.triangles.size() * 3 * 11); 

    for (Triangle triangle : this.triangles) { 
     for (int i = 0; i < 3; i++) { 
      vertexBuffer[0].put(triangle.vertex[i].position.x); 
      vertexBuffer[0].put(triangle.vertex[i].position.y); 
      vertexBuffer[0].put(triangle.vertex[i].position.z); 

      vertexBuffer[0].put(triangle.vertex[i].normal.x); 
      vertexBuffer[0].put(triangle.vertex[i].normal.y); 
      vertexBuffer[0].put(triangle.vertex[i].normal.z); 

      vertexBuffer[0].put(triangle.vertex[i].color.r); 
      vertexBuffer[0].put(triangle.vertex[i].color.g); 
      vertexBuffer[0].put(triangle.vertex[i].color.b); 

      vertexBuffer[0].put(triangle.vertex[i].uvset.x); 
      vertexBuffer[0].put(triangle.vertex[i].uvset.y); 
     } 
    } 

    vertexBuffer[0].position(0); 

    GLES20.glGenBuffers(1, this.buffer, 0); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.buffer[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuffer[0].capacity() * 4, vertexBuffer[0], GLES20.GL_STATIC_DRAW); 

    return true; 
} 

這很簡單:我自己在FloatBufferFactory函數創建一個Floatbuffer與count-三角形* 3 * 11 * 4字節。 然後我把它的數據,爲三角形的每個頂點。

我的邏輯:一個頂點12字節(3 * 4字節),一個正常位置12字節,Vertexcolordata 12字節,UV座標8字節。

渲染

當我渲染網格,我用下面的函數一樣簡單另一種:

public void render() { 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.buffer[0]); 

    GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0]); 
    GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 12); 
    GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 24); 
    GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 36);   

    this.passMaterialUniforms(); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, this.triangles.size() * 3); 
} 

現在,我的邏輯,我的理解是: 以字節爲單位的所有數據對於一個頂點是:12Bytes(位置)+ 12Bytes(正常)+ 12Bytes(顏色)+ 8Bytes(uv) - >結論:每個頂點有44個字節,所以下一個頂點應該在44個字節之後。 - >步幅:每個數據44字節。

接下來的想法是設置開始偏移:0Bytes的位置,12Bytes正常,24Bytes的顏色和36Bytes的紫外線。 目前爲止這麼好。

的主要問題

現在似乎有發生的一些非常,在PROGRAMM非常怪異。在創建了3個以上的對象後,前三個對象生成的對象顯示錯誤。

在這裏,截圖: 第一個例子,並嘗試(生成:5環面中的行): As you can see, in the first picture the 4. and 5. Torus (Tori?!) are distorted and look like beans or lenses, or something like that.

第二個嘗試(生成的2個球,1個圓環,另一個球,另一個圓環): the 3. Sphere (4. generated object) looks quite normal, when you just look at the positions, but the texture-coordinates are very strange.

正如你所看到的,在第一張照片的4和5圓環(花托?)被扭曲,看起來像豆類或透鏡,或者類似的東西。 在第二張圖片中,3.球體(4.生成的物體)看起來很正常,只是看着位置,但紋理座標很奇怪。

那麼,爲什麼會這樣?我該如何解決這個問題?

謝謝! :)

回答

2

我認爲這是由於您啓用attrib指針的方式。

你寫這樣的:

GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0]); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 12); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 24); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, this.buffer[0] + 36); 

它應該是這樣的:

GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeVertex, 3, GLES20.GL_FLOAT, false, 44, 0); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeNormal, 3, GLES20.GL_FLOAT, false, 44, 12); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeColor, 3, GLES20.GL_FLOAT, false, 44, 24); 
GLES20.glVertexAttribPointer(BaseActivity.activeShader.attributeUV, 2, GLES20.GL_FLOAT, false, 44, 36); 

我建議無論如何定義一些常量,偏移計算。

在我的C引擎基於我的一切用的sizeof功能

+0

這似乎是答案,當VBO綁定爲,最後一個參數爲'glVertexAttribPointer'是一個字節偏移到當前綁定的緩衝區,從開始0. – 2012-01-30 14:14:28

+0

哦....我是個白癡:D謝謝,它現在工作得很完美! – TheWhiteLlama 2012-01-31 02:08:10

+0

@chrise:嗨,我們有兩個;-)第一次接觸這個話題時,我犯了同樣的錯誤;-)很高興能有幫助。 – 2012-01-31 06:48:33