287 / 286 / 108
Регистрация: 04.09.2010
Сообщений: 638
1

Буфер трафарета

06.10.2016, 14:18. Показов 2147. Ответов 7
Метки нет (Все метки)

Есть какое-то тело, например, цилиндр, разбитое на треугольники (тесселированное).
Хочу нарисовать только контур тела.
Пытаюсь использовать буфер трафарета:
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
        private void Render()
        {
            //Включаю буфер трафарета
            gl.Enable(OpenGL.GL_STENCIL_TEST);
 
            //Очищаю его
            gl.ClearStencil(0);
            gl.Clear(OpenGL.GL_STENCIL_BUFFER_BIT);
 
            //Заполняю буфер единицами
            gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0);
            gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_REPLACE);
 
            //Отрисовываю
            Render_body();
 
            //Включаю смещение полигонов внурь фигуры
            gl.Enable(OpenGL.GL_POLYGON_OFFSET_FILL);
            gl.PolygonOffset(2f, 2f);
 
            //Заполняю буфер двойками
            gl.StencilFunc(OpenGL.GL_ALWAYS, 2, 0);
            gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_REPLACE);
 
            //Отрисовываю
            Render_body();
 
            //Очищаю буфер цвета и глубины
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 
            //Отключаю смещение
            gl.Disable(OpenGL.GL_POLYGON_OFFSET_FILL);
 
            //Указываю, что рисовать надо только там, где в трафарете единицы (т.е. внешние очертания)
            gl.StencilFunc(OpenGL.GL_EQUAL, 1, 255);
 
            //Назначаю цвет и рисую
            gl.Color(colorEdgeDefault);
            Render_body();
 
            //Отключаю буфер трафарета
            gl.Disable(OpenGL.GL_STENCIL_TEST);
        }
На выходе получаю полностью залитый цилиндр.
Что у меня неправильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2016, 14:18
Ответы с готовыми решениями:

Буфер трафарета для сцены с несколькими объектами
Сделать вырез в фигуре с использованием буфера трафарета несложно, в сети примеров хватает. Но...

Как выбрать какую часть в поверхности рисовать через буфер трафарета (Stencil Buffer)?
Как описывают это разные источники, чтобы пометить что-то в буфере трафарета, нужно отключить...

Плоское зеркало с использованием буфера трафарета
Привет всем! Подскажите где найти пример исходника плоского зеркала с исполтзованием буфера...

Как сделать видимым только часть изображения посредством трафарета SVG
Здравствуйте! Делаю сайт, в процессе возникла проблема: Нужно сделать изображение, по...

7
287 / 286 / 108
Регистрация: 04.09.2010
Сообщений: 638
06.10.2016, 16:49  [ТС] 2
Упс...
Я, оказывается, неправильно понимал, что такое PolygonOffset (как выяснилось, это смещение относительно камеры )
Мне ведь что нужно.
Если взять тот-же цилиндр, то отрисовать линии перегиба криволинейной поверхности.
Буфер трафарета
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
07.10.2016, 09:53 3
Цитата Сообщение от kesean Посмотреть сообщение
Хочу нарисовать только контур тела.
Нарисовать на чёрном фоне белое тело, потом применить фильтр постобработки Edge detection.
Цитата Сообщение от kesean Посмотреть сообщение
Если взять тот-же цилиндр, то отрисовать линии перегиба криволинейной поверхности.
Нарисовать на чёрном фоне цилиндр в цветах нормалей треугольников, потом применить фильтр постобработки Edge detection.
Разумеется, нужны шейдеры
1
1209 / 612 / 76
Регистрация: 01.10.2012
Сообщений: 2,947
07.10.2016, 10:41 4
Цитата Сообщение от kesean Посмотреть сообщение
Мне ведь что нужно.
Если взять тот-же цилиндр, то отрисовать линии перегиба криволинейной поверхности.
В терминах 3D это "unshared edges". Это легко делается на CPU. Строите ребра
C++
1
2
3
4
struct Edge {
  int v0, v1;   // индексы вертексов
  int f0, f1;   // индексы фейсов (f1 может быть -1) 
};
Если теперь отрисовать все ребра - получите тот же wireframe. Для отрисовки "outline" (так называется эта задача) нужно рисовать не все ребра, а лишь те у которых

1) f1 == -1 (край поверхности)
2) z нормалей фейсов f0 и f1 имеют разные знаки в камере

НО, насколько мне известно, это решение не портируется на GPU/GLSL. В последнее время неск раз пробовал поднять здесь эту тему. Молчат знатоки...
1
2519 / 1326 / 220
Регистрация: 26.02.2009
Сообщений: 6,135
Записей в блоге: 5
07.10.2016, 11:34 5
http://steps3d.narod.ru/tutori... orial.html
Ниже приводится фрагментный шейдер реализующий эффект edge-detect для NPOT-текстуры.
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uniform sampler2DRect mainTex;
 
void main (void)
{
    const vec3  luminance  = vec3 ( 0.3, 0.59, 0.11 );
    const vec2  d01        = vec2 ( 0.0, 1.0 );
    const vec2  d10        = vec2 ( 1.0, 0.0 );
    const float scale      = 2.5;
    
    float c1 = dot ( luminance, texture2DRect ( mainTex, gl_TexCoord [0].xy + d01 ).rgb );
    float c2 = dot ( luminance, texture2DRect ( mainTex, gl_TexCoord [0].xy - d01 ).rgb );
    float c3 = dot ( luminance, texture2DRect ( mainTex, gl_TexCoord [0].xy + d10 ).rgb );
    float c4 = dot ( luminance, texture2DRect ( mainTex, gl_TexCoord [0].xy - d10 ).rgb );
 
    gl_FragColor = vec4 ( vec3 ( scale * ( abs ( c1 - c2 ) + abs ( c2 - c3 ) ) ), 1.0 );
}
Ещё пример для DS
1
1209 / 612 / 76
Регистрация: 01.10.2012
Сообщений: 2,947
07.10.2016, 11:43 6
Цитата Сообщение от snake32 Посмотреть сообщение
http://steps3d.narod.ru/tutorials/npot-tutorial.html
Опять "ссылка рулит". А ведь решения "на уровне пикселей" - это уже второй (или третий) сорт, что это за трехмерщик если не может сделать геометрией?
0
2519 / 1326 / 220
Регистрация: 26.02.2009
Сообщений: 6,135
Записей в блоге: 5
07.10.2016, 12:03 7
Цитата Сообщение от Igor3D Посмотреть сообщение
решения "на уровне пикселей" - это уже второй (или третий) сорт
С точки зрения производительности видеокарты именно этот "сорт" становится высшим, а последовательное перебирание фейсов на CPU в одном потоке - низшим, к тому же зависит от сложности геометрии
0
287 / 286 / 108
Регистрация: 04.09.2010
Сообщений: 638
07.10.2016, 12:05  [ТС] 8
Всем спасибо, конечно. Но я использую .Net обертку SharpGL, и как там можно использовать шейдеры нигде не могу найти.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2016, 12:05

Записать символ в буфер клавиатуры, проверить буфер на наличие в нём символов, и вывести данный символ
Доброго дня всем. Прошу помочь немного с несложной задачей, на использование прерывания INT 16h....

Буфер
Использую функции ReadFile, WriteFile. 1. Можно вместо char массива, другие переменные...

Z-буфер
Подскажите пожалуйста как отключить Z-буфер в OpenGL

Буфер
Здравствуйте. Хочу задать такой наверное смешной вопрос. Можно ли сделать в С# как бы маленький...


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

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

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