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

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

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

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

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

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

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

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

180
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
25.11.2021, 04:35
Студворк — интернет-сервис помощи студентам
zayats80888, не будет ли у вас предположения по поводу устранения такого эффекта:



Миниатюры
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.11.2021, 09:23
Цитата Сообщение от 8Observer8 Посмотреть сообщение
не будет ли у вас предположения по поводу устранения такого эффекта:
Я не знаю, что стало его причиной. Вы хотели рендерить текст в 3D за объектами или что-то другое? Как должно это выглядеть правильно?

Не по теме:

Создали бы отдельную тему с подробным описанием проблемы...

1
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
25.11.2021, 11:34
Я его просто хочу выводить внутри 3D сцены. Получается конфликт с обводкой через Stencil. Я попробовал сделать команду рисования текста перед всеми другими командами рисования получилось так:



C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void Widget::initializeGL()
{
    glClearColor(0.2f, 0.2f, 0.2f, 1.f);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
 
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
    /*...*/
}
C++ (Qt)
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
void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
    m_projViewMatrix = m_projMatrix * m_viewMatrix;
 
    glStencilMask(0x00);
    m_pText->draw(m_projViewMatrix);
    m_ground->draw(&m_projViewMatrix);
    m_tree->draw(&m_projViewMatrix);
 
    glStencilFunc(GL_ALWAYS, 1, 0xFF);
    glStencilMask(0xFF);
    m_house->draw(&m_projViewMatrix);
 
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilMask(0x00);
    glDisable(GL_DEPTH_TEST);
    m_houseOutline->draw(&m_projViewMatrix);
//    _treeOutline->draw(&_projViewMatrix);
 
    glStencilMask(0xFF);
    glStencilFunc(GL_ALWAYS, 0, 0xFF);
    glEnable(GL_DEPTH_TEST);
}
Миниатюры
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
25.11.2021, 11:46
Цитата Сообщение от zayats80888 Посмотреть сообщение
Создали бы отдельную тему с подробным описанием проблемы...
Хорошо, сейчас создам.

Добавлено через 3 минуты
Создал тему: Конфликт обводки через Stencil и прозрачностью
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
02.01.2022, 22:02  [ТС]

Не по теме:

Недавно снова вернулся к своим нелепым попыткам сделать хоть какую-то обводку при помощи Stencil буфера и даже немного начал понимать как эта штука работает :3



Цитата Сообщение от zayats80888 Посмотреть сообщение
вот фрагмент упрощенного гомнокода с обводкой размытием
Есть ли какой-то способ сделать это без шейдера? Для меня это очень сложно.

Сегодня пробовал что-то намутить с glPolygonMode, отрисовать сначала просто glCallList, а потом сразу же включить glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) и отрисовать снова, но вышла какая-то фигня.

Есть ли вообще ещё какие-то способы? Я гуглил и нашел только варианты со Stencil буфером и увеличением объекта, но как ты помнишь, при увеличении того же сундука, он сдвигается в разные стороны всё сильнее..
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.01.2022, 22:08
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Есть ли какой-то способ сделать это без шейдера? Для меня это очень сложно.
Можно, но это будет ещё "сложнее" и с использованием depricated механизмов(с которыми я даже возиться не хочу).
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,145
Записей в блоге: 2
03.01.2022, 08:08
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я гуглил и нашел только варианты со Stencil буфером и увеличением объекта, но как ты помнишь, при увеличении того же сундука, он сдвигается в разные стороны всё сильнее..
Все там нормально получается со стенсилом, только с "увеличением" напрасно связались. Рисуете обводку wireframe, если надо - увеличиваете толщину линии. Ну и glDepthFunc(GL_LEQUAL) для wireframe
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
03.01.2022, 23:23  [ТС]
Igor3D, Я уже пробовал, получается лютая дичь. Хотя, может быть не так делал. Можно пример кода?

Не по теме:

zayats80888, Можно пример дефолтных шейдеров для OpenGL 3.2? Под дефолтными я имею ввиду который просто красит пиксели в текущий цвет который установлен в glColor и рисует там где я обозначил позиции.



