Как нарисовать закрашенный круг на GLSL #version 120
Может у кого-нибудь есть вершинный и фрагментные шейдеры, которые рисуют закрашенный круг в (x, y) с радиусом r ?
В инете есть туториалы, но они для более новых шейдеров и конкретно для glsl #120 я не нашел 🙁
Буду очень признателен, если у кого-нить что-нибудь завалялось.
Заранее спасибо!

Glaciuse
03.10.15 20:40:03 MSK
Что конкретно не получается с glsl 120?
andreyu ★★★★★
( 05.10.15 09:43:16 MSK )

sadlinuxoid
anonymous
( 05.10.15 09:45:05 MSK )

Логика там одна и та же должна быть. Рисуется quad на экране. В шейдеры передаются радиус и координаты центра. Далее во фрагментном шейдере определяется дистанция от текущего пикселя до центра окружности и если она больше радиуса, то делается discard, иначе пишется цвет в gl_FragColor.
Amp ★★★
( 05.10.15 11:47:19 MSK )
Ответ на: комментарий от Amp 05.10.15 11:47:19 MSK

Все, спасибо! Все получилось и как причешу код, выложу сюда для тех, кому понадобиться в будущем.
Всем спасибо!
Glaciuse
( 05.10.15 19:34:04 MSK ) автор топика
нарисовать закрашенный круг на GLSL

Eddy_Em
anonymous
( 05.10.15 19:39:32 MSK )
Ответ на: комментарий от Amp 05.10.15 11:47:19 MSK

