Moderators Kercyn Δημοσ. 18 Μαΐου 2016 Moderators Δημοσ. 18 Μαΐου 2016 (επεξεργασμένο) Καλησπέρα σας. Έχω ένα ορθογώνιο το οποίο προσπαθώ να περιστρέψω γύρω απ' το κέντρο του. Το πρόβλημα είναι ότι κάνω κάτι λάθος και αλλάζει διαστάσεις καθώς γυρνάει. Φαντάζομαι ότι είναι κάτι πολύ απλό που μου διαφεύγει αλλά δε μπορώ να βρω τι είναι. Μπορείτε να δείτε την περιστροφή εδώ. Βάζω τον κώδικα στον οποίο εικάζω ότι βρίσκεται το πρόβλημα. Rendering void MRenderer::RenderColliders() const { const auto& Colliders = MPhysicsManager::Instance().GetColliders(); GLuint VertexBufferID; // Current offset of our collider vertices. int Offset = 0; // Each collider's index in the vertex buffer. std::vector<GLint> ColliderIndices; // Each collider's total vertices. std::vector<GLsizei> ColliderVertexLength; GL_CALL(glGenBuffers(1, &VertexBufferID)); GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID)); GL_CALL(glBufferData(GL_ARRAY_BUFFER, 400, 0, GL_STATIC_DRAW)); GL_CALL(glEnableVertexAttribArray(0)); GL_CALL(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0)); for (const auto& Collider : Colliders) { Collider.second->Shape->Rotate(0.01f); std::vector<Vector2> ShapeVertices = Collider.second->GetVertices(); std::vector<GLfloat> VertexBuffer; for (int i = 0; i < ShapeVertices.size(); i++) { VertexBuffer.push_back(ShapeVertices[i].GetX()); VertexBuffer.push_back(ShapeVertices[i].GetY()); } ColliderIndices.push_back(Offset); ColliderVertexLength.push_back(ShapeVertices.size()); GL_CALL(glBufferSubData(GL_ARRAY_BUFFER, Offset, VertexBuffer.size() * sizeof(GLfloat), VertexBuffer.data())); Offset += VertexBuffer.size(); } GL_CALL(glMultiDrawArrays(GL_LINE_LOOP, ColliderIndices.data(), ColliderVertexLength.data(), ColliderIndices.size())); GL_CALL(glDisableVertexAttribArray(0)); } Matrix22 void Matrix22::SetRotation(float Radians) { float cos = std::cos(Radians); float sin = std::sin(Radians); m00 = cos; m01 = -sin; m10 = sin; m11 = cos; } const Vector2 Matrix22::operator*(const Vector2& rhs) const { return Vector2((m00 * rhs.GetX()) + (m01 * rhs.GetY()), (m10 * rhs.GetX()) + (m11 * rhs.GetY())); } Shape void POBB::Rotate(float Radians) { Rotation += Radians; } std::vector<Vector2> POBB::GetVertices() const { // Vertices of non-rotated OBB centered at origin. std::vector<Vector2> Vertices; Vertices.push_back(Vector2(-HalfWidth, -HalfHeight)); Vertices.push_back(Vector2(-HalfWidth, HalfHeight)); Vertices.push_back(Vector2(HalfWidth, HalfHeight)); Vertices.push_back(Vector2(HalfWidth, -HalfHeight)); for (auto& Vertex : Vertices) { // Apply rotation Matrix22 RotationMat(Rotation); Vertex = RotationMat * Vertex; // Translate to actual center Vertex.SetCoords(Vertex.GetX() + Center.GetX(), Vertex.GetY() + Center.GetY()); } return Vertices; } EDIT: Μάλλον έχω κάνει βλακεία στο viewport, το κοιτάω τώρα. EDIT2: Τελικά μάλλον αυτό έφταιγε. Άλλαξα το GL_CALL(glViewport(0, 0, Camera.Resolution.x, Camera.Resolution.y)); σε if (Camera.Resolution.x > Camera.Resolution.y) { GL_CALL(glViewport(0, (Camera.Resolution.y - Camera.Resolution.x) / 2, Camera.Resolution.x, Camera.Resolution.x)); } else { GL_CALL(glViewport((Camera.Resolution.x - Camera.Resolution.y) / 2, 0, Camera.Resolution.y, Camera.Resolution.y)); } Επεξ/σία 19 Μαΐου 2016 από Kercyn
παπι Δημοσ. 19 Μαΐου 2016 Δημοσ. 19 Μαΐου 2016 Τους buffers θα τους βαλεις μια φορα και απο εκει και περα θα τους βλεπεις ως reference στη vram. Rotate θα κανεις στη gpu οχι στη cpu. Το απλο ειναι.να.πουσαρεις μια μητρα και να την κανεις rotate. Θα σου ελεγα να δεις shaders. Δηλαδη να γραψεις προγραμμα στη gpu. Στην αρχη θα ειναι παλουκι, αλλα μετα θα λες, ρε τι εκανα παλια ο μαλακας. Παλουκι διοτι δουλευεις με 800 πυρινες 1
Moderators Kercyn Δημοσ. 19 Μαΐου 2016 Μέλος Moderators Δημοσ. 19 Μαΐου 2016 Εσύ ωραία τα λες αλλά εγώ δεν έχω ιδέα. Μιας και το αρχικό πρόβλημα "λύθηκε", κρατάω το thread για να γράφω απορίες. Έχω μερικές αλλά τώρα είναι αργά και θέλω να τις γράψω προσεκτικά.
AlexHello Δημοσ. 19 Μαΐου 2016 Δημοσ. 19 Μαΐου 2016 Τους buffers θα τους βαλεις μια φορα και απο εκει και περα θα τους βλεπεις ως reference στη vram. Rotate θα κανεις στη gpu οχι στη cpu. Το απλο ειναι.να.πουσαρεις μια μητρα και να την κανεις rotate. Θα σου ελεγα να δεις shaders. Δηλαδη να γραψεις προγραμμα στη gpu. Στην αρχη θα ειναι παλουκι, αλλα μετα θα λες, ρε τι εκανα παλια ο μαλακας. Παλουκι διοτι δουλευεις με 800 πυρινες Ναι μακράν ο πιο efficient τρόπος. πασαρεις την modelview projection matrix (translation, rotation, scale, view, projection) ως έχει στο shader για να εκμεταλλευτείς το parallelism της gpu.. Btw την MVP matrix την πασαρεις εννοείται και χωριστά κάθε μήτρα αν θες να κανείς update τα normals με την rotation matrix πχ..
παπι Δημοσ. 20 Μαΐου 2016 Δημοσ. 20 Μαΐου 2016 δες εδω, εγρψα ενα προγραμμα το οποιο εχει μια κλεψυδρα που περιστρεφεται και ακολουθει μια διαδρομη ημιτονου. #include <Windows.h> #include <GL\glew.h> #include <GL\wglew.h> #include <GL\GLU.h> #include <math.h> #pragma comment(lib, "glew32.lib") #pragma comment(lib, "opengl32.lib") HGLRC glDevice; GLuint triMesh; LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); void OnCreate(HWND hWnd); void InitMesh(); void Render(HWND hWnd); int CALLBACK WinMain(HINSTANCE, HINSTANCE, PSTR, int) { WNDCLASSEX cs = { 0 }; cs.cbSize = sizeof cs; cs.hCursor = LoadCursor(NULL, IDC_ARROW); cs.lpszClassName = L"clsOpenGLwnd"; cs.lpfnWndProc = WndProc; RegisterClassEx(&cs); HWND hWnd = CreateWindow(cs.lpszClassName, L"OpenGL Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, 0); ShowWindow(hWnd, SW_SHOW); MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: OnCreate(hWnd); InitMesh(); SetTimer(hWnd, 0, 10, 0); break; case WM_TIMER: Render(hWnd); break; case WM_SIZE: glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));//remap backbuffer sto para8uro glMatrixMode(GL_PROJECTION);//select projection matrix glLoadIdentity();// ka8arizoyme oti eixe { float aspect = float(LOWORD(lParam)) / float(HIWORD(lParam)); glOrtho(-aspect, aspect, -1, 1, -1, 1);// ayto einai gia na mhn "tentonetai" otan allazeis mege8os sto para8yro } break; case WM_CLOSE: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } void OnCreate(HWND hWnd) { //init gl HDC hDc = GetDC(hWnd); PIXELFORMATDESCRIPTOR pfd = { 0 }; pfd.nSize = sizeof pfd; pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = PFD_MAIN_PLANE; int pixelformat = ChoosePixelFormat(hDc, &pfd); if (!pixelformat) DebugBreak(); SetPixelFormat(hDc, pixelformat, &pfd); HGLRC tempContext = wglCreateContext(hDc); wglMakeCurrent(hDc, tempContext); glewInit(); int attribs[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 1, WGL_CONTEXT_FLAGS_ARB, 0, 0 }; if (wglewIsSupported("WGL_ARB_create_context") == 1) { glDevice = wglCreateContextAttribsARB(hDc, 0, attribs); wglMakeCurrent(NULL, NULL); wglDeleteContext(tempContext); wglMakeCurrent(hDc, glDevice); } else { //It's not possible to make a GL 3.x context. Use the old style context (GL 2.1 and before) glDevice = tempContext; } ReleaseDC(hWnd,hDc); } void InitMesh() { float tri[] = { -1,-1, 0,1, 1,-1 }; //edw metaferoyme to mesh mas sth vram //to triMesh einai to reference tou //edw den kserw ti kanei to gl glGenVertexArrays(1, &triMesh); glBindVertexArray(triMesh); //edw kaneis allocation glGenBuffers(1, &triMesh); //edw epilegeis ton buffer, oti call kaneis poy exei sxesh me to buffer, ua anaferetai se ayto poy epilegeis edw glBindBuffer(GL_ARRAY_BUFFER, triMesh); //edw stelneis ta dedomena apo thn ram sth vram glBufferData(GL_ARRAY_BUFFER, sizeof tri, tri, GL_STATIC_DRAW); //edw einai h perigrafh tou vertex glVertexAttribPointer( 0, // apo poy arxizei to vertex (apo to 0) 2, // posa compoments exei (2 x,y) GL_FLOAT, //typos twn compoments (float) false, // na ta kaneis 1/x, den mas endiaferei 0, //stride, den exoyme. 0);// den kserw ti kanei glEnableVertexAttribArray(0);// oyte ayto kserw ti kanei } float rotation = 0; void Render(HWND hWnd) { //ypologizoyme to rotation poy 8a kanei ana frame rotation += 0.9; if (rotation > 360) rotation = 0; //ka8arismos toy buffer glClear(GL_COLOR_BUFFER_BIT); //epilogi to mesh poy 8eloyme na doylepsoyme glBindVertexArray(triMesh); //epilogh to matrix poy 8eloyme na doylepsoyme glMatrixMode(GL_MODELVIEW); //kauarizoyme to matrix glLoadIdentity(); //oi synartiseis translate,rotate,scale klp, ftiaxnoyn ena matrix to opoio polaplasiazoyn me to epilegmeno (GL_MODELVIEW) //to kako me to gl poy vlepw twra, einai pws exei ta matrix esoterika. Etsi gia na efarmoseis transformation apo mesa pros ta ejw, 8a prepei //na grafeis anapoda... //edw einai to telos //telos 8a kanoyme olo to modelo mas na akoloy8ei ena cosine monomati glTranslatef(rotation /90.f -2.f, cos((rotation * 3.14) / 180.f), 0); //twra to mikrenoyme sto 20% oste na fenetai mikro glScalef(0.2, 0.2, 1); //efoson exoyme allaksei to kentro varos, to peristrefoyme apo thn korifi glRotatef(rotation, 0, 0, 1); //pame to trgwno mia monada katw oste h korifh toy na einai to kentro varos glTranslatef(0, -1, 0); //edw einai h arxh //twra poy ftiaksame to matrix mas, kaloyme thn pipeline panw sto buffer mas glDrawArrays(GL_TRIANGLES, 0, 3); //edw twra exoyme zwgrafismeno to trigwno mas sto backbuffer //twra 8a zwgrafisoyme allo ena //ka8arizoyme to matrix mas, efson pame gia neo montelo glLoadIdentity(); //ta idia glTranslatef(rotation / 90.f - 2.f, cos((rotation * 3.14) / 180.f), 0); //ta idia glScalef(0.2, 0.2, 1); //mono edw exoyme allagi, edw oysiastika to peristrefoyme 180 mires epipleon etsi oste ta dyo trigwna na ftiaksoyn mia klepsidra glRotatef(rotation + 180, 0, 0, 1); //ta idia me to allo glTranslatef(0, -1, 0); //zwgrafizoyme kai to deytero trigwno glDrawArrays(GL_TRIANGLES, 0, 3); //telos kanoyme swap ton backbuffer me ton screen buffer. HDC hDc = GetDC(hWnd); SwapBuffers(hDc); ReleaseDC(hWnd,hDc); } 1
Moderators Kercyn Δημοσ. 22 Μαΐου 2016 Μέλος Moderators Δημοσ. 22 Μαΐου 2016 Καταρχάς σ' ευχαριστώ πάρα πολύ που κάθησες και τα έγραψες όλα αυτά με σχόλια. Τόσες μέρες κάθομαι διαβάζω tutorials και παραδείγματα κλπ και λέει ο καθένας τα δικά του. Μερικά είναι πολύ παλιά και όχι μόνο δε βοηθάνε αλλά με μπερδεύουν κιόλας. Τα docs επίσης δεν την παλεύουν κάστανο και δεν πολυβγάζω νόημα από εκεί. Αυτό που θέλω να κάνω είναι το εξής: Το παιχνίδι μου αποτελείται από 2D χάρτες με tiles (στυλ platformer). Τα tiles αυτά αποθηκεύονται όλα μαζί σε μία εικόνα (tileset) και είναι συγκεκριμένου και σταθερού μεγέθους. Ο χάρτης αποτελείται από διάφορα layers, τα οποία μπορεί να έχουν tiles από ένα ή περισσότερα tilesets. Το κάθε tile έχει ένα ID το οποίο μοναδικό ακόμα και σε διαφορετικά tilesets. Δηλαδή το πρώτο tileset έχει IDs από 1 μέχρι n, το 2ο από n+1 μέχρι k, το 3ο από k+1 μέχρι l κ.ο.κ. Με βάση αυτό το ID μπορώ να ξέρω σε ποιο tileset ανήκει το κάθε tile. Αυτό το κομμάτι του χάρτη είναι αμετάβλητο και δεν υπάρχει λόγος να υπολογίζονται όλα αυτά σε κάθε frame. Ο κώδικας που έχω τώρα και δουλεύει είναι πολύ μακριά απ' το ιδανικό. Θέλω να φορτώνω όλο το χάρτη σε ένα buffer μαζί με ό,τι άλλη πληροφορία χρειάζεται και να γίνεται render ένας έτοιμος buffer σε κάθε frame. Πώς μπορώ να το κάνω αυτό; Δεν είμαι σίγουρος τι πρέπει να αποθηκεύσω πού. Αν πούμε ότι τα vertices του κάθε tile μπαίνουν σ' ένα VBO, πού μπορώ να αποθηκεύσω τα texture coords για το κάθε tile; Απ' αυτά που έχω δει μέχρι τώρα καταλαβαίνω ότι πρέπει να το βάλω σε shader που θα τα υπολογίζει. Είδα σήμερα για TBO αλλά δεν το έχω διαβάσει καλά, θα το δω καλύτερα τις επόμενες μέρες αλλά απ' ό,τι κατάλαβα μου κάνει.
παπι Δημοσ. 23 Μαΐου 2016 Δημοσ. 23 Μαΐου 2016 #include <Windows.h> #include <GL\glew.h> #include <GL\wglew.h> #include <GL\GLU.h> #include <math.h> #pragma comment(lib, "glew32.lib") #pragma comment(lib, "opengl32.lib") struct Vertex { struct { float x, y; } position; struct { float u, v; } texCoord; }; HGLRC glDevice; GLuint triMesh, triTex; LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); void OnCreate(HWND hWnd); void InitMesh(); void Render(HWND hWnd); int CALLBACK WinMain(HINSTANCE, HINSTANCE, PSTR, int) { WNDCLASSEX cs = { 0 }; cs.cbSize = sizeof cs; cs.hCursor = LoadCursor(NULL, IDC_ARROW); cs.lpszClassName = L"clsOpenGLwnd"; cs.lpfnWndProc = WndProc; RegisterClassEx(&cs); HWND hWnd = CreateWindow(cs.lpszClassName, L"OpenGL Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, 0); ShowWindow(hWnd, SW_SHOW); MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: OnCreate(hWnd); InitMesh(); SetTimer(hWnd, 0, 10, 0); break; case WM_TIMER: Render(hWnd); break; case WM_SIZE: glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));//remap backbuffer sto para8uro glMatrixMode(GL_PROJECTION);//select projection matrix glLoadIdentity();// ka8arizoyme oti eixe { float aspect = float(LOWORD(lParam)) / float(HIWORD(lParam)); glOrtho(-aspect, aspect, -1, 1, -1, 1);// ayto einai gia na mhn "tentonetai" otan allazeis mege8os sto para8yro } break; case WM_CLOSE: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } void OnCreate(HWND hWnd) { //init gl HDC hDc = GetDC(hWnd); PIXELFORMATDESCRIPTOR pfd = { 0 }; pfd.nSize = sizeof pfd; pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = PFD_MAIN_PLANE; int pixelformat = ChoosePixelFormat(hDc, &pfd); if (!pixelformat) DebugBreak(); SetPixelFormat(hDc, pixelformat, &pfd); HGLRC tempContext = wglCreateContext(hDc); wglMakeCurrent(hDc, tempContext); glewInit(); int attribs[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 1, WGL_CONTEXT_FLAGS_ARB, 0, 0 }; if (wglewIsSupported("WGL_ARB_create_context") == 1) { glDevice = wglCreateContextAttribsARB(hDc, 0, attribs); wglMakeCurrent(NULL, NULL); wglDeleteContext(tempContext); wglMakeCurrent(hDc, glDevice); } else { //It's not possible to make a GL 3.x context. Use the old style context (GL 2.1 and before) glDevice = tempContext; } ReleaseDC(hWnd,hDc); } void InitMesh() { /* float tri[] = { -1,-1, 0,1, 1,-1 };*/ Vertex tri[]{ {{-1,-1},{0,0}}, {{-1,1,}, {1,0}}, {{1,1}, {1,1}}, {{1,-1},{0,1}} }; //edw metaferoyme to mesh mas sth vram //to triMesh einai to reference tou //edw den kserw ti kanei to gl glGenVertexArrays(1, &triMesh); glBindVertexArray(triMesh); //edw kaneis allocation glGenBuffers(1, &triMesh); //edw epilegeis ton buffer, oti call kaneis poy exei sxesh me to buffer, ua anaferetai se ayto poy epilegeis edw glBindBuffer(GL_ARRAY_BUFFER, triMesh); //edw stelneis ta dedomena apo thn ram sth vram glBufferData(GL_ARRAY_BUFFER, sizeof tri, tri, GL_STATIC_DRAW); //edw einai h perigrafh tou vertex glVertexAttribPointer( 0, // apo poy arxizei to vertex (apo to 0) 2, // posa compoments exei (2 x,y) GL_FLOAT, //typos twn compoments (float) false, // na ta kaneis 1/x, den mas endiaferei 0, //stride, den exoyme. 0);// den kserw ti kanei // glEnableVertexAttribArray(0);// oyte ayto kserw ti kanei //load mia bitmap, apo dw 8eme mona ta bits kai to h/w BITMAP bitmap; auto himg = LoadImage(NULL, L"texture.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); GetObject(himg, sizeof bitmap, &bitmap); HDC hDc = CreateCompatibleDC(NULL); SelectObject(hDc, himg); auto size = bitmap.bmHeight * bitmap.bmWidth * 4; auto textBuffer = new char[size]; GetBitmapBits((HBITMAP)himg, size, textBuffer); DeleteDC(hDc); DeleteObject(himg); // //ayta ta gen akoma den exw katalabei ti kanoyn glGenTextures(1, &triTex); //epilegoyme to texture glBindTexture(GL_TEXTURE_2D, triTex); //vazoyme merika options glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); //kanoyme allocation kai metafora apo ram se vram glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, // ayto einai klasiko format gia xrwma (edw einai gia vram) bitmap.bmWidth, bitmap.bmHeight, 0, GL_BGR, // edw einai to format toy input, ta bitmap exoyn anapoda to rgb, mporei na exei kai alpha to opoio einai panta 0xff GL_UNSIGNED_BYTE, textBuffer ); delete[] textBuffer; //den kserw giati 8elei "enable" to texture, se dx den exei tetoia glEnable(GL_TEXTURE_2D); //den exw idea pali giati prepei na kaneis enable glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); //edw ftiaxneis to layout toy Vertex, posa compoments exei to position, poy einai klp glVertexAttribPointer(0, 2, GL_FLOAT, 0, sizeof Vertex, (void*)offsetof(Vertex, position)); glTexCoordPointer(2, GL_FLOAT, sizeof Vertex, (void*)offsetof(Vertex, texCoord)); } float rotation = 0; void Render(HWND hWnd) { //ypologizoyme to rotation poy 8a kanei ana frame rotation += 0.9; if (rotation > 360) rotation = 0; //ka8arismos toy buffer glClear(GL_COLOR_BUFFER_BIT); //epilegoyme twn buffer kai to texture me to opoio 8a doylepsoyme glBindTexture(GL_TEXTURE_2D, triTex); glBindBuffer(GL_VERTEX_ARRAY, triMesh); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(rotation /90.f -2.f, cos((rotation * 3.14) / 180.f), 0); glScalef(0.2, 0.2, 1); glRotatef(rotation, 0, 0, 1); glTranslatef(0, -1, 0); glDrawArrays(GL_QUADS, 0, 4); HDC hDc = GetDC(hWnd); SwapBuffers(hDc); ReleaseDC(hWnd,hDc); } Θα βαλεις στο vertex αλλα δυο float που θα ειναι το UV mapping
Moderators Kercyn Δημοσ. 23 Μαΐου 2016 Μέλος Moderators Δημοσ. 23 Μαΐου 2016 Είδα σήμερα για UV mapping, Framebuffers και renderbuffers και νομίζω πάω καλύτερα. Τώρα μόνο έχω κολλήσει στην glMultiDrawArrays που δε μου δουλεύει αλλά θα την φτιάξω κι αυτήν κάποια στιγμή. Ευχαριστώ και πάλι
παπι Δημοσ. 23 Μαΐου 2016 Δημοσ. 23 Μαΐου 2016 Μπορεις να το κανεις με σκετο drawarrays ετσι και αλλιως αυτα τα task ειναι ελαφρια για την gpu for (float phase = 0; phase < 15000; phase += 1) { glLoadIdentity(); glTranslatef((rotation + phase/360) / 90.f - 2.f, cos(( (rotation + phase/360) * 3.14) / 180.f), 0); glScalef(0.2, 0.2, 1); glRotatef(rotation, 0, 0, 1); glTranslatef(0, -1, 0); glDrawArrays(GL_QUADS, 0, 4); } εβαλα αυτο το σνιπ, και παλι ειναι αστειο το drop rate (μιλαμε για 15000 call ε) και δεν εχω καμια σοβαρη καρτα. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα