2016-11-16 69 views
0

有什麼要求能夠使用頂點數組對象?我知道一些GPU支持它,有些則不支持。我想知道在編譯時是否有某些額外的要求需要滿足。Android Open GL ES 2.0 - 頂點陣列對象(VAO)的要求是什麼?

是否需要使用最低的Android SDK版本?

Gradle(Android Studio)中compileSdkVersion,minSdkVersion和targetSdkVersion的最小值是多少?

需要在設備上安裝的最低Android版本是什麼?或者它可能並不重要,並且GPU支持或不支持?

+1

無論如何,您需要在運行時檢查是否存在GL_OES_vertex_array_object,解析相應的入口點並使用它們。這應該是相當獨立的Android版本。 – peppe

+0

是的,我在運行時檢查它是否可用(Cocos2d-x自動執行並保存它)。我只是想知道編譯時是否還有其他要求。 – keyboard

+1

這是一個可選的擴展,你需要檢查它是一個GPU驅動程序的東西。在需要OpenGL ES 2.0的情況下,與Android無關。 –

回答

-1

據我所知,API 9引入了openGL ES 2.0。對在onCreate方法啓動只需添加:

// Check if the system supports OpenGL ES 2.0. 

final ActivityManager activityManager = 
     (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
final ConfigurationInfo configurationInfo = 
     activityManager.getDeviceConfigurationInfo(); 
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

if (!supportsEs2) 
{ 
    Log.i("WLGFX","Device does not support OpenGL ES 2.0"); 
    System.exit(-1); 
    return; 
} 

它也一直是我上次看了VAO的很長一段時間,我真的以爲他們得到了完全擺脫他們。爲了表現,請使用VBO。它們同樣易於創建和使用。以下是一些示例代碼片段:

void FFDisplay::init_texture_buffers() { // for overlay screen 
    GLfloat vertices[] = { 
      -1.0f, -1.0f,  0.0f, 1.0f, // X, Y, U, V 
      -1.0f, 1.0f,  0.0f, 0.0f, 
      1.0f, 1.0f,  1.0f, 0.0f, 
      1.0f, -1.0f,  1.0f, 1.0f 
    }; 

    GLushort indices[] = { 2, 1, 0, 2, 0, 3 }; 

    glGenBuffers(2, texture_buffers); 
    glBindBuffer(GL_ARRAY_BUFFER, texture_buffers[0]); 
    glBufferData(GL_ARRAY_BUFFER, 64, vertices, GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, texture_buffers[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, indices, GL_DYNAMIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

    texture_texture = 0; 
} 

void FFDisplay::init_overlay_texture() { 
    glGenTextures(1, &overlay_texture); 
    glBindTexture(GL_TEXTURE_2D, overlay_texture); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_HINT, GL_FALSE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FFD_OVERLAY_WID, FFD_OVERLAY_HGT, 
       0, GL_RGBA, GL_UNSIGNED_BYTE, overlay_image); 
} 

void FFDisplay::draw_overlay() { 
    glUseProgram(prog_texture); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, overlay_texture); 

    glUniform1i(texture_texture, 0); 

    glEnableVertexAttribArray(texture_vertex); 
    glEnableVertexAttribArray(texture_uv); 

    glBindBuffer(GL_ARRAY_BUFFER, texture_buffers[0]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, texture_buffers[1]); 

    glVertexAttribPointer(texture_vertex, 2, GL_FLOAT, GL_FALSE, 16, NULL); 
    glVertexAttribPointer(texture_uv, 2, GL_FLOAT, GL_FALSE, 16, (void*)8); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 

    glDisableVertexAttribArray(texture_uv); 
    glDisableVertexAttribArray(texture_vertex); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

有大量關於GLES 2.0的信息可以幫助您入門。

+0

這是完全錯誤的。 VAO在ES 2.0中不可用(除了作爲擴展名),並且僅在ES 3.0中引入。看起來你可能會把它們與客戶端頂點數組混淆起來。這些是非常不同的東西。 –

+0

是的,我正在考慮舊的客戶端頂點數組,這就是爲什麼我提到VBO的原因。 – WLGfx