2012-04-11 122 views
0

我試圖擴展一個簡單的Hello Triangle應用程序,讓三角形圍繞Y軸旋轉。我嘗試使用Android Hello Triangle作爲參考,只是將代碼調整爲C++並使用PowerVR SDK。到目前爲止,我沒有太多的運氣。三角形坐在那裏,靜止。不確定是什麼問題。這是我的初始化函數:OpenGL ES 2.0中的旋轉三角形

int Init(ESContext* esContext) 
{ 
    UserData* userData = (UserData *)esContext->userData; 
    const char *vShaderStr = 
     "attribute vec4 vPosition; \n" 
     "uniform mat4 MVPMatrix;" 
     "void main()    \n" 
     "{       \n" 
     " gl_Position = MVPMatrix * vPosition;\n" 
     "}       \n"; 

    const char *fShaderStr = 
     "precision mediump float; \n" 
     "void main()    \n" 
     "{       \n" 
     " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n" 
     "}       \n"; 

    GLuint vertexShader; 
    GLuint fragmentShader; 
    GLuint programObject; 
    GLint linked; 
    GLfloat ratio = 320.0f/240.0f; 

    vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr); 
    fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr); 

    programObject = glCreateProgram(); 

    if (programObject == 0) 
     return 0; 

    glAttachShader(programObject, vertexShader); 
    glAttachShader(programObject, fragmentShader); 

    glBindAttribLocation(programObject, 0, "vPosition"); 
    glLinkProgram(programObject); 
    glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &linked); 

    if (!linked) 
    { 
     GLint infoLen = 0; 
     glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen); 

     if (infoLen > 1) 
     { 
      char* infoLog = (char *)malloc(sizeof(char) * infoLen); 
      glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); 

      free(infoLog); 
     } 

     glDeleteProgram(programObject); 
     return FALSE; 
    } 

    userData->programObject = programObject; 

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

    glViewport(0, 0, esContext->width, esContext->height); 
    glClear(GL_COLOR_BUFFER_BIT); 


    glUseProgram(userData->programObject); 

    userData->angle = 0.0f; 
    userData->start = time(NULL); 
    userData->ProjMatrix = PVRTMat4::Perspective(ratio*2.0f, 2.0f, 3.0f, 7.0f, PVRTMat4::eClipspace::OGL, false, false); 
    userData->ViewMatrix = PVRTMat4::LookAtLH(PVRTVec3(0.0f, 0.0f, -3.0f), PVRTVec3(0.0f, 0.0f, 0.0f), PVRTVec3(0.0f, 1.0f, 0.0f)); 
    return TRUE; 
} 

這裏的繪圖功能:

void Draw(ESContext *esContext) 
{ 
    GLfloat vVertices[] = {0.0f, 0.5f, 0.0f, 
          -0.5f, -0.5f, 0.0f, 
          0.5f, -0.5f, 0.0f}; 

    GLint MVPHandle; 

    PVRTMat4 MVPMatrix = PVRTMat4::Identity(); 
    UserData* userData = (UserData *)esContext->userData; 

    if((GLint)(difftime(time(NULL), userData->start)) % 2 == 0) 
    { 
     if (userData->angle > 360.0f) 
     { 
      userData->angle = 0.0f; 
     } 
     else 
     { 
      userData->angle += 0.1f; 
     } 
    } 

    userData->ModelMatrix = PVRTMat4::RotationY(userData->angle); 

    MVPMatrix = userData->ViewMatrix * userData->ModelMatrix; 
    MVPMatrix = userData->ProjMatrix * MVPMatrix; 

    MVPHandle = glGetUniformLocation(userData->programObject, "MVPMatrix"); 
    glUniformMatrix4fv(MVPHandle, 1, FALSE, MVPMatrix.ptr()); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); 
    glEnableVertexAttribArray(0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 
    eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface); 
} 

所以基本上我在我的初始化設置了查看和投影矩陣。然後,在Draw函數中,我使用旋轉矩陣和新角度以規則的時間間隔重新計算模型矩陣。當角度達到360°時,我將它重置爲0,沖洗並重復。

我檢查了矩陣值,它們隨角度變化而變化。所以我猜測它在將值傳遞給着色器時會崩潰。

回答

1

你可以在繪製循環的末尾放一個glGetError調用,並檢查它總是0嗎?這通常是最好的開始。你的制服相關代碼對我來說看起來很好(雖然我不知道PVRTMat4的具體情況,但我現在假設它正在做它應該做的事情)。

我確實看到一個小錯誤,但我不確定它是否相關。

此:glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &linked);

應該是:glGetProgramiv(programObject, GL_LINK_STATUS, &linked);

你不想檢查信息日誌長度合格/不合格狀態,因爲它不能保證在成功連接的情況下爲0 。

===編輯===

啊,我看這個問題。您只清除Init中的顏色緩衝區,您應該每幀清除它在Draw。你的三角形可能是旋轉的,但你不能看到它,因爲它被從未被清除的原始三角形遮擋。

+0

就是這樣!謝謝! – Legion 2012-04-11 18:12:03