Добавлено через 6 минут

Не по теме:

Если версия OpenGL в игре 3.2, в glsl #version нужно писать 3.2? Или это не к версии OpenGL относится а к версии языка? Как это вообще влияет?



Добавлено через 10 минут

Не по теме:

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
который установлен в glColor
А, стоп, его в 3.2 уже нет. XD Ладно я понял)



Добавлено через 36 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну и glDepthFunc(GL_LEQUAL) для wireframe
Он по дефолту такой..
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,145
Записей в блоге: 2
04.01.2022, 10:15
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Igor3D, Я уже пробовал, получается лютая дичь. Хотя, может быть не так делал. Можно пример кода?
Сначала сделайте без всякого стенсила. Ставите
C++
1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
и рисуете wireframe нужным цветом. Потом возвращаете GL_FILL и рисуете объект нормально. Линии "толще", поэтому какая-то тонкая обводка будет видна даже при дефаултной единичной ширине линии. Увеличьте ее (glLineWidth). Убедитесь что это работает
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
04.01.2022, 11:27
Igor3D, он пишет чит для сетевой игры Minecraft. Ему нужна обводка, чтобы видеть сундуки/мобов/врагов сквозь стены. Он хочет пример кода, чтобы через стены было видно обводку.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,145
Записей в блоге: 2
04.01.2022, 15:26
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Он хочет пример кода, чтобы через стены было видно обводку.
Знаю, просто не все сразу
1
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.01.2022, 18:13
Цитата Сообщение от 8Observer8 Посмотреть сообщение
он пишет чит для сетевой игры Minecraft. Ему нужна обводка, чтобы видеть сундуки/мобов/врагов сквозь стены. Он хочет пример кода, чтобы через стены было видно обводку.
а что таких читов нету, да и на серверах его забанят админы смысл?
0
05.01.2022, 04:49  [ТС]

Не по теме:

8Observer8, Подскажите, пожалуйста, какую версию в шейдер нужно писать если я пишу для OpenGL 3.2?

0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
05.01.2022, 05:25
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
8Observer8, Подскажите, пожалуйста, какую версию в шейдер нужно писать если я пишу для OpenGL 3.2?
Я так делаю, набираю в интернет-поисковике: opengl history В первых ссылках будет, например, ссылка: https://www.khronos.org/opengl... _of_OpenGL В содержании версий кликаю "OpenGL 3.2 (2009)" и вижу:
  • Core and compatibility profiles
  • Shading language 1.50

Либо на Википедии: https://en.wikipedia.org/wiki/OpenGL#OpenGL_3.2

OpenGL 3.2

Release date: August 3, 2009

OpenGL 3.2 further built on the deprecation mechanisms introduced by OpenGL 3.0, by dividing the specification into a core profile and compatibility profile. Compatibility contexts include the previously-removed fixed-function APIs, equivalent to the ARB_compatibility extension released alongside OpenGL 3.1, while core contexts do not. OpenGL 3.2 also included an upgrade to GLSL version 1.50.
Либо можно набрать в интернет-поисковике: glsl history, тогда первой ссылкой будет ссылка на статью Википедии: https://en.wikipedia.org/wiki/... g_Language На странице есть удобная таблица:



Миниатюры
1
05.01.2022, 05:37  [ТС]

Не по теме:

8Observer8, А вообще эта версия на что-то влияет? Если я установлю например #version 150, ничего не поломается?

0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
05.01.2022, 12:40
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
8Observer8, А вообще эта версия на что-то влияет?
Если честно, я не знаю. Единственное по поводу версий могу добавить, что у некоторых ноутбуков две видеокарты, где более слабая используется по умолчанию для экономии энергии. У меня на ней OpenGL 3.1, а чтобы активировать более мощную из кода нужно определённые команды написать, можете подробнее почитать в этом сообщении: окно ехе-шника тут же исчезает
1
07.01.2022, 00:11  [ТС]

Не по теме:

