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

Вывод квадрата шейдерами не работает

22.09.2021, 21:26. Показов 2082. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Был вот такой код для рисования треугольника по центру окна игры

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const char* vertexShaderSource =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
"   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
 
const char* fragmentShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
 
unsigned int shaderProgram;
unsigned int VBO, VAO;
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
// shaders initialization
 
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
 
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
 
shaderProgram = glCreateProgram();
 
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
 
glLinkProgram(shaderProgram);
 
glDetachShader(shaderProgram, vertexShader);
glDeleteShader(vertexShader);
 
glDetachShader(shaderProgram, fragmentShader);
glDeleteShader(fragmentShader);
 
float vertices[] =
{
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
};
 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
 
glBindVertexArray(VAO);
 
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
 
glBindBuffer(GL_ARRAY_BUFFER, 0);
 
glBindVertexArray(0);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// drawing
 
int currentShader, currentVertexArray;
 
glGetIntegerv(GL_CURRENT_PROGRAM, &currentShader);
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &currentVertexArray);
 
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
 
glBindVertexArray(currentVertexArray);
glUseProgram(currentShader);
Он вполне хорошо работал, но мне был нужен квадрат. Благо в том же уроке на сайте learnopengl.com есть пример как сделать чтобы рисовался квадрат. Я попробовал переделать этот код и вот что у меня получилось.

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
// shaders initialization
 
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
 
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
 
shaderProgram = glCreateProgram();
 
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
 
glLinkProgram(shaderProgram);
 
glDetachShader(shaderProgram, vertexShader);
glDeleteShader(vertexShader);
 
glDetachShader(shaderProgram, fragmentShader);
glDeleteShader(fragmentShader);
 
float vertices[] =
{
     0.5f,  0.5f, 0.0f,  // top right
     0.5f, -0.5f, 0.0f,  // bottom right
    -0.5f, -0.5f, 0.0f,  // bottom left
    -0.5f,  0.5f, 0.0f   // top left 
};
 
// note that we start from 0
unsigned int indices[] =
{
    0, 1, 3,  // first Triangle
    1, 2, 3   // second Triangle
};
 
glGenVertexArrays(1, &VAO);
 
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
 
glBindVertexArray(VAO);
 
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
 
glBindBuffer(GL_ARRAY_BUFFER, 0);
 
glBindVertexArray(0);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// drawing
 
int currentShader, currentVertexArray;
 
glGetIntegerv(GL_CURRENT_PROGRAM, &currentShader);
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &currentVertexArray);
 
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
 
glBindVertexArray(currentVertexArray);
glUseProgram(currentShader);
Я вроде бы все правильно переписал, но почему-то квадрат не выводится. В чем может быть моя ошибка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2021, 21:26
Ответы с готовыми решениями:

Не работает пример с шейдерами Франка D. Luna
Возникла такая ситуация: не работает пример из книги Франка Д. Луна из части 3 главы 16 о...

Не работает пример с шейдерами Франка D. Luna
Что-то не работает пример из книги Франка Д. Луна из части 3 главы 16 о шейдерах в проекте все...

Считываение размера стороны квадрата и вывод этого квадрата в виде звездочек
Помогите усовершенствовать программу: программа считывает размер стороны квадрата и затем выводит...

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите, пожалуйста, программу, через процедуру, максимально просто в PascalABC.net.

18
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:30  [ТС] 2
Вот как раньше рисовался треугольник. При попытке вывести квадрат ничего вообще не рисуется.
Миниатюры
Вывод квадрата шейдерами не работает  
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:32  [ТС] 3
В тред призывается великий и ужасный zayats80888
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
22.09.2021, 21:41 4
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
В чем может быть моя ошибка?
На первый взгляд ошибки не вижу. Возможно дело в состояниях GL.
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:41 5
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
Упрощается до
glSlang
1
gl_Position = vec4(aPos, 1.0f);
Можно было не заморачиваться на индексы и нарисиовать либо TRIANGLE_STRIP добавив одну вершину, либо 2 треугольника добавив 3 вершины
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:42  [ТС] 6
alecss131, Я весь этот код взял с сайта learnopengl.com
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:42 7
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Индексы у вас по часовой стрелке, если включено отбраковывание, то они и отбракуются
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:44  [ТС] 8
Цитата Сообщение от zayats80888 Посмотреть сообщение
На первый взгляд ошибки не вижу. Возможно дело в состояниях GL.
Треугольник прекрасно рисовался (не знаю, важно ли это, но там glDrawArrays), но вот когда я переделал под рисование квадрата (glDrawElements) то все перестало рисоваться

Добавлено через 42 секунды
alecss131, Что за отбраковывание и как его выключить?
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:45 9
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

eXpl01TeR, если в коде игры есть вот такие строчки
C++
1
2
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
то все треугольники по часовой стрелке отбрасываются
1
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
22.09.2021, 21:45 10
eXpl01TeR, см. пост №7. 90% даю, alecss131 верно наванговал.
1
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:47 11
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
C++
1
2
3
4
5
unsigned int indices[] =
{
 0, 1, 3, // first Triangle
 1, 2, 3 // second Triangle
};
Попробуйте заменить на
C++
1
2
3
4
5
unsigned int indices[] =
{
 3, 1, 0, // first Triangle
 3, 2, 1 // second Triangle
};
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:48  [ТС] 12
zayats80888, alecss131, Да, Вы правы. glDisable(GL_CULL_FACE) помогло. Но я опять возвращаюсь к проблеме когда мне нужно запоминать состояния игры, выставлять свои и возвращать игровые. Разве нет какой-то штучки чтобы можно было рисовать куда-то как-бы в свой буфер что-ли, а потом его накладывать на игру? Чтобы не приходилось играться с этими состояниями.
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:51 13
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Разве нет какой-то штучки чтобы можно было рисовать куда-то как-бы в свой буфер что-ли, а потом его накладывать на игру?
Нету, все состояния глобальные. Например imgui сохраняет и восстанавливает состояния в процессе своей работы
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 21:52  [ТС] 14
alecss131, Но ведь это же треш, как-то не верится что ImGUI делает каждый кадр вызовы glGet для получения информации о состояниях и потом их восстанавливает..
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 21:58 15
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
не верится что ImGUI делает каждый кадр вызовы glGet для получения информации о состояниях и потом их восстанавливает
Исходники говорят за себя, я их прилично перелопачивал и изучал

Думаю как вариант можно попробовать создать свой контекст, дочерний от основного и рисовать в нем, тогда будет минимум переключений состояний, но надо будет менять контексты. Могу ошибаться, но вроде глобальные состояния работают только в пределах контекста
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 22:03  [ТС] 16
Цитата Сообщение от alecss131 Посмотреть сообщение
но надо будет менять контексты
Ой не-не-не, спасибки, заяц80888 помнит думаю как я его задалбывал проблемой с мерцающими контекстами, которая так и не решилась, да и FPS такой способ пожирает немало. Думаю, буду сохранять / вырубать нужное по мере необходимости. Спасибо ещё раз за помощь.

Не по теме:

У Вас случайно нету тележки, чтобы я каждый раз тред отдельный не создавал?)

0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
22.09.2021, 22:04 17
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Но ведь это же треш, как-то не верится что ImGUI делает каждый кадр вызовы glGet для получения информации о состояниях и потом их восстанавливает..
Это действительно треш и так никто не делает в своём коде. Обычно поддерживают инвариант состояний(это просто) или пишут свой "движок" состояний с кэшированием последних и переходов между ними(это чуть сложнее).
alecss131 тут немного не точен, дело в том, что ImGUI предлагает легко встраиваемый бэкэнд, который будет работать в произвольном окружении. Я в своём коде этот бэкэнд не использую(вырезал только нужное мне и сам всё контролирую).
Ну а ты работаешь в чужом окружении, где не имеешь такого контроля, так что страдай.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
22.09.2021, 22:09  [ТС] 18

Не по теме:

alecss131, zayats80888, У меня есть еще несколько вопросов по OpenGL, я могу их тут задать?



Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
инвариант состояний
Что это? (хотя-бы как загуглить)

Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
так что страдай
Заставлю страдать пользователя вместе со мной, вместе будет легче
0
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,730
Записей в блоге: 2
22.09.2021, 22:10 19
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
я могу их тут задать?
В правилах один вопрос = 1 тема
0
22.09.2021, 22:10
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2021, 22:10
Помогаю со студенческими работами здесь

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите код в C++ Пожалуйста :confusion:

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Помогите решить задачу на питоне

VBO c 2 шейдерами
Здравствуйте Противный баг из тех что жрут неск дней и больше. Рендерю с использованием шейдеров...

Проблема с шейдерами на андроиде
Столкнулся с проблемой с шейдерами. В Editor всё работает отлично когда модель за объектом с...

Вывод квадрата
есть программа, которая выводит квадрат по координатам вот ее часть: mov ax,0B800h; содержимое...

Передача int между шейдерами
const char *vertexShaderSource = "#version 430 core\n" "layout(location = 0) in vec2...

Как работать с шейдерами в DX9?
Помогите разобраться с шейдерами для DX9, как прикрутить к моему коду какой-нибудь шейдер? ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Почему при инициализации массива 3х3х3 будет создано 13 одномерных массивов?
Alexander-7 16.01.2025
При инициализации многомерного массива, в данном случае трехмерного массива размерностью 3x3x3, может возникнуть путаница относительно того, как структура данных организована в памяти. Общее число. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru