OpenGL Transparenz verhindern



  • Hallo,
    ich lasse mir mit OpenGL mehrere Objekte zeichnen.
    Nun verdeckt aber ein Objekt, welches später gezeichnet wurde andere,
    obwohl es sich weiter weg befindet. Ich kann es aber nicht eher zeichnen, da
    sich die Entfernungen dynamisch verändern.
    Könnt ihr mir bitte sagen wie ich die Transparenz 100%ig abschalten kann.



  • Machst du depth-testing?



  • Alpha musst du erst min glEnable(GL_BLENDING) oder so ähnlich anschalten. Rufst du diese FUnktion nicht auf hast du auch kein Alpha.

    Wenn du's lokal abschalten willst die gleiche Konstante in glDisable().

    Aber dein Problem klingt tatsächlich eher nach fehlendem depth-test 😉



  • Ich glaube ich habe das Problem gefunden.
    Ich habe bis jetzt bei der Erstellung des Device Contextes immer einen
    16Bit Z-Buffer verwendet, diesen habe ich nun auf 32Bit gestellt und
    es klappt. Allerdings nicht wirklich, denn man erkennt immer noch kleinere
    Dreiecke und andere Vielecke innerhalb des vorderen Objektes, welche einem hinteren angehören. Gefällt mir noch nicht so richtig!



  • Ich habe beobachtet, dass das letzt geschilderte Problem unabhängig davon ist,
    ob sich zwei Objekte hintereinander befinden. Es kommen generell Lücken in der
    Zeichnung vor. Manchmal verschwinden relativ große Flächen eines Objektes.



  • Mach mal nen Screenshot und poste deine Zeichenroutine...



  • Hallo.
    In mein Programm ist eine dialogfeldbasierende Anwendung. Ich habe eine Klasse CDialog welche mein
    Anwendungsfenster erstellt. Ihr habe ich ein Element CDialog als Steuerelement zugeordnet, welches durch einen
    seperaten Thread verwaltet wird.

    //Init des Anwendungsfensters
    m_cSteuerelementDlg.Init(this);
    m_cSteuerelementDlg.Create(IDD_STEUERELEMENT, this);
    m_cSteuerelementDlg.SetWindowPos(GetWindow(IDD_ANWENDUNGSFENSTER_DIALOG), 0,0,1,1,SWP_NOSIZE);
    m_cSteuerelementDlg.ShowWindow(SW_SHOW);
    

    //Nun wird ein Thread gestartet, der die OpenGL Initialisierungen und Zeichenrotinen, ... übernimmt

    BOOL CSteuerelementDlg::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
    {
    
    	GLuint		PixelFormat;			
    	WNDCLASS	wc;						
    	DWORD		dwExStyle;				
    	DWORD		dwStyle;				
    	RECT		WindowRect;				
    	WindowRect.left=(long)0;			
    	WindowRect.right=(long)width;	
    	WindowRect.top=(long)0;			
    	WindowRect.bottom=(long)height;		
    
    	m_hInstance			= GetModuleHandle(NULL);				
    	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	
    	wc.lpfnWndProc		= (WNDPROC) WndProc;					
    	wc.cbClsExtra		= 0;								
    	wc.cbWndExtra		= 0;									
    	wc.hInstance		= m_hInstance;							
    	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			
    	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			
    	wc.hbrBackground	= NULL;									
    	wc.lpszMenuName		= NULL;									
    	wc.lpszClassName	= "OpenGL";								
    
    	if (!RegisterClass(&wc))									
    	{
    		MessageBox("Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;											
    	}
    
    	dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			
    	dwStyle=WS_OVERLAPPEDWINDOW;							
    
    	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		
    
    	//Ich übernehme das HANDLE der Klasse CSteuerelementDlg
    	//Würde ich ein eigenenes Fenster aufbauen, wie ich es bei anderen Programmen mache, so habe ich keinerlei Probleme
    	//in Bezug der Zeichenungenauigkeiten
    	m_hWnd = GetParent()->Detach();
    
    	static	PIXELFORMATDESCRIPTOR pfd=			
    	{
    		sizeof(PIXELFORMATDESCRIPTOR),				
    		1,								
    		PFD_DRAW_TO_WINDOW |						
    		PFD_SUPPORT_OPENGL |					
    		PFD_DOUBLEBUFFER,						
    		PFD_TYPE_RGBA,						
    		bits,								
    		0, 0, 0, 0, 0, 0,							
    		0,									
    		0,									
    		0,									
    		0, 0, 0, 0,									
    		bits,				
    		//Wenn ich hier 32 einsetze, erscheint das letztgezeichnete Objekt	
    		//nicht mehr im Vordergrund, Zeichenungenauigkeiten bleiben bestehen			 
    		0,											
    		0,											
    		PFD_MAIN_PLANE,								
    		0,											
    		0, 0, 0										
    	};
    	if (!(m_hDC=GetDC()->Detach()))							
    	{
    		KillGLWindow();								
    		MessageBox("Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								
    	}
    
    	if (!(PixelFormat=ChoosePixelFormat(m_hDC,&pfd)))	
    	{
    		KillGLWindow();								// Reset The Display
    		MessageBox("Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								// Return FALSE
    	}
    
    	if(!SetPixelFormat(m_hDC,PixelFormat,&pfd))		
    	{
    		KillGLWindow();								// Reset The Display
    		MessageBox("Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								// Return FALSE
    	}
    
    	if (!(m_hRC=wglCreateContext(m_hDC)))				
    	{
    		KillGLWindow();								// Reset The Display
    		MessageBox("Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								// Return FALSE
    	}
    
    	if(!wglMakeCurrent(m_hDC,m_hRC))					
    	{
    		KillGLWindow();								// Reset The Display
    		MessageBox("Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								// Return FALSE
    	}
    
    	ShowWindow(SW_SHOW);						
    	SetForegroundWindow();						
    	SetFocus();									
    	ReSizeGLScene(45.0, width, height);				
    
    	if (!InitGL())									
    	{
    		KillGLWindow();								
    		MessageBox("Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		return FALSE;								
    	}
    
    	return TRUE;									
    }
    

    Ich habe mittlerweile eine andere Möglichkeit, mein Programm zu realisieren, gefunden, doch wäre ich auch an einer
    Lösung des jetzigen Problems interessiert.


Anmelden zum Antworten