Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
3 / 5 / 0
Регистрация: 09.12.2012
Сообщений: 104
1

Графика OpenGL в компоненте TPanel

26.10.2015, 00:23. Показов 1103. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчане!

В связи с тем, что в Builder 6 я не смог реализовать 3д графику через OpenGL, пришлось ставить Embarcadero RAD Studio XE. Для нее нашел примерчик в интернете - попробовал ... все заработало. Но вот что-то текстуры никак не удалось подгрузить.

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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//---------------------------------------------------------------------------
 
#include <vcl.h>
 
// Подключаем библиотеки
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
 
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
HGLRC ghRC;
HDC ghDC;
 
void Draw();
 
BOOL bSetupPixelFormat(HDC hdc)
{
    PIXELFORMATDESCRIPTOR pfd,*ppfd;
    int pixelformat;
    ppfd=&pfd;
    ppfd->nSize=sizeof(PIXELFORMATDESCRIPTOR);
    ppfd->nVersion=1;
    ppfd->dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask=PFD_MAIN_PLANE;
    ppfd->iPixelType=PFD_TYPE_RGBA;//формат указания цвета. Может принимать значения
    // PFD_TYPE_RGBA (цвет указывается четырьмя параметрами
    //RGBA - красный, зленный, синий и альфа) и PFD_TYPE_COLORINDEX (цвет указывается
    // индексом в палитре).
    ppfd->cColorBits=16;//глубина цвета
    ppfd->cDepthBits=16;//размер буфера глубины (Z-Buffer)
    ppfd->cAccumBits = 0;
    ppfd->cStencilBits = 0;//размер буфера трафарета (мы его пока не используем)
    // ЧузПикселФормат подбирает формат пикселей, максимально удовлетворяющий нашим требованиям,
    // и возвращает его дескриптор, а SetPixelFormat() устанавливает его в контексте устройства
    // (dc).
    if ((pixelformat=ChoosePixelFormat(hdc,ppfd)) == 0)
    {
        return FALSE;
    }
    if (SetPixelFormat(hdc,pixelformat,ppfd) == FALSE)
    {
        return FALSE;
    }
    return TRUE;
}
//...
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
    glViewport(0,0,Panel1->Width,Panel1->Height);
    //glViewport(0,0,300,300);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5,5,-5,5,2,12);
    gluLookAt(0,0,5,0,0,0,0,1,0);
    glMatrixMode(GL_MODELVIEW);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    {
        ghDC = GetDC(Panel1->Handle);
        //ghDC = GetDC(Handle);
        if (!bSetupPixelFormat(ghDC))
            Close();
        //После того как в контексте устройства установлен формат пикселей, нужно создать
        // контекст воспроизведения (Rendering Context) для этого в OpenGL определены
        //следующие функции:
        //HGLRC wglCreateContext(HDC hdc);
        //BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc);
        ghRC = wglCreateContext(ghDC);
        wglMakeCurrent(ghDC, ghRC);
        glClearColor(0.0,0.0,0.0,0.0);
        FormResize(Sender);
        //glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
        glDepthMask(GL_TRUE);
        glClearDepth(2.f); // !!! Глубина максимальная !!!
        glMatrixMode(GL_PROJECTION);
        gluPerspective(90.f,1.f,1.f,2000.f);
        //glEnable(GL_LIGHTING);
        //glEnable(GL_LIGHT0);
        //float p[4]={3,3,3,1};
        //float d[3]={-1,-1,-3};
        //glLightfv(GL_LIGHT0,GL_POSITION,p);
        //glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
    {
        wglMakeCurrent(ghDC,0);
        wglDeleteContext(ghRC);
    }
    if(ghDC)
    ReleaseDC(Handle,ghDC);
}
//---------------------------------------------------------------------------
 
//... function
void Draw()
{
    glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); // Очистка экрана и буфера глубины
    glLoadIdentity(); // Сброс просмотра
 
    if (1==1)
    {
        glTranslatef(-1.5f,0.0f,-6.0f); // Сдвинемся влево на 1.5 единицы и в экран на 6.0
        glBegin(GL_TRIANGLES);
            glVertex3f( 0.0f, 1.0f, 0.0f);  // Вверх
            glVertex3f(-1.0f,-1.0f, 0.0f);  // Слева снизу
            glVertex3f( 1.0f,-1.0f, 0.0f);  // Справа снизу
        glEnd();
        glTranslatef(3.0f,0.0f,0.0f); // Сдвинем вправо на 3 единицы
        glBegin(GL_QUADS);
            glVertex3f(-1.0f, 1.0f, 0.0f);  // Слева вверху
            glVertex3f( 1.0f, 1.0f, 0.0f);  // Справа вверху
            glVertex3f( 1.0f,-1.0f, 0.0f);  // Справа внизу
            glVertex3f(-1.0f,-1.0f, 0.0f);  // Слева внизу
        glEnd();
        glTranslatef(0.0f,0.0,6.0f);
    }
 
    SwapBuffers(ghDC);
}
//...
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Draw();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
glClearDepth(StrToFloat(Edit1->Text)); // !!! Глубина максимальная !!!
}
//---------------------------------------------------------------------------
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TPanel *Panel1;
    TEdit *Edit1;
    TButton *Button1;
    void __fastcall FormResize(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Добавляю код загрузки текстуры - и возникают проблемы со строками:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GLuinttexture[1];// Место для одной текстуры
 
// Загрузка картинки и конвертирование в текстуру
GLvoid LoadGLTextures()
{
    // Загрузка картинки
    AUX_RGBImageRec *texture1;
    texture1 = auxDIBImageLoad("ass.bmp");
    // Создание текстуры
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
        GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
}
Ошибка:

[BCC32 Error] Unit1.cpp(63): E2034 Cannot convert 'char const[8]' to 'const wchar_t *'
Full parser context
Unit1.cpp(60): parsing: void LoadGLTextures()

Тут: texture1 = auxDIBImageLoad("ass.bmp");
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2015, 00:23
Ответы с готовыми решениями:

Изменение высоты у ComboBox на моем компоненте TPanel
есть проблемка хочу зделать свои Panel на котором есть ComboBox и я хочу изменить ему рамер, ...

Рисование картинки OpenGL на TPanel - почему форма не перерисовывается?
Добрый день! Пишу программу, использующую для отображения геометрии объекта OpenGL для...

Построение графика на компоненте Image
Кто сможет мне помочь в вопросе отрисовки канвы по значениям из 2 столбцов на компоненте Image. Еще...

Построение графика tg(x) в компоненте chart
непойму как построить tg(x) именно нужно в компоненте chart помогите плз =)

1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32854 / 21188 / 8151
Регистрация: 22.10.2011
Сообщений: 36,440
Записей в блоге: 8
26.10.2015, 00:34 2
C++
1
texture1 = auxDIBImageLoad(L"ass.bmp");
1
26.10.2015, 00:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2015, 00:34
Помогаю со студенческими работами здесь

Фон графика в компоненте Chart
Здравствуйте! Подскажите пожалуйста, как изменить фон компонента Chart. Только не всего...

Построение графика в компоненте Image
Построение графика в компоненте Image, графиком является парабола построенная по формуле...

Построение графика функции в компоненте TChart
Здраствуйте. Мне нужна помощь в построении графика y=sin(x), а точнее сама функция для TChart

Фиксированная шкала на осях графика в компоненте TChart
Изучаю Lazarus и мне понадобились фиксированные (постоянные) шкалы в компоненте TChart. По...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru