glRasterPos2i pozycja ekranowa

1

dlaczego nie dziala fukcja glRasterPos2i ktora pobiera wspolrzedne ekranowe:

void SetResolutionData(float w,float h)
{
	width=w;
	height=h;
}
void SetColor(float r,float g,float b)
{
	red=r;
	green=g;
	blue=b;
}

void PrintString(char *str,float xe,float ye)
{

	glPushMatrix();
	glColor3f(red, green, blue);
	//glLoadIdentity();
	glTranslatef(0.0f, 0.0f, -1.0f);
	//float xpos=-1+xe/(width/2);
	//float ypos=-0.5+ye/height;
	//glRasterPos3f(xpos, ypos, -0.1f);
	glRasterPos2i(int(xe), int(ye));

	unsigned int base=listBase;
	if ((base == 0) || (str == NULL))
		return;

	glPushAttrib(GL_LIST_BIT);
		glListBase(base - 32);
		glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
	glPopAttrib();
	glPopMatrix();
}

nic nie widac pomimo ze np podaje 100,100 i nic itp

0

a zdefiniowałeś xe, ye ?

0

void PrintString(char *str,float xe,float ye) tutaj podajemy xe i ye podczas wywolania fukcji

0

print brzmi jak drukować a nie pobierać ...
bez kodu trudno wywnioskować a mało go podaleś

0
#include <windows.h>			// standardowy plik nag³ówkowy Windows
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gl/gl.h>				// standardowy plik nag³ówkowy OpenGL
#include <gl/glu.h>				// plik nag³ówkowy biblioteki GLU
#include <gl/glaux.h>

class Font
{
public:
	HDC g_HDC;
	unsigned int listBase;
	float red,green,blue;
	float width,height;
	unsigned int CreateBitmapFont(char *fontName, int fontSize)
{
	HFONT hFont;         // uchwyt czcionki systemu Windows
	unsigned int base;

	base = glGenLists(96);      // listy wyœwietlania dla 96 znaków

	if (stricmp(fontName, "symbol") == 0)
	{
	     hFont = CreateFont(fontSize, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, SYMBOL_CHARSET, 
							OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
							FF_DONTCARE | DEFAULT_PITCH, fontName);
	}
	else
	{
		 hFont = CreateFont(fontSize, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, 
							OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
							FF_DONTCARE | DEFAULT_PITCH, fontName);
	}

	if (!hFont)
		return 0;

	SelectObject(g_HDC, hFont);
	wglUseFontBitmaps(g_HDC, 32, 96, base);

	return base;
}

void ClearFont(unsigned int base)
{
	if (base != 0)
		glDeleteLists(base, 96);
}
void SetResolutionData(float w,float h)
{
	width=w;
	height=h;
}
void SetColor(float r,float g,float b)
{
	red=r;
	green=g;
	blue=b;
}
void Text(char *str,float xe,float ye)
{

	glPushMatrix();
	glColor3f(red, green, blue);
	//glLoadIdentity();
	glTranslatef(0.0f, 0.0f, -1.0f);
	/*float xpos=-1+xe/(width/2);
	float ypos=-0.5+ye/height;
	glRasterPos3f(xpos, ypos, -0.1f);*/
	glRasterPos2i(int(xe), int(ye));

	unsigned int base=listBase;
	if ((base == 0) || (str == NULL))
		return;

	glPushAttrib(GL_LIST_BIT);
		glListBase(base - 32);
		glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
	glPopAttrib();
	glPopMatrix();
}


void CleanUp()
{
	ClearFont(listBase);
}

void Initialize(HDC hdc)
{
	g_HDC=hdc;
	listBase = CreateBitmapFont("Arial", 48);
}

};

teraz zmienilem PrintString na Text

Font font;
font.Initialize(g_HDC);
font.SetResolutionData(1600,900);
font.SetColor(0,1,0);
font.Text("test",100,100);
0

Nie pomogę za bardzo gdyż leżę z OpenGL ale chat GPT napisał coś takiego - może się przyda

link

0

dlaczego nie dziala fukcja glRasterPos2i ktora pobiera wspolrzedne ekranowe