#pragma once #include #include #include #include #include #include using std::vector; using std::string; using std::cout; using std::endl; static const char* vertex_shared_src = "\n" "attribute vec2 tex_coords;\n" "varying vec2 _disc_tex_coords;\n" "void main()\n" "\n"; static const char* fragment_shader_src = "\n" "uniform vec4 disc_color;\n" "varying vec2 _disc_tex_coords;\n" "float disc_radius = 1.0f;\n" "\n" "void main()\n" "\n"; class Cell < public: Cell() < load_shaders(); _disc_color = glGetUniformLocation(_program, "disc_color"); >; void draw() < glClearColor(0.2, 0.2, 0.2, 1.0); glUseProgram(_program); glUniform4f(_disc_color, 0.2f, 0.9f, 0.4f, 1.0f); glBindVertexArray(_vao); glDrawArrays(GL_QUADS, 0, 4 * (GLsizei)_cells.size()); glUseProgram(0); >void add_cell(unsigned int x, unsigned int y, unsigned int r) < _CellData cd; cd.x1 = x - r; cd.y1 = y - r; cd.tex_x1 = -1.0f; cd.tex_y1 = -1.0f; cd.x2 = x - r; cd.y2 = y + r; cd.tex_x2 = -1.0f; cd.tex_y2 = 1.0f; cd.x3 = x + r; cd.y3 = y + r; cd.tex_x3 = 1.0f; cd.tex_y3 = 1.0f; cd.x4 = x + r; cd.y4 = y - r; cd.tex_x4 = 1.0f; cd.tex_y4 = -1.0f; _cells.push_back(cd); _bind_buffers(); >private: struct _CellData < GLfloat x1, y1, tex_x1, tex_y1; GLfloat x2, y2, tex_x2, tex_y2; GLfloat x3, y3, tex_x3, tex_y3; GLfloat x4, y4, tex_x4, tex_y4; >; vector _cells; GLuint _program; GLint _disc_color; GLuint _vbo, _vao; void _bind_buffers() < GLchar* pointer = 0; glGenBuffers(1, &_vbo); glGenVertexArrays(1, &_vao); glBindBuffer(GL_ARRAY_BUFFER, _vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(_CellData) * _cells.size() * sizeof(GLfloat), &_cells[0], GL_STATIC_DRAW); glBindVertexArray(_vao); glBindBuffer(GL_ARRAY_BUFFER, _vbo); // 0 - вершины glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 16, pointer); // 16 - размер одной записи x + y + tex_x1 + tex_y1 // 1 - кординаты текстуры glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 16, pointer + 8); // Включаем массив атрибутов для вершин и координат текстур glEnableVertexAttribArray(0); glEnableVertexAttribArrayARB(1); >void load_shaders() < auto vertex_shader_object = glCreateShader(GL_VERTEX_SHADER); auto fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER); glShaderSourceARB(vertex_shader_object, 1, &vertex_shared_src, NULL); glShaderSourceARB(fragment_shader_object, 1, &fragment_shader_src, NULL); glCompileShader(vertex_shader_object); _check_shader_compilation(vertex_shader_object, "vertex"); glCompileShader(fragment_shader_object); _check_shader_compilation(fragment_shader_object, "fragment"); _program = glCreateProgram(); glAttachShader(_program, vertex_shader_object); glAttachShader(_program, fragment_shader_object); glBindAttribLocation(_program, 0, "gl_Vertex"); glBindAttribLocation(_program, 1, "tex_coords"); glLinkProgram(_program); _check_program_link(_program); _get_active_vertex_shader_inputs(_program); >void _check_shader_compilation(GLuint shader_object, string shader_name) < GLint compiled, blen, slen; glGetObjectParameterivARB(shader_object, GL_COMPILE_STATUS, &compiled); if(!compiled) < cout 1) < GLchar* compiler_log = new GLchar[blen]; glGetInfoLogARB(shader_object, blen, &slen, compiler_log); cout exit(1); > > void _check_program_link(GLuint program) < GLint linked; GLint blen, slen; glGetProgramiv(program, GL_LINK_STATUS, &linked); if(!linked) < cout 1) < GLchar* link_log = new GLchar[blen]; glGetInfoLogARB(program, blen, &slen, link_log); cout > > void _get_active_vertex_shader_inputs(GLuint program) < char* name; GLint active_attribs, max_length; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attribs); glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_length); name = new char[max_length + 1]; for(unsigned int i = 0 ; i < active_attribs ; i++) < GLint size; GLenum type; glGetActiveAttrib(program, i, max_length + 1, NULL, &size, &type, name); cout delete [] name; > >;
Glaciuse
( 05.10.15 21:16:05 MSK ) автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Описание алгоритма генерации 2d теней на GLSL (2018)
- Форум fabric.js Нарисовать сектор круга (2021)
- Форум Как нарисовать круг на полях? (2009)
- Форум glsl (2008)
- Форум Как нарисовать круг в Haskell на Gtk ? (2022)
- Форум поддержка glsl 4 (2014)
- Форум GLSL игра без текстур (2018)
- Новости Finnix 120 (2020)
- Новости Firefox 120 (2023)
- Форум Замыкая круг (2023)
Нарисовать круг в C#

Рисование фигур в C# — обычная задача, а рисование кругов — одна из самых простых фигур. Узнайте, как нарисовать круг на C#. В этом сообщении блога мы также покажем вам, как программно закрасить круг цветом с помощью C#.
В этой статье рассматриваются следующие темы:
- Графический API C# для рисования круга
- Нарисовать круг в C#
- Нарисовать заполненный круг в C#
- Круг с рамкой в C#
- Бесплатные учебные ресурсы
Графический API C# для рисования круга#
Мы будем использовать Aspose.Drawing for .NET для рисования круга в C#. Это полностью управляемая кроссплатформенная полноценная библиотека 2D-графики для рисования текста, геометрии и изображений. Он предлагает широкий спектр операций по манипулированию изображениями, включая обрезку, изменение размера, вращение, переворачивание и нанесение водяных знаков. Это делает его идеальным выбором для разработчиков, которым необходимо создавать и редактировать изображения в своих приложениях.
Пожалуйста, загрузите DLL API или установите ее с помощью NuGet.
PM> Install-Package Aspose.Drawing
Нарисовать круг в C##
Мы можем легко нарисовать круг, выполнив следующие действия:
- Создайте экземпляр класса Bitmap.
- Создайте новый объект Graphics из объекта Bitmap, используя метод FromImage().
- Инициализируйте объект класса Pen с указанным цветом и размером.
- После этого вызовите метод DrawEllipse(), чтобы нарисовать круг заданного размера.
- Наконец, сохраните выходное изображение с помощью метода Save().
В следующем примере кода показано, как нарисовать круг на C#.
// Создать новое растровое изображение Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Создайте экземпляр класса Pen Pen pen = new Pen(Color.Red, 5); // Нарисуйте круг graphics.DrawEllipse(pen, 1, 1, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawCircle.jpg");

Нарисуйте заполненный круг в C##
Точно так же мы можем нарисовать закрашенный круг, выполнив следующие шаги:
- Создайте экземпляр класса Bitmap.
- Создайте новый объект Graphics из объекта Bitmap, используя метод FromImage().
- Инициализируйте объект класса SolidBrush указанным цветом.
- После этого вызовите метод FillEllipse(), чтобы нарисовать закрашенный круг.
- Наконец, сохраните выходное изображение с помощью метода Save().
В следующем примере кода показано, как нарисовать закрашенный круг в C#.
// Создать новое растровое изображение Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Создайте экземпляр класса Brush Brush brush = new SolidBrush(Color.Blue); // Нарисуйте заполненный круг graphics.FillEllipse(brush, 1, 1, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawFilledCircle.jpg");

Нарисуйте круг с рамкой в C##
Мы также можем нарисовать закрашенный круг с помощью Broder, выполнив шаги, упомянутые ранее. Мы создадим два круга: внешний круг для границы и внутренний закрашенный круг.
В следующем примере кода показано, как нарисовать круг с рамкой в C#.
// Инициализация объекта класса Bitmap Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Нарисуйте заполненный круг Brush brush = new SolidBrush(Color.Blue); // Нарисуйте заполненный внутренний круг graphics.FillEllipse(brush, 5, 5, 490, 490); // Создайте экземпляр класса Pen Pen pen = new Pen(Color.Red, 10); // Нарисуйте внешний круг graphics.DrawEllipse(pen, 5, 5, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawCircleWithBorder.jpg");

Получите бесплатную лицензию#
Вы можете получить бесплатную временную лицензию, чтобы оценить API на полную мощность.
C# Draw Circle — бесплатные учебные ресурсы#
Вы можете узнать больше о рисовании основных фигур и изучить различные другие функции библиотеки, используя ресурсы ниже:
- Руководство разработчика
- Бесплатные онлайн-приложения
- Справочник по API
- Практические руководства и статьи
Заключение#
В этой статье мы узнали, как нарисовать криклий на C#. Мы также увидели, как нарисовать закрашенный круг и установить его границу программно с помощью Aspose.Drawing for .NET. Используя Aspose.Drawing, вы также можете визуализировать векторную графику, такую как линии, кривые и фигуры, а также текст с различными шрифтами, размерами и стилями, на растровых изображениях. В случае возникновения каких-либо неясностей, пожалуйста, свяжитесь с нами на нашем бесплатном форуме поддержки.
Смотрите также#
- Добавить текст к изображению в C#
- Создать растровое изображение в C#
- Альфа-смешение в C#
- Обрезка изображений в C#
- Графическое программирование на C#
- Aspose.Drawing Product Family
- csharp graphics api
- csharp draw circle
- graphic csharp
- csharp graphics example
- csharp vector graphics
- graphics programming in csharp
- csharp create graphics
- graphics class csharp
- csharp graphics framework
Как нарисовать закрашенный круг в c
Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem
Репутация: нет
Всего: 33
Мне нужна такая же функция как и
| Код |
| imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color ) |
но чтобы не закрашивала этот круг, а делала что-то мое, например, делала этот эллипс черно-белым или негативным — то есть чтоб была возможность пробежаться по пикселя внутри этого круга, делая то, что мне нужно.
В общем, требуется написать эту же функцию (imagefilledellipse), но своими силами.
Мне что-то туго думается, хоть и по геометрии, помнится, было пять
Нарисовать-то круг я смогу — нужно просто пробежаться по радиусу, вычисляя точки синусом и косинусом. А вот чтоб закрасить? Чтоб в двух for циклах пробежаться ТОЛЬКО внутри этих вычисленных точек окружности.
Добавлено @ 00:31
О, кажется нашел что-то тут, что мне поможет:
http://forum.vingrad.ru/index.php?showtopi. st&p=709991
да еще и с размывкой по краям круга! Замечательно!
| Цитата(SelenIT @ 14.3.2008, 01:58) |
| Я ра улез Тру кря ве бе льчиряршобетспо. В тыкро. |
Как нарисовать закрашенный круг в c
если кто не знает SDL, то эта функция ставит точку по заданным координат во 2 и 3 аргументе.
Вся задача в том, что 360 мало для этого цикла. как определить кол-во точек? есть какая-нибудь формула? думаю тут замешан радиус
если окружность радиусом 20, то норм ещё
а вот если например радиус задать 150, то видны пропуски. 

особенно это видно если вызов функции зациклить от 0 до radius и вместо радиуса посылать в функцию i
а должна быть закрашенная область. помогите пожалуйста
Пользователь
Регистрация: 09.10.2012
Сообщений: 15
ну можно к примеру не так рисовать, а по формуле окружности (Wiki).
вырази одну координату и рисуй, смещаясь по другой. Как то так.
Форумчанин
Регистрация: 30.10.2012
Сообщений: 121
2*M_PI*radius — длина окружности
теперь круг получается ровный, а если зациклить опять что-то не то

СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,336
2Murashov
1. sin и cos принимают значения в радианах.
2. рисуй не точки, а полигон.
пс. зачем ты вообще пытаешься «залить» окружность, рисуя кучу более мелких окружностей?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr.
Q: Whats the object-oriented way to become wealthy?
A: Inheritance
Последний раз редактировалось pproger; 31.10.2012 в 19:47 .
Форумчанин
Регистрация: 30.10.2012
Сообщений: 121
Как рисовать полигонами?
Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,792
// Полигоны.cpp: определяет точку входа для приложения. // #include "stdafx.h" #include "Полигоны.h" #include #define MAX_LOADSTRING 100 // Глобальные переменные: . void poly(int n,HDC dc) < double ang=0,x,y,r=200,cx=400,cy=400; POINT *p=new POINT[n]; for(int i=0;iPolygon(dc,p,n); > int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) < . return (int) msg.wParam; >// // ФУНКЦИЯ: MyRegisterClass() // // НАЗНАЧЕНИЕ: регистрирует класс окна. // // КОММЕНТАРИИ: // // Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код // был совместим с системами Win32, не имеющими функции RegisterClassEx' // которая была добавлена в Windows 95. Вызов этой функции важен для того, // чтобы приложение получило "качественные" мелкие значки и установило связь // с ними. // ATOM MyRegisterClass(HINSTANCE hInstance) < WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); >// // ФУНКЦИЯ: InitInstance(HINSTANCE, int) // // НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно. // // КОММЕНТАРИИ: // // В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также // создается и выводится на экран главное окно программы. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) < HWND hWnd; hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) < return FALSE; >ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; > // // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM) // // НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне. // // WM_COMMAND - обработка меню приложения // WM_PAINT -Закрасить главное окно // WM_DESTROY - ввести сообщение о выходе и вернуться. // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) < int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) < case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Разобрать выбор в меню: switch (wmId) : DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); >break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); poly(6,hdc); // TODO: добавьте любой код отрисовки. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); > return 0; > // Обработчик сообщений для окна "О программе". INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) < UNREFERENCED_PARAMETER(lParam); switch (message) < case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) < EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; >break; > return (INT_PTR)FALSE; >
Здесь в poly передавай кол-во сторон и получишь полигон.
Упс, а это не тема про OpenGL или типа нее нестандартные библы?
I’m learning to live.
Последний раз редактировалось Stilet; 31.10.2012 в 20:54 .