2012-04-11 15 views
8

के सभी ट्यूटोरियल मैंने देखा है हमेशा एक ही चीज़ का इस्तेमाल, एक त्रिकोण या घन की तरह रूपांतरण। लेकिन यह मुझे स्पष्ट नहीं है कि मैं अलग-अलग वस्तुओं को स्वतंत्र रूप से कैसे उपयोग कर सकता हूं। मैंने कुछ ट्यूटोरियल देखे हैं जो फिक्स्ड फ़ंक्शन पाइपलाइन का संदर्भ लेते हैं और पुशमैट्रिक्स और पॉपमैट्रिक्स का उपयोग करते हैं, लेकिन प्रोग्राम करने योग्य पाइपलाइन के साथ ये फ़ंक्शन चले गए हैं। नीचे एक इनिट फ़ंक्शन और ड्रॉ फ़ंक्शन है जो स्क्रीन पर एक त्रिकोण खींचता है और इसे Z अक्ष के बारे में घुमाता है। क्या कोई मुझे दूसरा त्रिकोण जोड़ने के लिए कोड, या यहां तक ​​कि छद्म कोड दिखा सकता है और इसे अन्य त्रिकोण से स्वतंत्र रूप से घुमा सकता है? एक अलग अक्ष के आसपास या विपरीत दिशा में कहो?वस्तुओं स्वतंत्र रूप से ओपन 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; 
    double timelapse; 

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

    timelapse = difftime(time(NULL), userData->start) * 1000; 
    if(timelapse > 16.0f) //Maintain approx 60FPS 
    { 
     if (userData->angle > 360.0f) 
     { 
      userData->angle = 0.0f; 
     } 
     else 
     { 
      userData->angle += 0.1f; 
     } 
    } 

    userData->ModelMatrix = PVRTMat4::RotationZ(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); 

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

उत्तर

6

पहले त्रिकोण बनाने के बाद, अपने नए इच्छित रोटेशन/स्थिति के साथ एक नया एमवीपी मैट्रिक्स उत्पन्न करते हैं, इसे अपलोड, और फिर आकर्षित त्रिकोण दूसरी बार। आप दृश्य के दौरान जितनी बार चाहें वर्दी बदल सकते हैं।

यह पुश और पॉप क्या कर रहा है के समान है, वे किसी दिए गए ऑब्जेक्ट को चित्रित करने से पहले सक्रिय मैट्रिक्स को बदल रहे हैं।

उदाहरण स्यूडोकोड:

MMatrix = identity; 
MVPMatrix = VPMatrix * MMatrix; 
glUniformMatrix4fv(MVPHandle, 1, FALSE, MVPMatrix.ptr()); 
glDrawArrays(GL_TRIANGLES, 0, 3); //draw triangle at 0,0,0 

MMatrix.translate(1,0,0); 
MVPMatrix = VPMatrix * MMatrix; 
glUniformMatrix4fv(MVPHandle, 1, FALSE, MVPMatrix.ptr()); 
glDrawArrays(GL_TRIANGLES, 0, 3); //draw triangle at 1,0,0 

MMatrix.translate(1,0,0); 
MVPMatrix = VPMatrix * MMatrix; 
glUniformMatrix4fv(MVPHandle, 1, FALSE, MVPMatrix.ptr()); 
glDrawArrays(GL_TRIANGLES, 0, 3); //draw triangle at 2,0,0 

..repeat for as many objects as you want.. 

यह आपको तीन त्रिकोण के साथ, (0,0,0) में, छोड़ देंगे (1,0,0), और (2,0,0)।

+0

क्या आप थोड़ा और स्पष्ट हो सकते हैं? विशेष रूप से, यदि मैं एक अनुवाद को शामिल करने के लिए वर्दी एमवीपीमैट्रिक्स के मान को बदलता हूं, तो नए स्थान पर त्रिकोण की प्रतिलिपि बनाने के लिए यह कैसे पता चलेगा, और न केवल मौजूदा त्रिकोण को उस स्थान पर ले जायेगा? – Legion

+1

एक बार जब आप glDrawArrays के माध्यम से एक त्रिकोण भेजते हैं, तो यह हो जाता है। किसी भी चर में कोई और परिवर्तन इस पर कोई प्रभाव नहीं पड़ेगा। एक बार कुछ प्रस्तुत करने के बाद इसे 'स्थानांतरित' नहीं किया जा सकता है, इस प्रकार किसी भी वर्दी में परिवर्तन केवल परिवर्तन के बाद किए गए ड्रॉ कॉल को प्रभावित करेगा। मैंने समझने में आपकी सहायता के लिए मेरे उत्तर में थोड़ा सा नमूना कोड लगाया। – Tim

+0

@Legion नई टिप्पणी और स्पष्टीकरण के साथ अद्यतन – Tim

संबंधित मुद्दे