2011-06-28 63 views
0

時,這是我的的OpenGL-ES 2.0代碼:問題移植從OpenGL的1.1至的OpenGL-ES 2.0

{ 
    for (surfnum=0;surfnum<surftotal;surfnum++){ 
     for (i=0;i<triNum[surfnum];i++){ 
      GLfloat *Vertices[] = { triArray[surfnum][i].normpt1, triArray[surfnum][i].normpt2,triArray[surfnum][i].normpt3}; 
      glGenBuffers(1, &ui32Vbo); 
      glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo); 
      unsigned int uiSize = 3 * (sizeof(GLfloat) * 1); 
      glBufferData(GL_ARRAY_BUFFER, uiSize,*Vertices, GL_STATIC_DRAW); 
     } 
    } 
} 
for(int i = 0; i < 80000; ++i) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    int i32Location = glGetUniformLocation(uiProgramObject, "projmatrix"); 
    glUniformMatrix4fv(i32Location, 1, GL_FALSE, pfIdentity); 
    glEnableVertexAttribArray(VERTEX_ARRAY); 
    glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0,i); 
    eglSwapBuffers(eglDisplay, eglSurface); 
} 

這是我的OpenGL-ES 2.0代碼。我正在研究opengl 1.1,其中我能夠顯示iso表面形式數據。

這是我的Opengl 1.1代碼:

void drawTriangle() 
{ 
    int surfnum, i; 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0,0.6,0.1); 


    for (surfnum=0;surfnum<surftotal;surfnum++) 
    { 
     for (i=0;i<triNum[surfnum];i++) 
       { 
      glBegin(GL_POLYGON); 
      glNormal3fv(triArray[surfnum][i].normpt1); 
      glVertex3fv(triArray[surfnum][i].pt1); 
      glNormal3fv(triArray[surfnum][i].normpt2); 
      glVertex3fv(triArray[surfnum][i].pt2); 
      glNormal3fv(triArray[surfnum][i].normpt3); 
      glVertex3fv(triArray[surfnum][i].pt3); 
      glEnd(); 
      glFlush(); 
      glutSwapBuffers(); 
     } 
    } 
} 

我沒有得到相同的結果,因爲我是在OpenGL饒人,在OpenGL-ES 2.0也是一個

警告未來,如:libegl :使用軟件回退;
輸出非常緩慢
這裏它在輸出窗口

如果你想的其他信息問我。

+0

這看起來正確的正投影矩陣。發生了什麼,你期望會發生什麼? – Mikola

回答

1

您的代碼沒有意義。

{ 
    for (surfnum=0;surfnum<surftotal;surfnum++){ 
     for (i=0;i<triNum[surfnum];i++){ 
      GLfloat *Vertices[] = { triArray[surfnum][i].normpt1, triArray[surfnum][i].normpt2,triArray[surfnum][i].normpt3}; 
      glGenBuffers(1, &ui32Vbo); 
      glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo); 
      unsigned int uiSize = 3 * (sizeof(GLfloat) * 1); 
     glBufferData(GL_ARRAY_BUFFER, uiSize,*Vertices, GL_STATIC_DRAW); 
     } 
    } 
} 

實際上你是否爲每個三角形創建一個緩衝區對象?那麼,你甚至沒有這樣做,因爲你只有3個浮點數的緩衝對象,甚至不是完整的三角形。我只能假設這是一個頂點位置。你在這個循環的中間繼續調用glGenBuffers,所以它會盡職地生成另一個緩衝區對象。創建太多的緩衝區對象可能就是爲什麼你要進行軟件回退。

另外,不是normpt1包含正常,而不是位置?

然後還有這個:

for(int i = 0; i < 80000; ++i) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    int i32Location = glGetUniformLocation(uiProgramObject, "projmatrix"); 
    glUniformMatrix4fv(i32Location, 1, GL_FALSE, pfIdentity); 
    glEnableVertexAttribArray(VERTEX_ARRAY); 
    glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0,i); 
    eglSwapBuffers(eglDisplay, eglSurface); 
} 

首先,你沒有glBindBuffer您的緩衝區對象。是的,我知道它仍然與之前一樣,但是明確這些事情總是很好的。

最重要的是什麼:glDrawArrays(GL_TRIANGLES, 0,i);?數組索引是不是i?第三個參數需要是要繪製的頂點數。並且GL_TRIANGLES將失敗,除非該值可被3整除。

但這並不重要,因爲上次創建的緩衝區對象只有1個頂點的空間。所以它是不可能來渲染。

+0

謝謝,我明白我的錯誤,我會爲此努力。 –