Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
infobos
Строитель
455 / 72 / 4
Регистрация: 18.06.2010
Сообщений: 499
1

OpenGL рисование с VBO пример кода на голом WinAPI

09.05.2017, 07:30. Просмотров 635. Ответов 9
Метки нет (Все метки)

Изучение VBO оказалось муторным занятием, хотя опытные программисты говорят, что от массива вершин отличается только добавлением некоторых строчек кода. Я только в двух книгах нашел описание VBO: Алексей боресков Расширение OpenGL и OpenGL Супер книга.

С какими трудностями можно столкнуться:
1. Коды типа: glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); просто так работать не будут.
2. Сами функции необходимо вытаскивать. Откуда пока не понял, то ли с драйверов видеокарты. То есть Вам функции работы с видеокартой никто не преподнес в голубой коемочке. Тут не достаточно подключить библиотеку.
3. Сами функции работы с видеокартой могут не работать – это нужно проверять.

Объявление функций как переменные:
C++
1
2
3
PFNGLGENBUFFERSPROC    glGenBuffers     = NULL;
PFNGLBINDBUFFERPROC    glBindBuffer     = NULL;
//… итак далее для каждой функции…
Инициализация функций(получаем адрес функции), выполнить один раз после создания окна
C++
1
2
3
4
5
6
7
8
    glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
    if(glGenBuffers == NULL) MessageBoxA(0, "Не удалось получить адрес функции < glGenBuffers >","Ошибка", MB_ICONERROR);
 
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
    if(glBindBuffer == NULL) MessageBoxA(0, "Не удалось получить адрес функции < glBindBuffer >","Ошибка", MB_ICONERROR);
 
//… итак далее для каждой функции…
//Конечно, существуют более сложные построения, но я вытащил из сложного, чтобы показать простое решение.
Для того, чтобы работали (PFNGLGENBUFFERSPROC, PFNGLBINDBUFFERPROC и т.д.) Необходимо подключить: #include "glext.h"

В общем, с инициализацией функций для WinAPI разобрался.
Осталось сама реализация по этим функциям.

C++
1
2
3
4
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//…и так далее…
В интернете много статей где описывается рисование VBO, но нет готового маленького кода, содержащий только VBO.

Прошу помощи:
1. Пример кода по загрузке данных в видеокарту (полностью со сборкой массива загрузки) один полигон.
2. Запуск рисования на видеокарте

Прошу не кидать обрывки кода, этого добра хватает … Нужно правильное построение кода друг за другом.

Добавлено через 51 минуту
Вот пример кода: http://www.gamedev.ru/code/forum/?id=176369
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2017, 07:30
Ответы с готовыми решениями:

Чем отличается разработка на голом opengl и на движке, например, unity 3d?
Чем отличается разработка на голом opengl и на движке, например, unity 3d?

Пример использования VAO + VBO
Добрый день. Поделитесь примером использования VAO + VBO, которые реализованы не на WinAPI....

WinApi рисование линии
Доброго времени суток . Начинаю изучать winapi . Хочу узнать как нарисовать линию по диагонали...

WinAPI+openGL
Как инициализировать окно созданное с помощью WinAPI для работы с opengl, как сделать чтобы...

WinAPI+OpenGL
вообщем интересует связка WinAPI+OpenGL, ну как инициализируется окно и т.п., хочется материал на...

9
vxg
Модератор
3286 / 2081 / 329
Регистрация: 13.01.2012
Сообщений: 8,103
09.05.2017, 09:49 2
infobos например так - рисует ] - это GLUT - оконную процедуру мне делать сегодня неохота - сути это не меняет
Кликните здесь для просмотра всего текста
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
#include <windows.h>
#include <gl\gl.h>
#include <gl\glut.h>
#include "glext.h"
 
//глобальные переменные
 
static GLint width = 500; //ширина экрана
static GLint height = 500; //высота экрана
 
//VBO
 
//------------------------------------------------------------------------------
bool vbo_enabled = false;
//------------------------------------------------------------------------------
PFNGLGENBUFFERSARBPROC glGenBuffersARB = 0;                     // VBO Name Generation Procedure
PFNGLBINDBUFFERARBPROC glBindBufferARB = 0;                     // VBO Bind Procedure
PFNGLBUFFERDATAARBPROC glBufferDataARB = 0;                     // VBO Data Loading Procedure
PFNGLBUFFERSUBDATAARBPROC glBufferSubDataARB = 0;               // VBO Sub Data Loading Procedure
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = 0;               // VBO Deletion Procedure
PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = 0; // return various parameters of VBO
PFNGLMAPBUFFERARBPROC glMapBufferARB = 0;                       // map VBO procedure
PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = 0;                   // unmap VBO procedure
//------------------------------------------------------------------------------
template <class type>
static type wgl_get_proc_address(type, char *name)
{
    return (type)wglGetProcAddress(name);
}
//------------------------------------------------------------------------------
#define WGL_GET_PROC_ADDRESS(name)\
name = wgl_get_proc_address(name, #name);
//------------------------------------------------------------------------------
void gl_ext_init(void)
{
    WGL_GET_PROC_ADDRESS(glGenBuffersARB)
    WGL_GET_PROC_ADDRESS(glBindBufferARB)
    WGL_GET_PROC_ADDRESS(glBufferDataARB)
    WGL_GET_PROC_ADDRESS(glBufferSubDataARB)
    WGL_GET_PROC_ADDRESS(glDeleteBuffersARB)
    WGL_GET_PROC_ADDRESS(glGetBufferParameterivARB)
    WGL_GET_PROC_ADDRESS(glMapBufferARB)
    WGL_GET_PROC_ADDRESS(glUnmapBufferARB)
 
    vbo_enabled =
    glGenBuffersARB &&
    glBindBufferARB &&
    glBufferDataARB &&
    glBufferSubDataARB &&
    glDeleteBuffersARB &&
    glGetBufferParameterivARB &&
    glMapBufferARB &&
    glUnmapBufferARB;
}
//------------------------------------------------------------------------------
 
//GL-функции
 
int v_count = 4; //кол-во вершин
float v_array[] = {0,0,0,  1,0,0,  1,1,0,  0,1,0}; //вершины
GLuint vbo_id;
 
void Display(void)
{
    glClearColor(0, 0, 0, 1);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
 
    glColor3f(1, 1, 1);
 
    /*glBegin(GL_LINE_STRIP);
        glVertex3f(0,0,0);
        glVertex3f(1,0,0);
        glVertex3f(1,1,0);
        glVertex3f(0,1,0);
    glEnd();*/
 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_id);
    glVertexPointer(3, GL_FLOAT, 0, 0);
    glDrawArrays(GL_LINE_STRIP, 0, v_count);
 
    glFlush();
    glutSwapBuffers();
}
 
void Reshape(GLint width, GLint height)
{
    ::width = width;
    ::height = height;
 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 5, -5, 5, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("test");
 
    glEnable(GL_DEPTH_TEST);
    glEnableClientState(GL_VERTEX_ARRAY);
 
    gl_ext_init();
    if (!vbo_enabled) return -1;
 
    glGenBuffersARB(1, &vbo_id);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_id);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, v_count * 3 * sizeof(float), v_array, GL_STATIC_DRAW_ARB);
 
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutMainLoop();
 
    glDeleteBuffersARB(1, &vbo_id);
 
    return 0;
}

Не по теме:

знаете, есть двойные фамилии, например, Мамин-Сибиряк... вам бы подошел двойной ник, что-нибудь вроде Тантал-Чак Норрис..

1
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,132
Записей в блоге: 87
09.05.2017, 09:52 3
Эту библиотеку пока не смотрели? The OpenGL Extension Wrangler Library
1
infobos
Строитель
455 / 72 / 4
Регистрация: 18.06.2010
Сообщений: 499
09.05.2017, 13:47  [ТС] 4
vxg, а Ваш код хоть работает? Он без индексов может разве работать? Нужно же еще прописать последовательность рисования вершин.

Добавлено через 1 минуту
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Эту библиотеку пока не смотрели? The OpenGL Extension Wrangler Library
Не смотрел.
0
09.05.2017, 13:47
vxg
Модератор
3286 / 2081 / 329
Регистрация: 13.01.2012
Сообщений: 8,103
09.05.2017, 13:53 5
infobos, работает
1
infobos
Строитель
455 / 72 / 4
Регистрация: 18.06.2010
Сообщений: 499
09.05.2017, 18:42  [ТС] 6
Вот пример кода: http://pmg.org.ru/nehe/nehe45.htm
0
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,132
Записей в блоге: 87
10.05.2017, 08:45 7
Цитата Сообщение от infobos Посмотреть сообщение
Не смотрел.
Все эти либы: GLEW, GLAD, glLoadGen, glsdk, glbinding, libepoxy (краткое описание либ OpenGL Loading Library) - делают одно и тоже, а именно, в реальном времени загружают указатели на функции. Минус такого подхода, что нужно таскать с собой либу. Плюс: в том, что не нужно тратить время на формирования списка нужных функций и define'ов. Если вручную описывать, то это может затормозить обучение OpenGL. Но с другой стороны, будет большее понимание, откуда берутся константы и функции.
0
Igor3D
1228 / 595 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
10.05.2017, 09:38 8
Цитата Сообщение от 8Observer8 Посмотреть сообщение
а именно, в реальном времени загружают..
говорят "в run-time"
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Но с другой стороны, будет большее понимание, откуда берутся константы и функции.
В какой-то мере да, низкоуровневое API дисциплинирует. Но в гораздо большей степени это куча хлама бесполезно забивающего голову программиста. К тому же только для одной платформы.

Цитата Сообщение от infobos Посмотреть сообщение
Вот пример кода: http://www.gamedev.ru/code/forum/?id=176369
Цитата Сообщение от infobos Посмотреть сообщение
Вот пример кода: http://pmg.org.ru/nehe/nehe45.htm
Не понял, это Вы показываете эталон, к которому надо стремиться? Ну первый вообще нерабочий, к тому же с GLUT - разве он часть WinAPI? К тому же уже неск лет deprecated. Второй тоже не блещет, glVertexPointer и.т.п. уже неск лет как сдано в архив, сейчас "все на шейдерах". Ну и главное - где компилируемый проект? Это надо лазить выцарапывать кусочки копи-пастой, создавать с нуля проект, наполнять его - та нафиг такие примеры нужны?

Цитата Сообщение от infobos Посмотреть сообщение
Изучение VBO оказалось муторным занятием
Ну если так "упереться рогом", вот "дайте мне все готовое" - то конечно муторным
0
infobos
Строитель
455 / 72 / 4
Регистрация: 18.06.2010
Сообщений: 499
10.05.2017, 14:01  [ТС] 9
Цитата Сообщение от Igor3D Посмотреть сообщение
В какой-то мере да, низкоуровневое API дисциплинирует. Но в гораздо большей степени это куча хлама бесполезно забивающего голову программиста. К тому же только для одной платформы.
Вот Вам тема для беседы по WinAPI и Windows: Голосование и обсуждение профессионального программирования под Windows

Добавлено через 12 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Не понял, это Вы показываете эталон, к которому надо стремиться? Ну первый вообще нерабочий, к тому же с GLUT - разве он часть WinAPI? К тому же уже неск лет deprecated. Второй тоже не блещет, glVertexPointer и.т.п. уже неск лет как сдано в архив, сейчас "все на шейдерах". Ну и главное - где компилируемый проект? Это надо лазить выцарапывать кусочки копи-пастой, создавать с нуля проект, наполнять его - та нафиг такие примеры нужны?
Моя цель расширить кругозор и все проверить. Иначе все изучение строится на том, что необходимо знать предыдущее. Не зная предыдущего трудно понять новое. В целом нужно знать историю всего OpenGL. Вы же ее знаете и проходили этот путь. del
 Комментарий модератора 
Будьте более вежливым
0
infobos
Строитель
455 / 72 / 4
Регистрация: 18.06.2010
Сообщений: 499
18.05.2017, 06:02  [ТС] 10
Вот исходник проекта, где используется VBO. Используется Голый WinAPI
Написано на Visual Studio 2012. Запускать файл Win32Project1.sln
Два варианта:
1. (Тест VBP) Для каждого массива (цвет, координаты текстур и вершины).
2. (Тест VBO - большой массив) Объединение массива для трех атрибутов.

У кого не сработает, может быть, что видеокарта не поддерживает VBO, либо как у меня по техническим требованиям поддерживает, а в реальности не работает - это подтверждается другими проектами с VBO.

На ноутбуках с началом Windows 8 работает VBO.
0
Вложения
Тип файла: rar Тест VBO.rar (7.44 Мб, 6 просмотров)
Тип файла: rar Тест VBO - большой массив.rar (7.40 Мб, 3 просмотров)
18.05.2017, 06:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2017, 06:02

OpenGL, WinAPI
Здраствуйте, вообщем перейду сразу к делу, есть программа написанная на C++, хранение и...

Рисование графиков функций в WinApi
Доброе время суток. Я начинающий программист хочу попросить помощи у вас собратьев. Написал код ,а...

Рисование отрезков с использованием WinApi
Вот программка рисующая отрезки с разными стилями, цветами и т.д. но при манипуляциях с окном...


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

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

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