Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 2

OpenGl в C++Builder - 3D графика одновременно в нескольких окнах

18.12.2015, 15:15. Показов 2731. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь. Есть задача отобразить 3D графику одновременно в нескольких окнах (формах).
В одном окне получается без проблем. Когда создаю второе окно, и там записываю аналогичный код, но с другим описанием сцены, то графика пропадает в обоих окнах. Может кто-то сталкивался с такой проблемой? Подозреваю что это связано с инициализацией, но как решить проблему не знаю.
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
 
#include "math.h"
#include <stdio.h>   // заголовочный файл для стандартного ввода/вывода(добавлено)
#include <stdarg.h>  // заголовочный файл для манипуляций
                     // с переменными аргументам
 
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
 
//-----
 
 
HDC DC; //Дескриптор
HGLRC HRC;
 
 
//---------------------------------------------------------------------------
//установка формата пикселя
GLvoid SetDCPixelFormat(GLvoid)
{
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL;
    int nPixelFormat = ChoosePixelFormat(DC,&pfd);
    SetPixelFormat(DC, nPixelFormat, &pfd);
}
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
 
    DC = GetDC(Form2->Handle);
    SetDCPixelFormat();
    HRC = wglCreateContext(DC);
    wglMakeCurrent(DC,HRC);
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glEnable(GL_DEPTH_TEST); //Буффер глубины включается
 
    glEnable(GL_NORMALIZE); //Разрешение нормализации нормалей
 
    glEnable(GL_TEXTURE_2D); // Разрешение наложение текстуры
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm2::FormResize(TObject *Sender)
{
    glViewport(0, 0, Form2->ClientWidth, Form2->ClientHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    //Ортогональная проекция
    //glOrtho(-1100,1100, -1100,1100, -1200,1200);
    //glOrtho(vLeft, vRight, vBottom, vTop, vNear-расстояние от наблюдателя до плоскости екрана, vFar-расстояние от наблюдателя до задней плоскости сцены);
 
    //Перспективная проекция
    gluPerspective(45.0f, (GLfloat)Form2->Width / (GLfloat)Form2->Height, 1.0f, 1000000.0f);
    /*задаем перспективу gluPerspective(30. 0, // угол видимости в направлении оси Y
    ClientWidth / ClientHeight, // угол видимости в направлении оси X
    1 0, // расстояние от наблюдателя до ближней плоскости отсечения
    15. 0); // расстояние от наблюдателя до дальней плоскости отсечения */
 
    // Второй вариант задания перспективы
    //glFrustum (vLeft, vRight, vBottom, vTop, vNear-расстояние от наблюдателя до плоскости екрана, vFar-расстояние от наблюдателя до задней плоскости сцены);
 
    glMatrixMode(GL_MODELVIEW);
 
       glShadeModel(GL_SMOOTH);                // Включить плавное затенение
       glClearColor(0.7f, 0.7f, 1.0f, 0.5f);   // фон
       glClearDepth(1.0f);                     // Настройка буфера глубины
       glEnable(GL_DEPTH_TEST);                // Разрешить проверку глубины
       glDepthFunc(GL_LEQUAL);                 // Тип проверки глубины
       
       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
    wglMakeCurrent(0,0);
    wglDeleteContext(HRC);
    ReleaseDC(Handle,DC);
    DeleteDC(DC);
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm2::FormPaint(TObject *Sender)
{
//RenderScene();
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2015, 15:15
Ответы с готовыми решениями:

OpenGL Отрисовка в нескольких окнах
Добрый день как рисовать в одном проекте на нескольких формах разные сцены 3D. Как правильно создать контекст чтобы это всё работало. При...

Статическая графика в окнах Windows
- Создать окно Windows. В заголовок окна записать свои данные: имя, фамилию и название рисунка. - Используя функции из библиотеки...

Статическая графика в окнах Windows
- Создать окно Windows. В заголовок окна записать свои данные: имя, фамилию и название рисунка. - Используя функции из библиотеки...

2
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 2
14.04.2016, 13:07  [ТС]
Перерыл весь интернет, но так и не нашел решения. Решил свою проблему сам "методом тыка". Вроде все получилось. Можно выводить и в два окна, и больше. Пробовал выводить в три - работает. Во вложении пример демо-программки. Может кому-то типа меня пригодится.
Вложения
Тип файла: rar OpenGL-1.rar (7.79 Мб, 63 просмотров)
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2016, 13:34
Цитата Сообщение от danzas2 Посмотреть сообщение
Перерыл весь интернет, но так и не нашел решения. Решил свою проблему сам "методом тыка".
Ну откуда ему в инете взяться если этот твой метод тыка черным по белому в референсе по OpenGL описан?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2016, 13:34
Помогаю со студенческими работами здесь

Запуск нескольких команд в отдельных окнах параллельно
Здравствуйте. Имеются несколько команд например: ping mail.ru -t ping i.ua -t tracert google.com ping yandex.ru -t Как...

Графика. Нарисовать в трех окнах случайные окружности
помогите плиз создать программу, рисующую в трех окнах, заданных случайным образом, случайные окружности. Выход по нажатию любой...

Запрет одновременно просматривать определенную страницу сайта в двух окнах или также с двух компов
как запрет одновременно просматривать определенную страницу сайта в двух окнах или также с двух компов


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru