Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/104: Рейтинг темы: голосов - 104, средняя оценка - 4.65
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Обводка объекта с использованием шейдера

01.10.2021, 19:34. Показов 23843. Ответов 180
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть игра, в которой я могу определить, когда начинает / заканчивает рисоваться нужный мне объект и "внедриться" в нужный момент. Я хочу сделать так, чтобы контур нужного мне объекта обводился. Подобие того что я хочу Вы можете увидеть на прикреплённом изображении.

1. Возможно ли сделать обводку объекта без повторной его отрисовки? (я не знаю как игра рисует объекты, да и это будет сказываться на производительности)
2. Возможно ли сделать это без шейдера и повторной отрисовки? (один человек говорил мне что без шейдера нужно будет рисовать дважды)
3. Как это сделать? (я не прошу написать за меня весь код, однако я очень мало понимаю в шейдерах. У меня есть две "точки" - начало рисования и конец, как и что нужно написать в самом начале чтобы увидеть хоть какие-то изменения и далее уже самому потыкать)
Миниатюры
Обводка объекта с использованием шейдера  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2021, 19:34
Ответы с готовыми решениями:

Обводка объекта
Возможно ли нарисовать обводку объекта, при условиях, что нельзя использовать шейдеры и сам объект рисую не я? У меня есть возможность...

Обводка объекта точками в OpenCV
Здравствуйте,только открыл для себя OpenCV.Задача такова:будут объекты на белом фоне,хочу обвести объект максимальным количеством точек...

написать программу движущийся графический объект с двумя способоми с использованием статического объекта и с использованием динамического объекта
Движение закрашенного прямоугольника по треугольному контуру с изменением цвета при изменении направления движения.

180
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
02.10.2021, 01:06  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
...
Что? Я не знаю как его инициализировать. До этого я инициализировал только тот где вершины были заранее прописаны. А тут какие-то параметры надо, камеру какую-то. Я не знаю как это делать.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Хотя, для начала посмотри, используется ли шейдер игрой (GLint program = 0; glGetIntegerv(GL_CURRENT_PROGRAM, &program))
Конкретно при рисовании частей сундука - нет.

Цитата Сообщение от zayats80888 Посмотреть сообщение
А я спать.
Сладких.
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
02.10.2021, 10:32
Цитата Сообщение от zayats80888 Посмотреть сообщение
Он рисуется:
А как же?
glDrawArraysInstanced
glDrawElementsInstanced
появились в 3.1 версии
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
02.10.2021, 11:07

Не по теме:

Цитата Сообщение от alecss131 Посмотреть сообщение
А как же?
А как же?
glDrawElementsBaseVertex
glDrawArraysInstancedBaseInstance
glDrawElementsInstancedBaseInstance
glMultiDrawElementsBaseVertex
glDrawRangeElementsBaseVertex
glDrawElementsInstancedBaseVertex
glDrawElementsInstancedBaseVertexBaseIns tance
glDrawTransformFeedback
glDrawTransformFeedbackStream
glDrawTransformFeedbackInstanced
glDrawTransformFeedbackStreamInstanced
glDrawArraysIndirect
glMultiDrawArraysIndirect
glDrawElementsIndirect
glMultiDrawElementsIndirect
Они тоже когда-то там появились... [сарказм]



Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Что? Я не знаю как его инициализировать.
Ты вообще читаешь, что я пишу? У тебя там фиксированный конвейер, куда ты там собрался лепить этот шейдер? Даже игра не использует шейдеры.
Ты статью прочитал, что я скидывал в первом посте? Понял? Как разумный человек, после прочтения, ты должен был самостоятельно воспроизвести всю теорию в своем коде, не в игре. Ты это сделал?
Тебе задание: без шейдера, фиксированным конвейером нарисовать кубик и обводку в своем коде. После этого ты приходишь сюда, выкладываешь свои 20 строк кода и говоришь "вот я все понял и умею рисовать обводку, но для переноса это в игру мне не понятен один момент" (да, у тебя должен возникнуть всего один вопрос, на который я отвечу). Или, опять же, выкладываешь свои 20 строк кода и говоришь "читал, но ничего не понял, у меня даже самостоятельно не получается нарисовать кубик и обводку, что я делаю не так, ПАМИГИТИ".
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
02.10.2021, 12:21  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Даже игра не использует шейдеры
Я же говорю, проверял только на отрисовке сундука. А так, возможно, они используются. Не просто же так в игре возможность установить "шейдеры" для улучшения картинки..

Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты статью прочитал, что я скидывал в первом посте?
Нет. Я подумал что это то же самое что в том видео и закрыл. Сейчас прочитаю. Спасибо.
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,244
Записей в блоге: 3
03.10.2021, 11:51
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Возможно ли сделать обводку объекта без повторной его отрисовки?
дело в том, что обводка это в некой мере уже повторная отрисовка того же объекта.

как я увидел:
1. нужен только фрагментный шейдер.
2. в униформе передаётся примерно выбранный центр заданного нам объекта.(?)
3. сначала рисуем пиксель фигуры со скейлингом k > 1 цветом обводки.
4. затем рисуем сам пиксель цвета фигуры.
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
03.10.2021, 19:26
XLAT, фрагментный шейдер по умолчанию может писать только в 1 пиксель, для которого был вызван. единственное можно писать в несколько буферов.

Добавлено через 48 минут
можно еще использовать функции glsl
glSlang
1
2
gvec4 imageLoad(gimage image​, IMAGE_COORD);
void imageStore(gimage image​, IMAGE_COORD, gvec4 data​);
но для этого надо текстуру привязывать с помощью
C++
1
2
3
4
5
6
7
void glBindImageTexture(    GLuint unit,
    GLuint texture,
    GLint level,
    GLboolean layered,
    GLint layer,
    GLenum access,
    GLenum format);
и это возможно только c
Core in version 4.6
Core since version 4.3
EXT_shader_image_load_store
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,244
Записей в блоге: 3
03.10.2021, 20:27
Цитата Сообщение от alecss131 Посмотреть сообщение
может писать только в 1 пиксель
чтобы писать сразу в несколько пикселей,
нужно перейти от одномерного мышления сразу к многомерному

Можно заставить работать каждый шейдер у контексте ОБЩЕЙ картинки, а не одного пикселя.

вот тут я уже показывал шейдер квадратов:
https://www.shadertoy.com/view/Ns3SD7

а вот тут те же квадраты, но уже с ОБВОДКОЙ:
https://www.shadertoy.com/view/Ns3XD7

если вы посмотрите внимательно код, то увидите, что я сделал всё чётко по этим пунктам!

и повторюсь: сам принцип(c мизерными правками) будет рабать и на стандартном огле и на древнем 2.1
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
03.10.2021, 21:11
Цитата Сообщение от XLAT Посмотреть сообщение
будет рабать и на стандартном огле и на древнем 2.1
пока не увижу код не поверю
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,244
Записей в блоге: 3
03.10.2021, 21:40
Цитата Сообщение от alecss131 Посмотреть сообщение
пока не увижу код не поверю
а какой код вам нужен, код шейдера выше по ссылке.

не создавать мне же на каждый пук целый проект...

alecss131, так сложилось, что меня не интересуют последние стандарты типа 4.6 и т.п..

я склонен к тому, чтобы мой код запускался на любом утюге.


но если на скорую руку - без компиляций: просто подменил скорректированный фрагментный шейдер в SFML-2.5.1 тестовом проекте(этот ексешник будет работать и на старом железе, где есть виндоз + огл 2.1):
Вложения
Тип файла: rar Shaders[msys2-GCC]_win-32.rar (689.7 Кб, 24 просмотров)
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 19:48  [ТС]
zayats80888, Вроде что-то выходит, текстура сундука зарисовывается белым (не обводится) если находится за каким-то объектом. Как именно обводку сделать - пока не понимаю, но буду пробовать дальше. Текущий результат сделан с использованием фрагментного шейдера (не уверен что удалил все лишние строки ибо пастил код из примера по отрисовке треугольника) Не могу пока понять как увеличить именно эту белую часть. Пробовал вызывать glScalef(1.5f, 1.5f, 1.5f) отрисовывать и по разному возвращать glScalef(-1.5f...) glScalef(0.0f...) glScalef(1.0f) но почему-то другие части сундука все равно становились большими.

Текущий код, если интересно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if (chest)
{
    glClear(GL_STENCIL_BUFFER_BIT);
 
    glEnable(GL_STENCIL_TEST);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glStencilFunc(GL_ALWAYS, 1, 0xFF);
    glStencilMask(0xFF);
}
 
pglCallList(list);
    
if(chest)
{
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilMask(0x00);
    glDisable(GL_DEPTH_TEST);
    glUseProgram(shaderProgram);
 
    pglCallList(list);
 
    glEnable(GL_DEPTH_TEST);
    glUseProgram(0);
 
    glDisable(GL_STENCIL_TEST);
    glStencilMask(0xFF);
    glStencilFunc(GL_ALWAYS, 0, 0xFF);
}
p.s Писал без тестирования на отдельном проекте (со своим окном) ибо мне проще разобраться с этим чем разбираться сначала с созданием окна и подключением других библиотек. Сейчас чекнул ещё раз статью, код вроде совпадает, попробую в точности сделать как там и скажу получилось или нет.
Миниатюры
Обводка объекта с использованием шейдера  
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 20:57  [ТС]
Почему-то сбросить не получается
C++
1
2
3
glScalef(1.0f, 1.5f, 1.0f);
pglCallList(list);
glScalef(1.0f, 1.0f, 1.0f);
Следующие части сундука тоже растягиваются по Y, хотя по логике растянуться должна только белая часть.

Добавлено через 10 минут
Мне кажется, такая "обводка" мне не подходит, потому что за стеной у меня все так же будет полностью белая текстура, а мне нужна именно обводка (даже за стенами)

Добавлено через 8 секунд
Либо я что-то не понимаю..
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 20:58  [ТС]
По моему для обводки нужно как-то по другому делать, вот например в чите обводка. За стеной стоит крипер и корова. Он их обвел как одно (так крипер стоял перед коровой). Тем методом которым я делаю так не сделать. Потому что я обвожу каждый объект отдельно.
Миниатюры
Обводка объекта с использованием шейдера  
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
04.10.2021, 21:11
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Пробовал вызывать glScalef(1.5f, 1.5f, 1.5f) отрисовывать и по разному возвращать glScalef(-1.5f...) glScalef(0.0f...) glScalef(1.0f) но почему-то другие части сундука все равно становились большими.
Для сохранения матриц есть glPushMatrix/glPopMatrix
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
Если нужно и за стенками "трафаретить", второй параметр тоже на GL_REPLACE поменяй.
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
p.s Писал без тестирования на отдельном проекте (со своим окном) ибо мне проще разобраться с этим чем разбираться сначала с созданием окна и подключением других библиотек.
Если хочешь, я тебе скину проект для "тестовых" испытаний.
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Сейчас чекнул ещё раз статью, код вроде совпадает, попробую в точности сделать как там и скажу получилось или нет.
Что значит в точности, ты сам принцип работы с "GL тестами" понял?
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 21:35  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если нужно и за стенками "трафаретить"
Как понять?

Добавлено через 31 секунду
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если хочешь, я тебе скину проект для "тестовых" испытаний.
Было бы очень круто. Правда. Если можно, вместе с библиотеками пожалуйста.

Добавлено через 8 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Что значит в точности, ты сам принцип работы с "GL тестами" понял?
Не совсем. Некое понимание есть, отдалённое, в плане того как это работает. Но вот на уровне оперирования командами - нет. Для меня это пока очень сложно.

Добавлено через 2 минуты
zayats80888, Я вчера пробовал сделать немного по другому, сохранять матрицы и номера которые вызываются в glCallLists, а потом, когда кадр подготовился, отрисовывать эти сундуки, но там проблема с текстурой была. Может в offset'ах дело, может в чем-то ещё. Она даже не на сундуке была, а просто по экрану перемещалась. Мне кажется, мне придется так делать чтобы в конце все так же соединялось как на скриншоте выше.

Добавлено через 5 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если нужно и за стенками "трафаретить", второй параметр тоже на GL_REPLACE поменяй.
Вообще перестало что-либо за стенами показывать

Добавлено через 25 секунд
zayats80888, https://www.cyberforum.ru/post15749467.html
Мне нужно сделать чтобы обводило примерно как тут.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
04.10.2021, 21:43
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Как понять?
Второй параметр указывает операцию для стенсил буфера, если стенсил тест пройден, а тест глубины - нет.
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Было бы очень круто. Правда. Если можно, вместе с библиотеками пожалуйста.
CMake пользоваться умеешь? Сгенерируй проект для студии:
exploiter_test.zip
Там в main.cpp в функции test для тебя сценка с кубиками и простенькой обводкой, где ты можешь эксперементировать. (если чего не понятно или проблемы, пиши)
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Не совсем. Некое понимание есть, отдалённое, в плане того как это работает. Но вот на уровне оперирования командами - нет. Для меня это пока очень сложно.
Вот тут я немного разжевывал Непонятны трафареты - новичек

Суть в том, что в игре тебе придётся саму обводку рисовать в конце (в хуке SwapBuffers), т.к. другие объекты её "затрут".

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Вообще перестало что-либо за стенами показывать
Естественно, тебе же нужно отмасштабированный сундук нарисовать вторым проходом.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 21:48  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Естественно, тебе же нужно отмасштабированный сундук нарисовать вторым проходом.
Т.е второй параметр сделает так что сквозь стены обводки не будет? Или как?
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
04.10.2021, 21:58
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Т.е второй параметр сделает так что сквозь стены обводки не будет? Или как?
Второй параметр оставит "отпечаток" фрагмента объекта в стенсил буфере, даже если он не прошел тест глубины. Таким образом, рисуя масштабированный объект вторым проходом, этот силуэт "вычитается" из силуэта увеличенного объекта с учетом препятствий, которые закрывают оригинальный объект.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 22:00  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Таким образом, рисуя масштабированный объект вторым проходом, этот силуэт "вычитается" из силуэта увеличенного объекта.
Так, я вообще не понял. Первый раз я рисую сундук и одновременно с этим он записывается в буфер, второй раз рисуется тот же объект но уже белым. Или как? В итоге отрисовок сколько должно быть? Две?
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
04.10.2021, 22:04
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Или как?
Так.
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
В итоге отрисовок сколько должно быть? Две?
Две.

Не по теме:

Но в игре, тебе не нужно будет рисовать второй объект в буфер цвета, только в stencil буфер, а саму обводку рисовать в конце, как я писал, заливая весь экран нужным цветом с учетом буфера трафарета. Но об этом позже. Ты сначала с базовыми вещами разберись

0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
04.10.2021, 22:05  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
тебе не нужно будет рисовать второй объект в буфер цвета, только в stencil буфер
Его как-то вырубать надо или что?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2021, 22:05

Создание текста с использованием DrawString и обводка
Подскажите, пожалуйста, как создать такой текст с обводкой, например буква, как буква «T» на картинке ниже. Для создания текста использую...

Создать проект, с использованием объекта Timer, перемещение графического объекта по заданной траектории, (прямоугольник,
Создать проект, с использованием объекта Timer, перемещение графического объекта по заданной траектории, (прямоугольник, квадрат или...

Перемещение объекта по форме с использованием мыши
Всем доброго времени суток. Необходимо осуществить перемещение Image при помощи мыши. Объекты находятся в Canvas. Проблема заключена в...

Задача с использованием объекта hScrollBar и pictureBox
Может мой вопрос покажется глупым, но всё же...Как можно осуществить изменение размера объекта pictureBox используя hScrollBar? У меня была...

Поворот объекта с использованием Rigidbody.MoveRotation
использую Rigidbody.MoveRotation для поворота объекта по оси Х на 30 градусов, проблема в том что оно НЕ затухает при 30 градусов, а просто...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru