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