Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
супер тупой
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 89
Завершенные тесты: 1
#1

Как наложить текстуру на прямоугольник без растяжения? - OpenGL

16.01.2017, 02:32. Просмотров 562. Ответов 11
Метки нет (Все метки)

Доброго времени суток!
Есть текстура размера NxN, натягиваю ее на два треугольника, которые занимают все окно - ок.
Есть текстура размера NxM, хочу сделать соответственно - натянуть на 2 треугольника, которые будут занимать все окно размера NxM. Но проблема в том, что опенгл не хочет работать с НЕквадратными текстурами. А мне важно, чтобы координаты текстуры совпадали с экранными(иначе давно растянул бы квадратную). Что в этой ситуации лучше всего сделать? Учитывая, что размер моей текстуры будет совпадать с разрешение экрана(1366x768, 1920x1080, возможно еще какие-нибудь).

Были мысли, возможно и безумные. Попытаться "заполнить" прямоугольное окно квадратными текстурами(см. приложенный рисунок). Но тут сразу много вопросов появляется: а будет ли это эффективно? а не дофига ли текстур 2х2 может получится(а если вдруг разрешение будет с нечетным значением по одной из оси, тогда вообще 1х1)? и т.д.
http://www.cyberforum.ru/opengl/thread1578645.html
0
Миниатюры
Как наложить текстуру на прямоугольник без растяжения?  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2017, 02:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как наложить текстуру на прямоугольник без растяжения? (OpenGL):

Как создать сферу, наложить на нее текстуру и разместить камеру в центр сферы?
Как создать сферу, наложить на нее текстуру и разместить камеру в центр сферы?...

Наложить текстуру на квадрат
Подскажите как на все стороны куба наложить текстуру в формате .bmp . Проект...

Нарисовать прямоугольник с возможностью сжатия/растяжения
Нужна помощь, решить такую задачу : Нарисовать прямоугольник с возможностью...

Наложить текстуру на все сферы (C++)
Народ, нужна помощь))Пытаюсь наложить текстуру на все планеты-сферы, плюс...

Наложить полупрозрачный цвет на текстуру
Доброго времени суток, форумчане. Необходимо вывести 2Д текстуру, а поверх...

11
vxg
Модератор
3230 / 2033 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
16.01.2017, 09:24 #2
супер тупой, сомневаюсь что
Цитата Сообщение от супер тупой Посмотреть сообщение
опенгл не хочет работать с НЕквадратными текстурами
но спорить не буду - что мешает сделать квадратную текстуру у которой используется только нужная вам прямоугольная область?
1
qppq
12 / 12 / 5
Регистрация: 31.08.2016
Сообщений: 181
Завершенные тесты: 1
16.01.2017, 09:57 #3
текстуры со сторонами равными степени двойки, НЕквадратные в том числе должны работать

Цитата Сообщение от vxg Посмотреть сообщение
что мешает сделать квадратную текстуру у которой используется только нужная вам прямоугольная область?
апсалютна
1
Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
16.01.2017, 10:46 #4
Лучший ответ Сообщение было отмечено супер тупой как решение

Решение

Цитата Сообщение от супер тупой Посмотреть сообщение
Но проблема в том, что опенгл не хочет работать с НЕквадратными текстурами
Ширина/длина = степени двойки (POT Power Of Two) - это очень древнее ограничение, сомневаюсь что у Вас такая карта. UV координата (0, 0) соответствует точке текстуры (0, 0), а координата (1, 1) - точке текстуры (width, height). Из этих соображений подгоняете как нужно
1
супер тупой
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 89
Завершенные тесты: 1
19.01.2017, 00:03  [ТС] #5
vxg,
Цитата Сообщение от vxg Посмотреть сообщение
сомневаюсь что ... но спорить не буду
да, я ошибся, прямоугольные со степенями двойки работают, как правильно заметил qppq.
Цитата Сообщение от vxg Посмотреть сообщение
но спорить не буду
а вы поспорьте пожалуйста. Потому что у меня при попытке создать не квадратную текстуру
Цитата Сообщение от vxg Посмотреть сообщение
что мешает сделать квадратную текстуру у которой используется только нужная вам прямоугольная область
это в своем роде "гениально"... думаю такое сработает.

Igor3D, а вот произвольные размеры(например 1366х768) уже отображаются некорректно...
0
Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
19.01.2017, 09:14 #6
Цитата Сообщение от супер тупой Посмотреть сообщение
.. а вот произвольные размеры(например 1366х768) уже отображаются некорректно...
Если картинка 1366х768 натянута на пр-к 1366х768 - она отобразится 1:1. Если хотите добиться чего-то иного - поясните чего, из Вашего стартового поста это неясно
0
супер тупой
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 89
Завершенные тесты: 1
19.01.2017, 11:14  [ТС] #7
Igor3D, и вы тоже оказались правы...
Я понял в чем оказывается проблема: до сих пор не понятно в каком виде ждет glTexImage2D() от меня массив пикселей. Т.к. я пытался рисовать как обычно, т.е.
C++
1
2
3
4
5
6
7
int index = -1;
for (int x = 0; x <= sizeX; x++)
    for (int y = 0; y <= sizeY; y++) {
        colors[++index] = (float)x / sizeX;
        colors[++index] = (float)y / sizeY;
        colors[++index] = 0.1;
    }
И получал результат, как в первой приложенной картинке. А если рисовать так
C++
1
2
3
4
5
6
7
int index = -1;
for (int y = 0; y <= sizeY; y++)
    for (int x = 0; x <= sizeX; x++) {
        colors[++index] = (float)x / sizeX;
        colors[++index] = (float)y / sizeY;
        colors[++index] = 0.1;
    }
То получается уже что-то(вторая картинка). Потом решил посмотреть так
C++
1
2
3
4
5
6
7
int index = -1;//points_size = 3 * (sizeX + 1) * (sizeY + 1);
for (int y = 0; y <= sizeY; y++)
    for (int x = 0; x <= sizeX; x++) {
        colors[++index] = (float)index / points_size;
        colors[++index] = (float)index / points_size;
        colors[++index] = 0.1;
    }
И получил 3ю картинку. А после совсем запутался. Мне нужно рисовать так, как будто рисую просто по оконным пикселям, а соответствие построить между массивом colors и пикселями экрана пока не получается.
0
Миниатюры
Как наложить текстуру на прямоугольник без растяжения?   Как наложить текстуру на прямоугольник без растяжения?   Как наложить текстуру на прямоугольник без растяжения?  

Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
19.01.2017, 12:08 #8
Цитата Сообщение от супер тупой Посмотреть сообщение
y <= sizeY
А почему <= ? По-моему просто <. И для x тоже
1
супер тупой
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 89
Завершенные тесты: 1
19.01.2017, 12:43  [ТС] #9
Igor3D, вот кстати это тоже вопрос интересный. Я раньше думал, что пиксели на экране будут [0; 1366] включительно, поэтому и создаю массив длинной 1367( от туда и <= ). Это не так?
Но сути это не меняет, просто текстура чуть сожмется на один пиксель(не думаю, что будут такие искажения как у меня).
0
Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
19.01.2017, 12:49 #10
Цитата Сообщение от супер тупой Посмотреть сообщение
Но сути это не меняет, просто текстура чуть сожмется на один пиксель(не думаю, что будут такие искажения как у меня).
Как раз будут как эффект (де)синхронизации на старых TV

Цитата Сообщение от супер тупой Посмотреть сообщение
Я раньше думал, что пиксели на экране будут [0; 1366] включительно, поэтому и создаю массив длинной 1367( от туда и <= ). Это не так?
Ну зачем форум напрягать если проверить - дело секунд? Добивайтесь правильного градиента, где-то в заполнении насвистели
0
qppq
12 / 12 / 5
Регистрация: 31.08.2016
Сообщений: 181
Завершенные тесты: 1
19.01.2017, 14:58 #11
Цитата Сообщение от супер тупой Посмотреть сообщение
как будто рисую просто по оконным пикселям, а соответствие построить между массивом colors и пикселями экрана пока не получается.
glOrtho(0, Wscreen, 0, Hscreen, -1 , 1 );
для фуллскрин режима , тогда точка с коорд-ми (0,0) должна оказаться в левом нижнем углу,
а точка с коорд-ми (Wscreen,Hscreen) в правом верхнем соответственно
0
супер тупой
6 / 6 / 3
Регистрация: 29.08.2014
Сообщений: 89
Завершенные тесты: 1
19.01.2017, 23:47  [ТС] #12
Igor3D,
Цитата Сообщение от Igor3D Посмотреть сообщение
Как раз будут как эффект (де)синхронизации на старых TV
видимо я программирую на старом TV, но после того, как я прочитал, что должно быть [0; 1366), все заработало(что во первых и логично, но я не думал, что один пиксель может испортить всю картину).
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну зачем форум напрягать если проверить - дело секунд?
так я вроде не напрягал, так, спросил между дела у знающего человека

qppq,
почти так и делаю, точнее
C++
1
glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT), 0, 1);
Оказывается все заполнял правильно, но брал лишние пиксели, из-за чего получал искаженное отображение.
1
19.01.2017, 23:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 23:47
Привет! Вот еще темы с решениями:

[OpenGL] Наложить текстуру на квадрат
Здравствуйте, нужна помощь) Нужно наложить текстура на квадрат, размеры...

Наложить на 2 перекрестных полигона текстуру травы
Возникла такая проблема. Хочу наложить на 2 перекрестных полигона текстуру...

OpenGL натянуть текстуру на 4х угольный полигон. Самый простой способ без лишнего кода
В интернете слишком много кода на OpenGL с натяжкой полигона. Но большинство...

Как растянуть текстуру на трапеции?
Трапеция строится из двух треугольников, Как равномерно растянуть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru