Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2009, 22:42   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию OpenGL. Деформация изображения.

Приветствую. Есть вопрос, дело в том, что есть у меня картинка 2д, разумеется, ее надо вообщем наложить на область, причем под углом. Я угол реализовал простым отчетом координат x и y, верхних двух углов изображения, два нижних всегда будут два нижних и на целевой области. В принципе все работает, вопрос в том, что когда часто вызываю отрисовку уж больно притормаживает, а еще, может есть какой то антиалиасинг чтоли, а то когда отступ это не 30 градусов, то наклоненные левая и правая стороны зубцами идут. Сразу спасибо за внимание.

Да и еще, create/delete/glloadtexture вызываются единожды в программе. И при загрузке текстуры входной буфер это 32х битное изображение.

Забыл сказать, вывод идет на HDC в котором прописан (SelectObject) битмап созданный через CreateDIBSection.

Код:
GLuint glLoadTexture(int width, int height, void *scan0)
{
	glEnable(GL_TEXTURE_2D);
	GLuint texture = 0;
	glGenTextures(1, &texture);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
	glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, scan0);
	return texture;
}

static PIXELFORMATDESCRIPTOR pfd = {0};
static HGLRC context = NULL;

bool Create(HDC hdc)
{
	if(context)
	{
		return true;
	}
	pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); 	
	pfd.nVersion = 1; 
	pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_BITMAP;
	pfd.iPixelType = PFD_TYPE_RGBA;
	pfd.cColorBits = 32;
	pfd.cDepthBits = 16;
	pfd.iLayerType = PFD_MAIN_PLANE;

	int pixelFormat = ChoosePixelFormat(hdc, &pfd);
	SetPixelFormat(hdc, pixelFormat, &pfd);

	context = wglCreateContext(hdc);
	if(!context)
	{
		return false;
	}
	wglMakeCurrent(hdc, context);

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glLineWidth(1.0f);
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_LINE_SMOOTH);

	return true;
}

void Delete()
{
	if(!context)
	{
		return;
	}
	wglMakeCurrent(NULL, NULL);
	wglDeleteContext(context);
	context = NULL;
}

bool DrawImage(HDC hdc, CRect rect, float offsetX, float offsetY, unsigned int texture)
{
	if(!context || !texture)
	{
		return false;
	}
	unsigned int glWidth = rect.Width();
	unsigned int glHeight = rect.Height();

	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(rect.left, rect.top, glWidth, glHeight);
	glOrtho(0, glWidth, glHeight, 0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glBindTexture(GL_TEXTURE_2D, texture);
	glColor3f(1.0f, 1.0f, 1.0f);
	glBegin(GL_QUADS);
	glTexCoord2f(1.0f, 1.0f); glVertex2f((float)glWidth, (float)glHeight);
	glTexCoord2f(0.0f, 1.0f); glVertex2f(0, (float)glHeight);
	glTexCoord2f(0.0f, 0.0f); glVertex2f(offsetX, offsetY);
	glTexCoord2f(1.0f, 0.0f); glVertex2f((float)glWidth - 1 - offsetX, offsetY);
	glEnd();

	glFlush();
	return true;
}

Последний раз редактировалось BOBAH13; 10.11.2009 в 22:46.
BOBAH13 вне форума Ответить с цитированием
Старый 11.11.2009, 11:01   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Попробуй без glBindTexture().
Похожая проблема есть здесь: http://forum.vingrad.ru/forum/topic-276489.html.
ds.Dante вне форума Ответить с цитированием
Старый 11.11.2009, 14:50   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от ds.Dante Посмотреть сообщение
Попробуй без glBindTexture().
Похожая проблема есть здесь: http://forum.vingrad.ru/forum/topic-276489.html.
Реальный флуд там, а по сути, есть прога я же и писал, все в той же среде и ОС, там опенДжл все ок, работает довольно таки шустро. А почему здесь так не ясно, реально тормозит, убераю рисование текстуры, все отлично и гладко идет.

P.s. так ведь glBindTexture говорит opengl что работать с этой текстурой. Хотя щас попробую

Та не, не то... все равно тормоза, именно в блоке glBegin(GL_QUADS); ... glEnd(); Есть еще идеи у кого то ?

Edit:
Сделал вот так, да быстрее, и проблема, чет он как то не так текстуру накладывает, как будто кусок ее взял, и растянул... не ясно как верное передавать координаты в массиве, где какая вершина.

Код:
float vertices[] = {
		(float)glWidth,					(float)glHeight,
		0,								(float)glHeight,
		0,						0,
		(float)glWidth ,		0
	};

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, vertices);

    glDrawArrays(GL_QUADS, 0, 4);
    
    glDisableClientState(GL_VERTEX_ARRAY);

Последний раз редактировалось BOBAH13; 11.11.2009 в 15:43.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
opengl alhon Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 10.10.2013 15:02
Вывод врагмента изображения на весь экран в OpenGL LMan Помощь студентам 0 13.09.2009 17:51
OpenGL Д'якон Компьютерное железо 5 31.01.2009 22:48
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 23:29