Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1richard
15 / 5 / 5
Регистрация: 22.06.2013
Сообщений: 31
#1

Наложение текстуры в OpenGL

14.09.2014, 23:18. Просмотров 1354. Ответов 3
Метки нет (Все метки)

Делаю всё по уроку от NeHe, но что то всё равно не то, цвет кубика меняется, но текстура не появляется. Хочу добавить, что компилятор выдавал ошибку, но после подключения glaux.lib ошибки исчезли, но текстура не появилась.
Сам код:
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
 
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TTimer *Timer1;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
 
        bool __fastcall bSetupPixelFormat(HDC hdc);
        __fastcall TForm1(TComponent* Owner);
        HGLRC ghRC;
        HDC ghDC;
        void __fastcall Draw();
        void __fastcall FormResize(TObject *Sender);
        float rx, ry, rz;
        GLuint  texture[1];
        GLvoid LoadGLTextures()
        {
                AUX_RGBImageRec *texture1;
            texture1 = auxDIBImageLoad("texture2.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);
        }
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
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
154
155
156
157
158
159
160
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        ghDC = GetDC(Handle);
        if (!bSetupPixelFormat(ghDC))
                Close();
        ghRC = wglCreateContext(ghDC);
        wglMakeCurrent(ghDC, ghRC);
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClearDepth(1.0);
        FormResize(Sender);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glShadeModel(GL_SMOOTH);
        float p[4]={3,3,3,1},
        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);
}
//---------------------------------------------------------------------------
 