Tylko, że ta funkcja nic nie pobiera jak również nie operuje na współrzędnych ekranowych. Co w ogóle próbujesz zdziałać?

0

staram sie aby moc podawac wspolrzedne ekranowe dla napisu

1
wilkwielki napisał(a):

staram sie aby moc podawac wspolrzedne ekranowe dla napisu

Tylko po co? Kontekst opengl jest zawsze powiązany z jakimś oknem na windowsie więc współrzędne ekranowe są dla Ciebie bezużyteczne. Może są jakieś haki związane z PBO albo FBO o których nie jestem świadom, ale na razie to pomijam. Także, najpierw musisz mieć okno, a potem do niego renderować. Tworzysz gdzieś w swoim kodzie okno za pomocą win32/glut/SDL/GLFW/SFML?

Bezpośrednio na ekran nic nie napiszesz, niektóre aplikacje "oszukują" że piszą bezpośrednio na ekran poprzez ukrycie bara i ustawieniu przezroczytego tła, ale i tak tam z tyłu jest okno które trzeba stworzyć.

0
#define WIN32_LEAN_AND_MEAN		// "odchudza" aplikacjê Windows

/*******************************************************************
*	Rozdzia³ 11, czcionka rastrowa
*	Autor: Kevin Hawkins
*	Wyœwietla tekst poœrodku okna za pomoc¹ czcionki rastrowej.
********************************************************************/

////// Pliki nag³ówkowe
#include <windows.h>			// standardowy plik nag³ówkowy Windows
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gl/gl.h>				// standardowy plik nag³ówkowy OpenGL
#include <gl/glu.h>				// plik nag³ówkowy biblioteki GLU
#include <gl/glaux.h>
#include "font.h"

////// Zmienne globalne
HDC g_HDC;						// globalny kontekst urz¹dzenia
bool fullScreen = false;			// true = tryb pe³noekranowy; 
//false = tryb okienkowy
bool keyPressed[256];			// tablica przyciœniêæ klawiszy

Font font;

float xe=100;
float ye=100;
// Initialize
// opis: inicjuje OpenGL
void Initialize()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);		// t³o w kolorze czarnym

	glShadeModel(GL_SMOOTH);					// cieniowanie g³adkie
	glEnable(GL_DEPTH_TEST);					// usuwanie przes³onietych powierzchni
	font.Initialize(g_HDC);
	font.SetResolutionData(1600,900);
}

// Render
// opis: rysuje scenê
void Render()
{
	// opró¿nia bufory ekranu i g³êbi
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		
	glLoadIdentity();

	//glRasterPos3f(-0.99f, -0.55f, -0.1f);
	//glRasterPos3f(0.99f, 0.5f, -0.1f);
	//glRasterPos2i(1000,1);
	/*if (keyPressed[VK_UP])
		ye+=1;
	if (keyPressed[VK_DOWN])
		ye-=1;

	if (keyPressed[VK_LEFT])
		xe-=1;
	if (keyPressed[VK_RIGHT])
		xe+=1;*/
	font.SetColor(0,1,0);
	font.Text("test",800,450);

	glFlush();
	SwapBuffers(g_HDC);			// prze³¹cza bufory
}

// funkcja okreœlaj¹ca format pikseli
void SetupPixelFormat(HDC hDC)
{
	int nPixelFormat;					// indeks formatu pikseli

	static PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),	// rozmiar struktury
		1,								// domyœlna wersja
		PFD_DRAW_TO_WINDOW |			// grafika w oknie
		PFD_SUPPORT_OPENGL |			// grafika OpenGL 
		PFD_DOUBLEBUFFER,				// podwójne buforowanie
		PFD_TYPE_RGBA,					// tryb kolorów RGBA 
		32,								// 32-bitowy opis kolorów
		0, 0, 0, 0, 0, 0,				// nie specyfikuje bitów kolorów
		0,								// bez buforu alfa
		0,								// nie specyfikuje bitu przesuniêcia
		0,								// bez bufora akumulacji
		0, 0, 0, 0,						// ignoruje bity akumulacji
		64,								// 16-bit bufor z
		0,								// bez bufora powielania
		0,								// bez buforów pomocniczych
		PFD_MAIN_PLANE,					// g³ówna p³aszczyzna rysowania
		0,								// zarezerwowane
		0, 0, 0 };						// ignoruje maski warstw

	nPixelFormat = ChoosePixelFormat(hDC, &pfd);	// wybiera najbardziej zgodny format pikseli 

	SetPixelFormat(hDC, nPixelFormat, &pfd);		// okreœla format pikseli dla danego kontekstu urz¹dzenia
}

// procedura okienkowa 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HGLRC hRC;					// kontekst tworzenia grafiki
	static HDC hDC;						// kontekst urz¹dzenia
	int width, height;					// szerokoϾ i wysokoϾ okna

	switch(message)
	{
		case WM_CREATE:					// okno jest tworzone

			hDC = GetDC(hwnd);			// pobiera kontekst urz¹dzenia dla okna
			g_HDC = hDC;
			SetupPixelFormat(hDC);		// wywo³uje funkcjê okreœlaj¹c¹ format pikseli

         // tworzy kontekst tworzenia grafiki i czyni go bie¿¹cym
hRC = wglCreateContext(hDC);
			wglMakeCurrent(hDC, hRC);

			return 0;
			break;

		case WM_CLOSE:					// okno jest zamykane

			// deaktywuje bie¿¹cy kontekst tworzenia grafiki i usuwa go
			wglMakeCurrent(hDC, NULL);
			wglDeleteContext(hRC);

			// wstawia komunikat WM_QUIT do kolejki
			PostQuitMessage(0);

			return 0;
			break;

		case WM_SIZE:
			height = HIWORD(lParam);		// pobiera nowe rozmiary okna
			width = LOWORD(lParam);

			if (height==0)					// unika dzielenie przez 0
			{
				height=1;					
			}

			glViewport(0, 0, width, height);		// nadaje nowe wymiary oknu OpenGL
			glMatrixMode(GL_PROJECTION);			// wybiera macierz rzutowania
			glLoadIdentity();						// resetuje macierz rzutowania

			// wyznacza proporcje obrazu
			gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

			glMatrixMode(GL_MODELVIEW);				// wybiera macierz modelowania
			glLoadIdentity();						// resetuje macierz modelowania

			return 0;
			break;

		case WM_KEYDOWN:					// u¿ytkownik nacisn¹³ klawisz?
			keyPressed[wParam] = true;
			return 0;
			break;

		case WM_KEYUP:
			keyPressed[wParam] = false;
			return 0;
			break;

		default:
			break;
	}

	return (DefWindowProc(hwnd, message, wParam, lParam));
}

