OpenGL ES 2.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,冲洗并重复。

我检查了矩阵值,它们随角度变化而变化。所以我猜测它在将值传递给着色器时会崩溃。

你可以在绘制循环的末尾放一个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