2012-04-11 18 views
0

私は三角形をY軸の周りに回転させるために単純なHello Triangleアプリケーションを拡張しようとしています。私は、C++にコードを適合させ、PowerVR SDKを使用するだけで、Android Hello Triangleを参考にしてみました。これまでのところ、私は多くの運がない。三角形だけが静かにそこに座っています。問題が何であるか分かりません。ここに私のinit関数があります: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; 
} 

はここDraw関数です:

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); 
} 

だから基本的に私は私のinitに表示し、投影行列を設定しています。次に、Draw関数で、回転行列と新しい角度で定期的な時間間隔でモデル行列を再計算します。角度が360になると、それを0にリセットし、すすぎ、繰り返します。

行列の値を確認したところ、角度が変わると変化しています。だから私はそれがシェイダーに値を渡しているときにどこかで壊れていると思っています。

答えて

1

drawループの最後にglGetError呼び出しを入れて、それが常に0であることを確認できますか?これは通常、開始するのに最適な場所です。あなたのユニフォームに関連するコードは私にはうまく見えます(私はPVRTMat4の詳細はわかりませんが、今はそれが何をすべきかを考えています)。

1つの小さなエラーが表示されますが、関連するかどうかはわかりません。

この:glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &linked);

は次のようになります。glGetProgramiv(programObject, GL_LINK_STATUS, &linked);

あなたは成功したリンクの場合には0であることが保証されていないとして、条件を/パスとして情報ログの長さをチェック失敗したくありません。

===

ああ、私は問題を見る。 Initのカラーバッファのみをクリアしている場合は、すべてのフレームでDrawでクリアする必要があります。あなたの三角形はおそらく回転していますが、決してクリアされていないオリジナルの三角形によって隠されているため、あなたはそれを見ることができません。

+0

それでした!ありがとう! – Legion

関連する問題