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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2010, 16:24   #1
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию glScissor не работает

Пытаюсь обрезать изображение, ничего не получается. После отрисовки, в конце пишу такой код:
Код:
  glEnable(GL_SCISSOR_TEST);
  glScissor(0, 0, STANDART_WIDTH, STANDART_HEIGHT);
  glDisable(GL_SCISSOR_TEST);
Не работает. В прикреплённом изображение показано, какую область нужно оставить, какую отсечь.
Изображения
Тип файла: jpg 1.JPG (95.1 Кб, 193 просмотров)
Манжосов Денис :) вне форума Ответить с цитированием
Старый 04.10.2010, 17:37   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

OpenGL - процедурная библиотека, если ты выделил область, например через glScissor, то это только выделение, далее нужно прописать команду, что делать с параметрами выделения, ...наверняка это очистка того, что за пределами или вывод только определенного параметрами куска, ...я точно не знаю что написать, но после glScissor нужна еще одна команда.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 04.10.2010, 18:02   #3
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Цитата:
OpenGL - процедурная библиотека...
Если вы имеете ввиду, что я только glScissor из OpenGL использую, то нет =). Вся графика выводится только с использованием библиотеки OGL.
Цитата:
если ты выделил область, например через glScissor, то это только выделение, далее нужно прописать команду
Цитата:
В OpenGL есть возможность, позволяющая выводить изображение не на всё окно, а только внутри указанного прямоугольника. Такой прямоугольник называется прямоугольником отсечения. Задаётся он процедурой glScissor(x, y, width, height), где x и y – координаты левого нижнего угла, а width и height – ширина и высота. По умолчанию прямоугольник отсечения совпадает с рабочей областью окна. Остаётся только сказать, что началом координат считается левый нижний угол окна.
И во всех примерах, найденных мной, дополнительных процедур помимо glScissor, не приводится. Только glEnable(GL_SCISSOR_TEST) и glDisable(GL_SCISSOR_TEST)...

Последний раз редактировалось Манжосов Денис :); 04.10.2010 в 18:05.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 04.10.2010, 18:17   #4
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, STANDART_WIDTH, STANDART_HEIGHT);
glDisable(GL_SCISSOR_TEST);
А где само рисование? Насколько я понял (вот тут: http://www.mirgames.ru/article/opengl/opengl3) рисование должно проходить после включения GL_SCISSOR_TEST и установки glScissor с координатами:
Код:
glEnable(GL_SCISSOR_TEST);
glScissor(x,y,w,h);
Draw();
glDisable(GL_SCISSOR_TEST);
Вадим Буренков вне форума Ответить с цитированием
Старый 04.10.2010, 18:51   #5
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Я понимал, что нужно glScissor применять уже после рисования. Сделал теперь так:
Код:
  glEnable(GL_SCISSOR_TEST);
  glScissor(0, STANDART_HEIGHT, STANDART_WIDTH, STANDART_HEIGHT); // От левого нижнего угла
  Рисование
  glDisable(GL_SCISSOR_TEST);
Результат вот такой...

Кстати, не совсем понятно, как работает glOrtho. Я пишу такой код: glOrtho(0, Width, Height, 0, 0, 1);
Мне кажется, что изображение само как-то неверно рисуется на экране, сжимается что ли, а вот обрезание происходит верно...

Всё, спасибо всем. Разобрался. =)

Последний раз редактировалось Манжосов Денис :); 04.10.2010 в 21:42.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 04.10.2010, 19:03   #6
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Манжосов Денис :) Посмотреть сообщение
Я понимал, что нужно glScissor применять уже после рисования.
Нет )), ...в том и дело, что OGL процедурная, ...сначала подготовка параметров, потом действие над ними, ...выделил контуры, отрисовал (каламбур) по ним.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 04.10.2010, 22:33   #7
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

1)Ortho вроде правильно настроено.
2)в glScissor передаются не координаты вершин прямоугольника а его положение и размеры. Судя по параметрам 0, STANDART_HEIGHT, STANDART_WIDTH, STANDART_HEIGHT ты пытаешься передать как раз вершины.
В ссылке что я давал выше об этом написано:
Цитата:
glScissor(x, y, width, height), где x и y – координаты левого нижнего угла, а width и height – ширина и высота.
3)Мне не совсем понятно зачем тебе вообще нужно обрезание при рисовании? Не легче ли просто рисовать там где надо?
Вадим Буренков вне форума Ответить с цитированием
Старый 06.10.2010, 17:27   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а нельзя окно уменьшить или прямоугольник растянуть на всё окно?)
NiCola999 вне форума Ответить с цитированием
Старый 06.10.2010, 18:03   #9
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Можно ещё воспользоваться glViewport для задания области рисования, если это подойдёт.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 07.10.2010, 16:13   #10
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Цитата:
3)Мне не совсем понятно зачем тебе вообще нужно обрезание при рисовании? Не легче ли просто рисовать там где надо?
Рисовалось то, что по идее не должно было рисоваться. Не найдя решения, я решил просто обрезать лишнюю часть.
Цитата:
а нельзя окно уменьшить или прямоугольник растянуть на всё окно?)
Вне сомнений, это очень гениально, но только если бы мне нужно было это сделать, я бы уже сделал это давно и ничего не писал на форуме.
Цитата:
Можно ещё воспользоваться glViewport для задания области рисования, если это подойдёт.
Да, я пробовал, но часть изображения теперь уже НЕ рисовалась.

Оставив glOrtho и сделав вывод на панель, я решил проблему.

Последний раз редактировалось Манжосов Денис :); 07.10.2010 в 16:24.
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему интеренет на Xp не работает, а на семерке работает Lenura Windows 18 04.10.2010 12:04
TP7 чтение из файла, работает но не работает!? Qousio Помощь студентам 7 02.06.2009 09:37
Библиотека НЕ работает с 2008, но работает с 2000 SQL namenike Общие вопросы C/C++ 0 26.05.2009 11:04
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46
Проблема с UserForm. То работает, то НЕ работает Maxx Microsoft Office Excel 6 19.11.2008 14:51