// punkt, w którym rozpoczyna siê wykonywanie aplikacji
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX windowClass;		// klasa okna
	HWND	   hwnd;			// uchwyt okna
	MSG		   msg;				// komunikat
	bool	   done;			// znacznik zakoñczenia aplikacji
	DWORD	   dwExStyle;						// rozszerzony styl okna
	DWORD	   dwStyle;						// styl okna
	RECT	   windowRect;

	// zmienne pomocnicze
	int width = 1600;
	int height = 900;
	int bits = 32;

	fullScreen = TRUE;

	windowRect.left=(long)0;						// struktura okreœlaj¹ca rozmiary okna
	windowRect.right=(long)width;					
	windowRect.top=(long)0;						
	windowRect.bottom=(long)height;					

	// definicja klasy okna
	windowClass.cbSize			= sizeof(WNDCLASSEX);
	windowClass.style			= CS_HREDRAW | CS_VREDRAW;
	windowClass.lpfnWndProc		= WndProc;
	windowClass.cbClsExtra		= 0;
	windowClass.cbWndExtra		= 0;
	windowClass.hInstance		= hInstance;
	windowClass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);	// domyœlna ikona
	windowClass.hCursor			= LoadCursor(NULL, IDC_ARROW);		// domyœlny kursor
	windowClass.hbrBackground	= NULL;								// bez t³a
	windowClass.lpszMenuName	= NULL;								// bez menu
	windowClass.lpszClassName	= "MojaKlasa";
	windowClass.hIconSm			= LoadIcon(NULL, IDI_WINLOGO);		// logo Windows

	// rejestruje klasê okna
	if (!RegisterClassEx(&windowClass))
		return 0;

	if (fullScreen)								// tryb pe³noekranowy?
	{
		DEVMODE dmScreenSettings;					// tryb urz¹dzenia
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
		dmScreenSettings.dmSize = sizeof(dmScreenSettings);	
		dmScreenSettings.dmPelsWidth = width;			// szerokoϾ ekranu
		dmScreenSettings.dmPelsHeight = height;			// wysokoϾ ekranu
		dmScreenSettings.dmBitsPerPel = bits;				// bitów na piksel
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

		// 
		if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
		{
			// prze³¹czenie trybu nie powiod³o siê, z powrotem tryb okienkowy
			MessageBox(NULL, "Prze³¹czenie trybu wyœwietlania nie powiod³o siê", NULL, MB_OK);
			fullScreen=FALSE;	
		}
	}

	if (fullScreen)								// tryb pe³noekranowy?
	{
		dwExStyle=WS_EX_APPWINDOW;					// rozszerzony styl okna
		dwStyle=WS_POPUP;						// styl okna
		ShowCursor(FALSE);						// ukrywa kursor myszy
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// definicja klasy okna
		dwStyle=WS_OVERLAPPEDWINDOW;					// styl okna
	}

	AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);		// koryguje rozmiar okna

	// tworzy okno
	hwnd = CreateWindowEx(NULL,									// rozszerzony styl okna
						  "MojaKlasa",							// nazwa klasy
						  "Wyœwietlanie tekstu, przyk³ad pierwszy: czcionka rastrowa", // nazwa aplikacji
						  dwStyle | WS_CLIPCHILDREN |
						  WS_CLIPSIBLINGS,
						  0, 0,								// wspó³rzêdne x,y
						  windowRect.right - windowRect.left,
						  windowRect.bottom - windowRect.top, // szerokoϾ, wysokoϾ
						  NULL,									// uchwyt okna nadrzêdnego
						  NULL,									// uchwyt menu
						  hInstance,							// instancja aplikacji
						  NULL);								// bez dodatkowych parametrów

	// sprawdza, czy utworzenie okna nie powiod³o siê (wtedy wartoœæ hwnd równa NULL)
	if (!hwnd)
		return 0;

	ShowWindow(hwnd, SW_SHOW);			// wyœwietla okno
	UpdateWindow(hwnd);					// aktualizuje okno


	done = false;						// inicjuje zmienn¹ warunku pêtli
	Initialize();						// inicjuje OpenGL

	// pêtla przetwarzania komunikatów
	while (!done)
	{
		PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

		if (msg.message == WM_QUIT)		// aplikacja otrzyma³a komunikat WM_QUIT?
		{
			done = true;				// jeœli tak, to koñczy dzia³anie
		}
		else
		{
			if (keyPressed[VK_ESCAPE])
				done = true;
			else
			{
				Render();

				TranslateMessage(&msg);		// t³umaczy komunikat i wysy³a do systemu
				DispatchMessage(&msg);
			}
		}
	}

	font.CleanUp();

	if (fullScreen)
	{
		ChangeDisplaySettings(NULL,0);					// przywraca pulpit
		ShowCursor(TRUE);						// i wskaŸnik myszy
	}

	return msg.wParam;
}
1

64, // 16-bit bufor z

serio? :)

0

dlaczego nie dziala fukcja glRasterPos2i ktora pobiera wspolrzedne ekranowe:

glRasterPos2i nie pobiera współrzędnych ekranowych, a te same współrzędne "świata" co glRasterPos2s, glRasterPos2f i glRasterPos2d. Zmienia się jedynie typ argumentów.

Żeby móc podawać współrzędne ekranowe musiałbyś zdefiniować takie ortogonalne rzutowanie (takie macierze przekształceń) żeby jednostka układu współrzędnych przekładała się na jeden piksel ekranu. To jest do zrobienia, ale jest inny sposób. Skoro już używasz funkcji z przedrostkiem glu-, to w tej samej bibliotece masz gluUnProject która ci przeliczy współrzędne ekranu na współrzędne świata.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.