[OpenGL] Viewports mit rahmen



  • Hallo,

    nach endlosen erfolglosen suchen über Viewports für 3D Editoren frage ich jetzt hier mal nach:
    Folgendes Problem: ich hab meinen OpenGL Screen gevierteilt, jeder hat einen Viewport (3 Ortho, 1 Perspective). Jetzt möchte aber um jeden Viewport einen Rahmen ziehen um die grafisch abzutrennen. Hier mal der Source bisher:

    void Render(HWND hWnd)
    {
    	static float angle = 0.0f;
    	GL_ClearScreen(true, false);
    
    	RECT rect;
    	GetClientRect(hWnd, &rect);
    	rect.right = rect.right - rect.left;
    	rect.bottom = rect.bottom - rect.top;
    
    	//FRUSTUM
    	double top;
    	double bottom;
    	double left;
    	double right;
    	double znear = 0.1;
    	double zfar = 100.0;
    	double fov = radf(45.0f);
    
    	top = tan(fov * 0.5) * znear;
    	bottom = -top;
    	left = ((double)rect.right / (double)rect.bottom) * bottom;
    	right = ((double)rect.right / (double)rect.bottom) * top;
    	//FRUSTUM
    
    	for(int port = 0; port < 4; port++)
    	{
    		if(port == 0)
    		{
    			glViewport(0, rect.bottom / 2, rect.right / 2, rect.bottom / 2);
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			glOrtho(left, right, bottom, top, -zfar, zfar);
    		}
    		else if(port == 1)
    		{
    			glViewport(rect.right / 2, rect.bottom / 2, rect.right / 2, rect.bottom / 2);
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			glOrtho(left, right, bottom, top, -zfar, zfar);
    		}
    		else if(port == 2)
    		{
    			glViewport(rect.right / 2, 0, rect.right / 2, rect.bottom / 2);
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			glOrtho(left, right, bottom, top, -zfar, zfar);
    		}
    		else if(port == 3)
    		{
    			glViewport(0, 0, rect.right / 2, rect.bottom / 2);
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			glFrustum(left, right, bottom, top, znear, zfar);
    		}
    		glMatrixMode(GL_MODELVIEW);
    		glLoadIdentity ();
    		GL_ClearScreen(false, true);
    
    		angle+=0.5f;
    		if(port == 0)
    		{
    			glTranslatef(0.0f, 0.0f, 0.0f);
    			glRotatef(angle, 0.0f, 1.0f, 0.0f);
    			glBegin(GL_TRIANGLES);
    				glColor3ub(255, 255, 0);
    				glVertex3f(0.0f, 1.0f, 0.0f);
    				glVertex3f(-1.0f, -1.0f, 0.0f);
    				glVertex3f(1.0f, -1.0f, 0.0f);
    			glEnd();
    		}
    		else if(port == 1)
    		{
    			glTranslatef(0.0f, 0.0f, -20.0f);
    			//glRotatef(angle, 0.0f, 0.0f, 0.0f);
    			glBegin(GL_QUADS);
    				glColor3ub(0, 255, 0);
    				glVertex3i(100, 100, 0);
    				glVertex3i(100, 200, 0);
    				glVertex3i(200, 200, 0);
    				glVertex3i(200, 1, 0);
    			glEnd();
    		}
    		else if(port == 2)
    		{
    			glTranslatef(0.0f, 0.0f, -20.0f);
    			glRotatef(angle, 0.0f, 1.0f, 0.0f);
    			glBegin(GL_QUADS);
    				glColor3ub(0, 0, 255);
    				glVertex3i(1, 1, 0);
    				glColor3ub(0, 0, 0);
    				glVertex3i(1, 200, 0);
    				glColor3ub(255, 0, 255);
    				glVertex3i(200, 200, 0);
    				glColor3ub(0, 255, 255);
    				glVertex3i(200, 1, 100);
    			glEnd();
    		}
    		else if(port == 3)
    		{
    			glTranslatef(0.0f, 0.0f, 0.0f);
    			glRotatef(angle, 0.0f, 1.0f, 0.0f);
    			glBegin(GL_TRIANGLES);
    				glColor3ub(255, 255, 0);
    				glVertex3f(0.0f, 1.0f, 1.0f);
    				glColor3ub(0, 0, 0);
    				glVertex3f(-1.0f, -1.0f, 0.0f);
    				glColor3ub(255, 255, 255);
    				glVertex3f(1.0f, -1.0f, 0.0f);
    			glEnd();
    
    		/*	GL_BeginOrtho(0, 0, rect.right / 2, rect.bottom / 2, znear, zfar);
    			glPushMatrix();
    			glBegin(GL_LINES);
    				glColor3ub(255, 0, 0);
    				glVertex2d(0, 0);
    				glVertex2d(1, 1);
    			glEnd();
    			glPopMatrix();
    			GL_EndProjectionMode();*/
    		}
    		glFlush();
    	}
    }
    

    Ich bekomm es einfach nicht das der Rahmen oder eine Linie korrekt gezeichnet wird, da der Mittelpunkt eines jeden Viewport in der Mitte liegt (typisch 3D Editor halt).

    Wenn jemand Beispielcode für so einen Quadview hat wäre ich darüber sehr erfreut, oder mir bei diesem Problem helfen kann. =))


  • Mod

    wie waere es wenn du den bildschirm erstmal in der farbe loescht in der dein rahmen sein soll und dann beim setzen von glViewport immer ein pixel nach innen gehst, also statt glViewport(0,0,widht,height) dann glViewport(1,1,widht-1,height-1). damit haettest du recht simpel und solide einen rahmen.



  • Bildschirm wird gelöscht ^^ ( GL_ClearScreen(...) -> eigene Fkt.). Hab es aber inzwischen geschafft, hatte ein kleines Problemchen mit den viewport einstellungen. Trotzdem danke =))


Anmelden zum Antworten