Цитата Сообщение от 8Observer8 Посмотреть сообщение
а чтобы активировать более мощную из кода нужно определённые команды написать
Ну, к счастью (или к сожалению) это мне пока-что точно не пригодится, потому что я делаю оверлей для игры которая уже за меня всё делает, мне лишь остаётся рисовать)

0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
29.11.2022, 03:56  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
вот фрагмент упрощенного гомнокода с обводкой размытием:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
  // как пользоваться шейдерами ты знаешь,
  // поэтому я спрячу эти детали в класс,
  // чтобы не захламлять (гомно)код
  gl::Program blur;
  {
    gl::Shader frag{gl::ShaderType::Fragment};
    const std::string srcFrag = R"(
      uniform vec2 uDelta;
      uniform vec2 uDirection;
      uniform sampler2D uTexture;
      void main() {
        vec2 uv = gl_TexCoord[0].st;
        float color = texture2D(uTexture, uv).r;
        vec2 off1 = uDirection * 1.5;
        vec2 off2 = uDirection * 3.0;
        color += texture2D(uTexture, uv + uDelta * off1).r * 0.5 +
                 texture2D(uTexture, uv - uDelta * off1).r * 0.5 +
                 texture2D(uTexture, uv + uDelta * off2).r * 0.25 +
                 texture2D(uTexture, uv - uDelta * off2).r * 0.25;
        gl_FragColor = vec4(color);
      }
    )";
    frag.loadFromMemory(srcFrag);
    blur.attachShader(frag);
    blur.link();
  }
GLint uDirection = blur.getUniformLocation("uDirection");
  GLint uDelta = blur.getUniformLocation("uDelta");
// размеры кастомных текстур должны иметь то же соотношение сторон,
  // что и основной фрэймбуфер окна, но для повышения производительности и экономии памяти
  // путём снижения качества, можно их пропорционально уменьшить
  GLint fboSizeX = 800;
  GLint fboSizeY = 600;
  // две текстуры для фрэймбуфера
  GLuint tex[2] = {};
  gl->GenTextures(2, tex);
  for (auto texture : tex) {
    gl->BindTexture(GL_TEXTURE_2D, texture);
    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    // на самом деле тут достаточно одноканальных текстур,
    // но мне лень пихать ещё один шейдер для заливки обводки,
    // так что будем использовать фиксированный конвейер и RGBA текстуры
    gl->TexImage2D(GL_TEXTURE_2D,
                   0,
                   GL_RGBA,
                   fboSizeX,
                   fboSizeY,
                   0,
                   GL_RGBA,
                   GL_UNSIGNED_BYTE,
                   nullptr);
  }
  gl->BindTexture(GL_TEXTURE_2D, 0);
  // фрэймбуфер
  GLuint fbo = 0;
  gl->GenFramebuffers(1, &fbo);
  gl->BindFramebuffer(GL_FRAMEBUFFER, fbo);
  gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[0], 0);
  GLenum status = gl->CheckFramebufferStatus(GL_FRAMEBUFFER);
  if (status != GL_FRAMEBUFFER_COMPLETE) {
    utils::message(utils::LogType::Critical, "incomplete fbo");
  }
  gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
gl->GenLists(2);
  // создаём call list для куба с цветными гранями
  gl->NewList(1, GL_COMPILE);
  {
    const double a = 1.0;
    const vec3 ltf = {-a, a, -a};
    const vec3 lbf = {-a, -a, -a};
    const vec3 rbf = {a, -a, -a};
    const vec3 rtf = {a, a, -a};
    const vec3 ltn = {-a, a, a};
    const vec3 lbn = {-a, -a, a};
    const vec3 rbn = {a, -a, a};
    const vec3 rtn = {a, a, a};
gl->Begin(GL_QUADS);
gl->Color3d(0.8, 0.2, 0.2);
    gl->Vertex3dv(ltf.data());
    gl->Vertex3dv(lbf.data());
    gl->Vertex3dv(lbn.data());
    gl->Vertex3dv(ltn.data());
    gl->Color3d(0.8, 0.8, 0.2);
    gl->Vertex3dv(ltn.data());
    gl->Vertex3dv(lbn.data());
    gl->Vertex3dv(rbn.data());
    gl->Vertex3dv(rtn.data());
    gl->Color3d(0.2, 0.8, 0.2);
    gl->Vertex3dv(rtn.data());
    gl->Vertex3dv(rbn.data());
    gl->Vertex3dv(rbf.data());
    gl->Vertex3dv(rtf.data());
    gl->Color3d(0.2, 0.8, 0.8);
    gl->Vertex3dv(rtf.data());
    gl->Vertex3dv(rbf.data());
    gl->Vertex3dv(lbf.data());
    gl->Vertex3dv(ltf.data());
    gl->Color3d(0.2, 0.2, 0.8);
    gl->Vertex3dv(ltf.data());
    gl->Vertex3dv(ltn.data());
    gl->Vertex3dv(rtn.data());
    gl->Vertex3dv(rtf.data());
    gl->Color3d(0.8, 0.2, 0.8);
    gl->Vertex3dv(lbn.data());
    gl->Vertex3dv(lbf.data());
    gl->Vertex3dv(rbf.data());
    gl->Vertex3dv(rbn.data());
gl->End();
  }
  gl->EndList();
// создаём call list для текстурированного прямоугольника во весь экран
  gl->NewList(2, GL_COMPILE);
  {
    gl->PushMatrix();
    gl->LoadIdentity();
    gl->MatrixMode(GL_PROJECTION);
    gl->PushMatrix();
    gl->LoadIdentity();
    gl->MatrixMode(GL_TEXTURE);
    gl->PushMatrix();
    gl->LoadIdentity();
gl->Begin(GL_QUADS);
    gl->TexCoord2d(0.0, 0.0);
    gl->Vertex2d(-1.0, -1.0);
    gl->TexCoord2d(1.0, 0.0);
    gl->Vertex2d(1.0, -1.0);
    gl->TexCoord2d(1.0, 1.0);
    gl->Vertex2d(1.0, 1.0);
    gl->TexCoord2d(0.0, 1.0);
    gl->Vertex2d(-1.0, 1.0);
    gl->End();
gl->PopMatrix();
    gl->MatrixMode(GL_PROJECTION);
    gl->PopMatrix();
    gl->MatrixMode(GL_MODELVIEW);
    gl->PopMatrix();
  }
  gl->EndList();
// рисование кубика
  // scale - масштаб
  // off - смещение
  // angle - угол поворота
  // axis - ось, вокруг которой поворачиваем
  auto cube = [gl](double scale, vec3 const& off, double angle, vec3 const& axis) {
    gl->PushMatrix();
gl->Rotated(angle, axis[0], axis[1], axis[2]);
    gl->Translated(off[0], off[1], off[2]);
    gl->Rotated(angle * 0.5, axis[1], axis[2], axis[0]);
    gl->Scaled(scale, scale, scale);
gl->CallList(1);
gl->PopMatrix();
  };
// перспективная проекция
  gl->MatrixMode(GL_PROJECTION);
  gl->LoadIdentity();
  gl->Frustum(-4, 4, -3, 3, 10, 100);
// положение "камеры"
  gl->MatrixMode(GL_MODELVIEW);
  gl->LoadIdentity();
  gl->Translated(0.0, 0.0, -25.0);
gl->Viewport(0, 0, 800, 600);
gl->Enable(GL_DEPTH_TEST);
  gl->Enable(GL_CULL_FACE);
  gl->CullFace(GL_BACK);
while (!glfwWindowShouldClose(window)) {
    glfwPollEvents();
////////////////////////////////////////////////////////////////////////////////
    double t = glfwGetTime();
    double angle = t * 30.0;
gl->ClearColor(0.3f, 0.73f, 0.91f, 1.0f);
    gl->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    // Рисуем два маленьких кубика.
    // При этом в трафарете выставляем младший бит,
    // вне зависимости от успеха теста глубины(чтоб и за "стенками" было видно).
    gl->Enable(GL_STENCIL_TEST);
    gl->StencilFunc(GL_ALWAYS, 0x01, 0xff);
    gl->StencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
    cube(1.0, vec3{3.0, 3.0, 3.0}, angle, vec3{-1.0, 1.0, 0.0});
    cube(1.0, vec3{4.0, 5.0, 6.0}, angle, vec3{-1.0, 1.0, 0.0});
    gl->Disable(GL_STENCIL_TEST);
// Опять рисуем два маленьких кубика, но в нашу текстуру
    // крася фрагменты в белый цвет
    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo);
    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[0], 0);
    gl->Viewport(0, 0, fboSizeX, fboSizeY);
    gl->ClearColor(0, 0, 0, 0);
    gl->Clear(GL_COLOR_BUFFER_BIT); // очищать нужно только один раз за кадр
    gl->Enable(GL_COLOR_LOGIC_OP);
    gl->LogicOp(GL_SET); // красим в белый цвет
    cube(1.0, vec3{3.0, 3.0, 3.0}, angle, vec3{-1.0, 1.0, 0.0});
    cube(1.0, vec3{4.0, 5.0, 6.0}, angle, vec3{-1.0, 1.0, 0.0});
    gl->Disable(GL_COLOR_LOGIC_OP);
    gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
    gl->Viewport(0, 0, 800, 600);
// Рисуем большой кубик (ну или просто остальные объекты сцены)
    cube(2.2, vec3{}, 0.3 * angle, vec3{1.0, 0.0, 1.0});
// теперь делаем обводку
    // делать это нужно один раз в конце рисования сцены
// блюрим силуэты (блюр в два прохода)
    gl->Enable(GL_TEXTURE_2D);
    blur.bind();
    blur.setUniform(uDelta, gl::vec2{1.0f/fboSizeX, 1.0f/fboSizeY});
    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo);
    gl->Viewport(0, 0, fboSizeX, fboSizeY);
    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[1], 0);
    gl->BindTexture(GL_TEXTURE_2D, tex[0]);
    blur.setUniform(uDirection, gl::vec2{1.0f, 0.0f});
    gl->CallList(2);
    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[0], 0);
    gl->BindTexture(GL_TEXTURE_2D, tex[1]);
    blur.setUniform(uDirection, gl::vec2{0.0f, 1.0f});
    gl->CallList(2);
    blur.unbind();
    // заливаем цветом экран там,
    // где в буфере трафарета не выставлен младший бит
    // и есть размытые силуэты объектов
    gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
    gl->Viewport(0, 0, 800, 600);
    gl->BindTexture(GL_TEXTURE_2D, tex[0]);
    gl->Enable(GL_BLEND);
    gl->BlendEquation(GL_FUNC_ADD);
    gl->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    gl->Enable(GL_STENCIL_TEST);
    gl->Disable(GL_DEPTH_TEST);
    gl->StencilFunc(GL_NOTEQUAL, 0x01, 0xff);
    gl->StencilMask(0x00);
    double a = (std::sin(std::fmod(t * 2.0, 6.2832)) + 1.0) * 0.5;
    gl->Color3d(a, a, a);
    gl->CallList(2);
    gl->StencilMask(0xff);
    gl->Disable(GL_STENCIL_TEST);
    gl->Disable(GL_BLEND);
    gl->Enable(GL_DEPTH_TEST);
    gl->Disable(GL_TEXTURE_2D);
////////////////////////////////////////////////////////////////////
    glfwSwapBuffers(window);
  }
gl->DeleteLists(1, 2);
  gl->DeleteFramebuffers(1, &fbo);
  gl->DeleteTextures(2, tex);
У меня не получается корректно его перенести в проект, можешь, пожалуйста, скинуть полный готовый файл?
0
14 / 12 / 2
Регистрация: 22.01.2020
Сообщений: 128
29.11.2022, 08:34
Post-processing

https://www.youtube.com/watch?... -&index=19
1
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
29.11.2022, 12:56
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Post-processing
Отличная серия туториалов у него, но автор темы про неё знает. Он сам приводил в начале темы в сообщении #3 ссылку на видео про обводку из этой серии туториалов:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2022, 12:56

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru