LINUX.ORG.RU

OpenGL: Текстура вращается как бешеная

 , ,


0

2

Здравствуйте! Рисую текстуру с памощью openGL:

glEnable(GL_TEXTURE_2D);

		glBindTexture(GL_TEXTURE_2D, texture.texture);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);

		glRotatef((double)angle, 0.0, 0.0, 1.0);

		glBegin(GL_QUADS);
			switch(flip){
				case EGE_FLIP_NONE:
					glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y);
					glTexCoord2f(1.0f, 0.0f); glVertex2f(x + w, y);
					glTexCoord2f(1.0f, 1.0f); glVertex2f(x + w, y + h);
					glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y + h);
				break;
				case EGE_FLIP_VERTICAL:
					glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y + h);
					glTexCoord2f(1.0f, 0.0f); glVertex2f(x + w, y + h);
					glTexCoord2f(1.0f, 1.0f); glVertex2f(x + w, y);
					glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y);
				break;
				case EGE_FLIP_HORIZONTAL:
					glTexCoord2f(0.0f, 0.0f); glVertex2f(x + w, y);
					glTexCoord2f(1.0f, 0.0f); glVertex2f(x, y);
					glTexCoord2f(1.0f, 1.0f); glVertex2f(x, y + h);
					glTexCoord2f(0.0f, 1.0f); glVertex2f(x + w, y + h);
				break;
			}
		glEnd();

glDisable(GL_TEXTURE_2D);

Решил добавить поворот:

...
glRotatef((double)angle, 0.0, 0.0, 1.0);
glBegin(GL_QUADS);
...

Но при запуске программы, текстура начинает вращатся вокруг своей оси как бешеная. Мне нужно, что бы она оставалась на месте, а не крутилась! Что не так?

glBegin(GL_QUADS);

Это в каком году вас в криокамеру спать уложили?

По поводу вращения ничего не понял, но множить матрицы нужно в строгом порядке: M[] * N[] != N[] * M[].

А вообще бегом читать http://www.open.gl

andreyu ★★★★★
()

А ты не забыл сбросить все матрицы перед тем, как очередной раз glRotate вызывать?

Сдается мне, что забыл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А ты не забыл сбросить все матрицы перед тем, как очередной раз glRotate вызывать?

Спасибо! Забыл)

egordorichev
() автор топика
Ответ на: комментарий от gavlig

Аж волосы дыбом встали! Ну и уроды! Удобный API на такое жесточайшее дерьмище заменить...

Если действительно все старое стало deprecated, нужно купить новую книжку по опенглю, изучать.

Eddy_Em ☆☆☆☆☆
()

Зачем люди продолжают писать на двойке? 😢

Stil ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я сам так и рисую.

Ну ты-то знатный некрофил-неосилятор.

Stil ★★★★★
()
Ответ на: комментарий от x4DA

Мне нужно просто отобразить картинку или видео. С возможностью двигать, масштабировать и (возможно) вращать.

И мне насрать, что ты обо мне думаешь! Проще, чем эти API, я вариантов не видел. То, что предлагают "в современном подходе" — это жуткие простыни кода!

Ты мне еще скажи сесть шейдер написать, чтобы тупо картинку показать...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

opengl — низкоуровневый api. от простыней кода избавляет qt

anonymous
()
Ответ на: комментарий от Eddy_Em

Удобный тебе для рисования прямоугольников. Переучиваться не надо, не думаю, что они этот легаси убирать будут. Но производительность в сравнении с новым пайплайном там хуже. Когда же человек только учится, то зачем начинать с заранее старой технологии?

gavlig ★★★
()
Ответ на: комментарий от gavlig

Для отображения прямоугольника с текстурой.

Когда же человек только учится, то зачем начинать с заранее старой технологии?

Если она кошерней выглядит и проще для понимания, то лучше так и делать.

Eddy_Em ☆☆☆☆☆
()

2015 год, Khronos двигает вперед индустрию, выкатывает Vulkan, пытается добиться широкой поддержки среди IHV и ISV, а эти необучаемые все равно жрут immediate mode.

Deleted
()
Ответ на: комментарий от gavlig

А что, шейдеры — это хорошо? Они только в хитрожопых случаях нужны. А обычно же все донельзя однотипно и стандартно. И нет смысла мучить людей этими шейдерами, когда можно просто написать что-то типа gl_draw_sphere вместо того, чтобы вручную писать шейдер для отображения сферы из N треугольников.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А что, шейдеры — это хорошо?

Да.

И нет смысла мучить людей этими шейдерами

Есть.

Deleted
()
Ответ на: комментарий от Eddy_Em

обычно в хелловорлдах. в реальном софте рисуются сложные сцены

anonymous
()
Ответ на: комментарий от Eddy_Em

ты предлагаешь вшить рисование сферы (и тысячу вариантов параметризации этого рисования) в силикон?

x4DA ★★★★★
()
Ответ на: комментарий от x4DA

только хардваре, только хардкор!

anonymous
()

а цель какая? что ты делаешь, изучаешь или уже задача есть? и кстати согласен с Eddy_Em, за старый deprecated api спасибо скажут 10 раз.

Frost ★★★
()

а где у тебя сохранение-восстановление матрицы?

glPushMatrix()
glPopMatrix()

Frost ★★★
()
Ответ на: комментарий от egordorichev

Не понимаю, что здесь такого?

Ну если вам спалось хорошо и сны снились хорошие, то ничего такого.

andreyu ★★★★★
()
Ответ на: комментарий от Eddy_Em

Если она кошерней выглядит и проще для понимания, то лучше так и делать.

В gltut рассказывается чем это чревато. Вкратце, при изучении старого АПИ у человека атрофируется понимание как вообще работает пайплайн. После этого переучиваться очень больно, шейдеры начинают казаться китайской грамотой, а большинство вообще за пределы уютненького болотца glBegin/glEnd даже заглядывать боится, считая это потолком своего развития.

Dendy ★★★★★
()
Ответ на: комментарий от Eddy_Em

То, что ты знатный некроофил, мы и так знаем. А тот чувак прав, юзание glBegin - это такое путешествие в нулевые.

cherry-pick
()
Ответ на: комментарий от andreyu

По поводу вращения ничего не понял, но множить матрицы нужно в строгом порядке: M[] * N[] != N[] * M[].

Вот, кстати, для этого и надо переходить на современный OpenGL, а то вместо линала пользуются glRotate.

O02eg ★★★★★
()
Ответ на: комментарий от Dendy

И это отлично! Зачем мне лезть в дебри, если мне этих основ глута за глаза?

Нафиг-нафиг!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от O02eg

вместо линала пользуются glRotate

Это что за путешествие в каменный век: вручную вычислять матрицы поворота, когда все уже давно есть готовое?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Шейдеры позволяют минимизировать обмен данными между памятью компьютера и GPU, сократить количество вызовов функций API и перенести многие вычисления на гораздо более приспособленную для этого видеокарту.

Это что за путешествие в каменный век: вручную вычислять матрицы поворота, когда все уже давно есть готовое?

Ты же вроде любишь когда все под твоим нозкоуровневым контролем?

Archer73
()

а можно больше кода ? как раз ищу нормальный способ натягивать текстуры в 2ке на линуксе (плюсы не мой родной язык, а с опенГЛом только начал)

Dred ★★★★★
()
Ответ на: комментарий от Eddy_Em

Никто не запрещает пользоваться библиотеками или передавать угол в видеокарту и там считать матрицу.

O02eg ★★★★★
()
Ответ на: комментарий от Eddy_Em

Вообще-то шейдеры как раз пишутся на Си. И перемножение матриц делается в одну строчку, никто не заставляет расписывать ничего. Например, простой вершинный шейдер:

attribute highp vec4 vertex;
uniform highp mat4 viewMatrix;
uniform highp mat4 projectionMatrix;

void main(void)
{
	gl_Position = viewMatrix * projectionMatrix * vertex;
}
KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от buddhist

Вершинные массивы и шейдеры там, где можно обойтись дефолтным конвейером — лютый оверинженеринг

Ага, а огонь можно продолжать разжигать трением, вместо использования зажигалки.

andreyu ★★★★★
()
Ответ на: комментарий от O02eg

Вот, кстати, для этого и надо переходить на современный OpenGL, а то вместо линала пользуются glRotate.

Последовательность glrotate, gltranslate, glscale тоже должна быть строгой.

andreyu ★★★★★
()
Ответ на: комментарий от Dred

а можно больше кода ? как раз ищу нормальный способ натягивать текстуры в 2ке на линуксе (плюсы не мой родной язык, а с опенГЛом только начал)

Вас банят по лику open.gl?

andreyu ★★★★★
()
Ответ на: комментарий от egordorichev

А вот отрисовка:

	void drawTexture(EGE_Texture texture, int x, int y, int w, int h){
		glEnable(GL_TEXTURE_2D);

		glBindTexture(GL_TEXTURE_2D, texture.texture);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
		glBegin(GL_QUADS);
			glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y);
			glTexCoord2f(1.0f, 0.0f); glVertex2f(x + w, y);
			glTexCoord2f(1.0f, 1.0f); glVertex2f(x + w, y + h);
			glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y + h);
		glEnd();

		glDisable(GL_TEXTURE_2D);
	}

egordorichev
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.