bool __fastcall TForm1::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;
        ppfd->cColorBits = 16;
        ppfd->cDepthBits = 16;
        ppfd->cAccumBits = 0;
        ppfd->cStencilBits = 0;
        if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
        {
                MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
                return false;
        }
        if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
        {
                MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
                return false;
        }
        return true;
        }
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormResize(TObject *Sender)
{
        glViewport( 0, 0, Width, Height );
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        //glOrtho(-5,5, -5,5, 2,12);
        gluPerspective( 45.0f, (GLfloat)Width/(GLfloat)Height, 0.1f, 100.0f );
        gluLookAt(0,0,5, 0,0,0, 0,1,0);
        glMatrixMode(GL_MODELVIEW);
        glEnable(GL_TEXTURE_2D);        // Разрешение наложение текстуры
        LoadGLTextures();           // Загрузка текстур
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Draw()
{
        glClear(GL_DEPTH_BUFFER_BIT ^ GL_COLOR_BUFFER_BIT);
 
        glLoadIdentity();
 
    glTranslatef(0.0f,0.0f,-5.0f);
 
        glRotatef(rx,1.0f,0.0f,0.0f);       // Вращение по оси X
    glRotatef(ry,0.0f,1.0f,0.0f);       // Вращение по оси Y
    glRotatef(rz,0.0f,0.0f,1.0f);       // Вращение по оси Z
 
        glBindTexture(GL_TEXTURE_2D, texture[0]);
 
        glBegin(GL_QUADS);
 
                glVertex3f( 1.0f, 1.0f,-1.0f); // Право верх квадрата (Верх)
                glVertex3f(-1.0f, 1.0f,-1.0f); // Лево верх
                glVertex3f(-1.0f, 1.0f, 1.0f); // Лево низ
                glVertex3f( 1.0f, 1.0f, 1.0f); // Право низ
 
                glVertex3f( 1.0f,-1.0f, 1.0f); // Верх право квадрата (Низ)
                glVertex3f(-1.0f,-1.0f, 1.0f); // Верх лево
                glVertex3f(-1.0f,-1.0f,-1.0f); // Низ лево
                glVertex3f( 1.0f,-1.0f,-1.0f); // Низ право
 
                glVertex3f( 1.0f, 1.0f, 1.0f); // Верх право квадрата (Перед)
                glVertex3f(-1.0f, 1.0f, 1.0f); // Верх лево
                glVertex3f(-1.0f,-1.0f, 1.0f); // Низ лево
                glVertex3f( 1.0f,-1.0f, 1.0f); // Низ право
 
                glVertex3f( 1.0f,-1.0f,-1.0f); // Верх право квадрата (Зад)
                glVertex3f(-1.0f,-1.0f,-1.0f); // Верх лево
                glVertex3f(-1.0f, 1.0f,-1.0f); // Низ лево
                glVertex3f( 1.0f, 1.0f,-1.0f); // Низ право
 
                glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право квадрата (Лево)
                glVertex3f(-1.0f, 1.0f,-1.0f); // Верх лево
                glVertex3f(-1.0f,-1.0f,-1.0f); // Низ лево
                glVertex3f(-1.0f,-1.0f, 1.0f); // Низ право
 
                glVertex3f( 1.0f, 1.0f,-1.0f); // Верх право квадрата (Право)
                glVertex3f( 1.0f, 1.0f, 1.0f); // Верх лево
                glVertex3f( 1.0f,-1.0f, 1.0f); // Низ лево
                glVertex3f( 1.0f,-1.0f,-1.0f); // Низ право
        glEnd();
        SwapBuffers(ghDC);
        rx += 0.3;
        ry += 0.4;
        rz += 0.1;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Timer1->Enabled = !Timer1->Enabled;        
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        Draw();        
}
//---------------------------------------------------------------------------
Буду очень благодарен за помощь.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2014, 23:18
Ответы с готовыми решениями:

наложение изображений
Необходимо сделать изображение с эффектом. Программа открывает изображение...

Наложение фотографий
Здравствуйте! Занимаюсь программирование на С++ Builder совсем недавно. Получил...

Наложение графиков
Всем добрового времени суток. Представьте себе два эллипса наложенные друг...

Наложение видео
Здравствуйте. Заранее извиняюсь, если запостил не в тот раздел, просто вопрос...

Tchart наложение графиков
Есть два графика, значения которых совпадают в нескольких точках, один из них...

3
DeadHipo
14.09.2014, 23:29
  #2

Не по теме:

Обязательно реализация в билдере? Помниться не так давно по учёбе пришлось иметь дело с opengl и в студии задача решилась быстро... Хотя думаю большой разницы особо нет.

0
1richard
15 / 5 / 5
Регистрация: 22.06.2013
Сообщений: 31
15.09.2014, 23:05  [ТС] #3
Решено, не внимательно читал урок, и не добавил рисование текстуры в эту часть кода:
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
glBegin(GL_QUADS);
        // Front face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom left of the texture and quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom right of the texture and quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Top right of the texture and quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Top left of the texture and quad
        // Back face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom right of the texture and quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top right of the texture and quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top left of the texture and quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Bottom left of the texture and quad
        // Top face
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top left of the texture and quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Bottom left of the texture and quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Bottom right of the texture and quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top right of the texture and quad
        // Bottom face
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Top right of the texture and quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Top left of the texture and quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom left of the texture and quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom right of the texture and quad
        // Right face
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Bottom right of the texture and quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top right of the texture and quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Top left of the texture and quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom left of the texture and quad
        // Left face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom left of the texture and quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom right of the texture and quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Top right of the texture and quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top left of the texture and quad
    glEnd();
0
TheDarkMax2
16 / 16 / 3
Регистрация: 23.09.2011
Сообщений: 173
21.02.2018, 14:00 #4
Цитата Сообщение от 1richard Посмотреть сообщение
но после подключения glaux.lib ошибки исчезли
Как подключил?

Добавлено через 30 минут
Скопировал lib в папку проекта и добавил в проект, но теперь такая ошибка:
[ilink32 Error] Fatal: Unable to open file 'J.OBJ'

Добавлено через 23 часа 7 минут
Нашёл в сети такой костыль:
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
GLvoid LoadGLTextures() {
    // загрузка картинки
    Graphics::TBitmap *TXS = new Graphics::TBitmap;
    TXS->LoadFromResourceName( (int)appInstance, "M32A" );
    BITMAP BMP;
    GetObject( TXS->ReleaseHandle(), sizeof(BMP), &BMP );
 
    // Создание текстуры с фильтром по соседним пикселям
    glGenTextures( 1, &texture[0] );
    glBindTexture( GL_TEXTURE_2D, texture[0] );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glTexImage2D( GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, BMP.bmBits );
 
    glGenTextures( 1, &texture[1] );
    glBindTexture( GL_TEXTURE_2D, texture[1] );
    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, BMP.bmWidth, BMP.bmHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, BMP.bmBits );
 
    glGenTextures( 1, &texture[2] );
    glBindTexture( GL_TEXTURE_2D, texture[2] );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, BMP.bmWidth, BMP.bmHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, BMP.bmBits );
 
    free( TXS ); // освобождение памяти под структуру
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2018, 14:00

Удаление\Наложение шумов
Гляньте плиз=) Вот я так налаживаю ШУМ=) unsigned char *pict,e; const...

Наложение изображения друг на друга
Допустим есть Image1. Хочу реализовать следующее: - загружаю еще картинку...

DrawGrid1 и наложение картинки в ячейку
Собственно сабж.. Как наложить картинку с Picture1 в ячекй DrawGrid1 по ...


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

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

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