Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/96: Рейтинг темы: голосов - 96, средняя оценка - 4.79
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515

Исходники Проектов на OpenGL

07.02.2017, 07:01. Показов 19786. Ответов 87
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте программисты!

Дай думаю напишу, может реально кто кинет ссылки где можно скачать готовые исходники: минипроекты с применением OpenGL.

Может я зря думаю, что все специалисты по OpenGL такие ушлые, что не могут подсказать где искать исходники по OpenGL.

В основном интересует на С++ WinaAPI. но другие тоже сойдут.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2017, 07:01
Ответы с готовыми решениями:

Исходники OpenGL
Уважаемые форумчане, пожалуйста дайте мне исходники с уже полностью инициализированным OpenGL и готовым к работе, желательно исходники...

Ищу исходники opengl на visual c++
Помогите с поиском исходников) Нужно вывести на экран различные плоские и объемные геометрические фигуры.. Хочу попробовать реализовать...

Является ли OpenGL open source? Если да, где можно скачать исходники
Уважаемые гуру! Ответьте плиз на вопросы: 1. OpenGL - open source? Если да, где можно скачать исходники 2. Как OpenGL запускается под...

87
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
07.02.2017, 07:24
тут посмотри
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
07.02.2017, 09:14  [ТС]
Цитата Сообщение от qppq Посмотреть сообщение
тут посмотри
Ну по ссылке нашел только тут: http://www.opengl-tutorial.org/download/
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
07.02.2017, 11:08
Если будет интересен WebGL, то здесь можно скачать примеры из книги Мацуды по WebGL: https://sites.google.com/site/webglbook/

Шейдеры WebGL версии 1.0 точно такие же как на OpenGL ES 2.0, поэтому подойдут примеры шейдеров на языке GLSL из книги OpenGL ES 2.0 Programming Guide: https://github.com/danginsburg... k-samples/

Добавлено через 3 минуты
Вот примеры из книги Мацуды, скачать в один клик: http://rodger.global-linguist.... amples.zip
1
 Аватар для snake32
3520 / 1703 / 236
Регистрация: 26.02.2009
Сообщений: 8,564
Записей в блоге: 6
07.02.2017, 12:16
https://www.cyberforum.ru/blog... g1774.html
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
07.02.2017, 12:35
В исходниках книги Коичи Мацуды и Роджера Ли выше много интересных примеров и один из них это роботизированная рука манипулятора, которой можно управлять: https://jsfiddle.net/8Observer8/r5s552cm/
Миниатюры
Исходники Проектов на OpenGL  
Вложения
Тип файла: rar MultiJointModel_segment.rar (16.6 Кб, 77 просмотров)
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
08.02.2017, 21:14
Пример на WebGL, где можно побегать:
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
11.02.2017, 15:50  [ТС]
Тут пояснения по кодам: http://pmg.org.ru/nehe/nehe01.htm
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
11.02.2017, 21:09
Исходники примеров: http://www.opengl-tutorial.org/download/

Содержание проекта:
Миниатюры
Исходники Проектов на OpenGL  
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
12.02.2017, 09:47  [ТС]
Короткий код на OpenGL с++ win32 приложение Для начинающих:
Код:
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <windows.h>         // Подключаем заголовочный файл Windows
#include <gl\gl.h>                // Заголовочные файлы для библиотеки OpenGL32
#include <gl\glu.h>              // Заголовочные файлы для библиотеки GLu32
//#include "utilGL.h"
//#include <gl\glaux.h>  // GLaux - устарела и не поддерживается  // Заголовочные файлы для библиотеки GLaux
 
// статическая линковка библиотек
 
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
 
#include <math.h>
 
 
HWND hWnd;
HGLRC hGLRC;
HDC hDC;
 
int M = 1;
 
int SetWindowPixelFormat()
{
    int m_GLPixelIndex;
    PIXELFORMATDESCRIPTOR pfd;
 
 
    pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion    = 1;
 
    pfd.dwFlags   = PFD_DRAW_TO_WINDOW | 
                    PFD_SUPPORT_OPENGL | 
                    PFD_DOUBLEBUFFER;
 
    pfd.iPixelType     = PFD_TYPE_RGBA;
    pfd.cColorBits     = 32;
    pfd.cRedBits       = 8;
    pfd.cRedShift      = 16;
    pfd.cGreenBits     = 8;
    pfd.cGreenShift    = 8;
    pfd.cBlueBits      = 8;
    pfd.cBlueShift     = 0;
    pfd.cAlphaBits     = 0;
    pfd.cAlphaShift    = 0;
    pfd.cAccumBits     = 64;    
    pfd.cAccumRedBits  = 16;
    pfd.cAccumGreenBits   = 16;
    pfd.cAccumBlueBits    = 16;
    pfd.cAccumAlphaBits   = 0;
    pfd.cDepthBits        = 32;
    pfd.cStencilBits      = 8;
    pfd.cAuxBuffers       = 0;
    pfd.iLayerType        = PFD_MAIN_PLANE;
    pfd.bReserved         = 0;
    pfd.dwLayerMask       = 0;
    pfd.dwVisibleMask     = 0;
    pfd.dwDamageMask      = 0;
 
 
 
    m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd);
    if(m_GLPixelIndex==0) // Let's choose a default index.
    {
     m_GLPixelIndex = 1;    
     if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)
       return 0;
    }
 
 
    if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE)
        return 0;
 
 
    return 1;
}
 
 
 
 
void resize(int width,int height)
{
    glViewport(0,0,width,height);
    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 display()
{
  GLUquadricObj *pObj = gluNewQuadric();
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glTranslated(0.01,0,0);
        glColor3d(1,0,0);
        float i=0, j=0;
        float x,y;
        float R1 = 3.0f, R2 = 2.0f;
        while (i < 360)
        {
            x = R1*cos(i);
            y = R2*sin(M*i);
            glBegin(GL_POINTS);
                glVertex2f(x,y);
            glEnd();
            i += 0.1f;
        }
  glFinish();
  SwapBuffers(wglGetCurrentDC());
}
 
 
 
 
LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};
PAINTSTRUCT ps;
 
switch(msg)
    {
 
    case WM_CREATE:
        hDC = GetDC(hWnd);
        SetWindowPixelFormat();
        hGLRC = wglCreateContext(hDC);
        wglMakeCurrent(hDC, hGLRC);
 
        glEnable(GL_ALPHA_TEST);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
        glLightfv(GL_LIGHT0, GL_POSITION, pos);
        glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
 
        break; 
 
    case WM_KEYDOWN: 
        switch (wParam) 
        { 
// Программирование клавиш
            /*case VK_PLUS: 
                M++;
                break;*/
            case VK_SUBTRACT: if (M > 1) M--;
                break;
            case VK_ESCAPE: exit(0); 
                break; 
        }
 
    case WM_DESTROY:
        if (hGLRC) 
        {
             wglMakeCurrent(NULL, NULL);
             wglDeleteContext(hGLRC);
        }
        ReleaseDC(hWnd, hDC);
        PostQuitMessage(0);
        break;
 
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        display();
        EndPaint(hWnd, &ps);
        break;
    
    case WM_SIZE:
        resize( LOWORD(lParam), HIWORD(lParam) );
        break;  
 
 
    default:
        return DefWindowProc(hWnd,msg,wParam,lParam);
    }
 
return 0;
}
 
 
 
 
int WINAPI WinMain(HINSTANCE hThisInst,
                   HINSTANCE hPrevInst,
                   LPSTR str,int nWinMode)
{
MSG msg;
WNDCLASS wcl;
 
 
wcl.hInstance=hThisInst;
wcl.lpszClassName = "OpenGLWinClass";
wcl.lpfnWndProc = WindowFunc;
wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
 
wcl.hIcon = NULL;
wcl.hCursor = LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName = NULL;
 
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
 
wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wcl);
 
 
hWnd = CreateWindow("OpenGLWinClass", "Win API Template", 
                     WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                     200,
                     150,
                     400,
                     420,
                     HWND_DESKTOP, NULL,
                     hThisInst, NULL);
 
 
ShowWindow(hWnd,nWinMode);
UpdateWindow(hWnd);
 
 
while(1)
{
  while( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ) 
    if(GetMessage(&msg,NULL,0,0))
     { 
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
    else
      return 0;
 
  display();
} 
 
 
return 0;
}
И исходник (visual studio 2012) нужно делать многобайтовую кодировку
Вложения
Тип файла: rar Win32Project2.rar (5.96 Мб, 884 просмотров)
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.02.2017, 11:53
Я бы сразу забил на всякие интернет ресурсы с огрызками обучения.

Возьмите лучше хорошую книгу где все разжевано на русском с нуля, с примерами, кодами, exe. Липчак суперкнига opengl. Найдите в инете +диск.
Юзает глут чтобы упростить жизнь…не знаю актуальна ли она теперь.
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
12.02.2017, 12:56  [ТС]
Цитата Сообщение от infobos Посмотреть сообщение
Липчак суперкнига opengl. Найдите в инете +диск.
Как у него найти диск? У него только книгу можно найти. Если нашли дайте ссылку.

Добавлено через 7 минут
Чтобы найти диск, нужно просто в поиск писать ("CD"). Тогда можно нарыть диски.
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
12.02.2017, 15:29  [ТС]
Вот исходник, который собрал из страницы: http://pmg.org.ru/nehe/nehe01.htm
Естественно этот код не заработал на visual studio 2012. WinAPI c++
Пришлось его подкорректировать. Вверху коды подключения библиотек.
Также используется многобайтовая кодировка.
В исходнике один короткий код: MyKod.cpp
Миниатюры
Исходники Проектов на OpenGL  
Вложения
Тип файла: rar Win32Project3.rar (6.07 Мб, 1961 просмотров)
1
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
12.02.2017, 15:50
Цитата Сообщение от infobos Посмотреть сообщение
void resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
Оне вроде и так работает, но могут быть потом проблемы, с освещением в частности,
ну и так по логике - gluLookAt() должна модифицировать модельно-видовую матрицу:
C++
1
2
3
glMatrixMode( GL_MODELVIEW );
glLoadIdentity(); 
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
14.02.2017, 12:29
Примеры из книги Anton's OpenGL 4 Tutorials:
Добавлено через 20 часов 36 минут
Пример кода, как использовать GLSL из GLUT: Basic program showing how to use GLSL and GLUT together

main.cpp

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <map>
using namespace std;
 
#define _USE_MATH_DEFINES
#include <math.h>
 
// REMEMBER TO INSTALL GLEW! [url]http://glew.sourceforge.net/install.html[/url]
// 
// 2 WAYS TO COMPILE GLEW:
// 1)  AS A STATIC LIB.
//     #defining GLEW_STATIC means to compile the glew library as a static lib.
//     This means your prog WILL NOT require the glew32.dll file to accompany your executable.
//
// THIS IS HOW YOU COMPILE GLEW AS A STATIC LIB:
#define GLEW_STATIC
#include <GL/glew.h>
#pragma comment( lib, "glew32s.lib" )   // the 's' is for 'static'
 
// 2)  AS A DYNAMIC LIB:
//     THIS REQUIRES YOU INCLUDE glew32.dll WITH YOUR FINAL EXECUTABLE/HAVE IT INSTALLED.
//#include <GL/glew.h>
//#pragma comment( lib, "glew32.lib" )
 
// I'm using the STATIC LIB way above, because I prefer it.
 
#include <GL/glut.h>
 
GLuint glslProgId;     // GLSL shader PROGRAM identifier
GLuint vshId, pshId;   // GLSL vertex shader id, pixel shader id
 
                       // These 2 are "handles" that connect the POSITION attribute in
                       // the GLSL shader with __AN ACTUAL SET OF VERTICES__ from the C++ source code.
                       // In this program each VERTEX has a position and a color (only).
GLuint positionAttribute, colorAttribute;
 
// This is the connector between the uniform variable modelViewMatrix,
// used in the glsl shader code.  We need this variable to LOAD
// a specific modelview matrix INTO the GLSL shader before rendering the verts.
GLuint uniformModelViewMatrix;
 
// The vertex array object identifier.  This single number
// identifies EVERYTHING about the vertex buffer we are 
// about to create and render, from its attribute set (positions, colors)
// to where to fetch the data from when it's time to draw.
GLuint vao;
 
// window width and height.
float w = 512.f, h = 512.f;
 
struct VertexPC
{
    float x, y, z, r, g, b, a;
    VertexPC(float ix, float iy, float iz, float ir, float ig, float ib, float ia) :
        x(ix), y(iy), z(iz), r(ir), g(ig), b(ib), a(ia)
    {}
};
 
// The data for the vertex and index buffers.
// I'm just using index buffers to show how they are used.
static VertexPC verts[] = {
    VertexPC(0,0,0, 1,0,0,1),
    VertexPC(1,0,0, 0,1,0,1),
    VertexPC(0,1,0, 0,0,1,1)
};
static int indices[] = { 0,1,2 };
 
map<int, const char*> glErrName;
// GL ERR
map<int, const char*> createErrMap()
{
    map<int, const char*> errmap;
    errmap.insert(make_pair(0x0000, "GL_NO_ERROR"));
    errmap.insert(make_pair(0x0500, "GL_INVALID_ENUM"));
    errmap.insert(make_pair(0x0501, "GL_INVALID_VALUE"));
    errmap.insert(make_pair(0x0502, "GL_INVALID_OPERATION"));
    errmap.insert(make_pair(0x0503, "GL_STACKOVERFLOW"));
    errmap.insert(make_pair(0x0504, "GL_STACK_UNDERFLOW"));
    errmap.insert(make_pair(0x0505, "GL_OUTOFMEMORY"));
 
    errmap.insert(make_pair(0x8CD5, "GL_FRAMEBUFFER_COMPLETE"));
    errmap.insert(make_pair(0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"));
    errmap.insert(make_pair(0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"));
    errmap.insert(make_pair(0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"));
    errmap.insert(make_pair(0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED"));
    return errmap;
}
 
inline bool GL_OK()
{
    GLenum err = glGetError();
    if (err != GL_NO_ERROR)
        printf("GLERROR %d %s\n", err, glErrName[err]);
    return err == GL_NO_ERROR;
}
 
inline bool GL_OK(int line, const char* file)
{
    GLenum err = glGetError();
    if (err != GL_NO_ERROR)
        printf("GLERROR %d %s, line=%d of file=%s\n", err, glErrName[err], line, file);
    return err == GL_NO_ERROR;
}
 
inline bool CHECK(bool cond, const char* errMsg)
{
    if (!cond)  puts(errMsg);
    return cond;
}
 
// WITH LINE NUMBERS
#define CHECK_GL GL_OK( __LINE__, __FILE__ ) 
 
// WITHOUT LINE #s
//#define CHECK_GL GL_OK()
 
void printShaderInfoLog(GLuint obj)
{
    int infologLength = 0;
 
    glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infologLength);
    if (infologLength)
    {
        char *infoLog = (char *)malloc(infologLength);
        int charsWritten;
        glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
        puts(infoLog);
        free(infoLog);
    }
}
 
void printProgramInfoLog(GLuint obj)
{
    int infologLength = 0;
 
    glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infologLength);
    if (infologLength)
    {
        char *infoLog = (char *)malloc(infologLength);
        int charsWritten;
        glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
        puts(infoLog);
        free(infoLog);
    }
}
 
void setupShaders()
{
    // The text of the shaders.  I put it as an inline string
    // just so I could post this easily w/o external files,
    // but you could easily load the shader from an external file.
    // The point is, you must pass your shader to OpenGL as
    // just a NULL terminated string.
    const char *vs =
        "uniform mat4 modelViewMatrix ;                         "
        "                                                       "
        "attribute vec3 position;                               "
        "attribute vec4 color;                                  "
        "                                                       "
        "varying vec4 Color;                                    "
        "                                                       "
        "void main()                                            "
        "{                                                      "
        "  Color = color;                                       "
        "  gl_Position = modelViewMatrix * vec4(position,1.0) ; "
        "}                                                      ";
 
    const char *fs =
        "in vec4 Color;            "
        "                          "
        "void main()               "
        "{                         "
        "  gl_FragColor = Color ;  "
        "}                         ";
 
    vshId = glCreateShader(GL_VERTEX_SHADER);  CHECK_GL;
    glShaderSource(vshId, 1, &vs, NULL);  CHECK_GL;
    glCompileShader(vshId);  CHECK_GL;
    printShaderInfoLog(vshId);
 
    pshId = glCreateShader(GL_FRAGMENT_SHADER);  CHECK_GL;
    glShaderSource(pshId, 1, &fs, NULL);  CHECK_GL;
    glCompileShader(pshId);  CHECK_GL;
    printShaderInfoLog(pshId);
 
    glslProgId = glCreateProgram();
    glAttachShader(glslProgId, vshId);
    glAttachShader(glslProgId, pshId);
 
    glLinkProgram(glslProgId);
    printProgramInfoLog(glslProgId);
 
    positionAttribute = glGetAttribLocation(glslProgId, "position");
    colorAttribute = glGetAttribLocation(glslProgId, "color");
 
    uniformModelViewMatrix = glGetUniformLocation(glslProgId, "modelViewMatrix");
 
 
 
    // Make a "vertex buffer"
    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
 
    // LOAD THE DATA INTO IT:
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
 
    // Make an "index buffer"
    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
 
 
    //// SET UP THE VAO
    // You know, this is weird, but a VERTEX ARRAY OBJECT
    // DOESN'T ACTUALLY STORE DATA.
    // Vertex BUFFERS store the data.
    // A VAO stores the SETUP of how a group of
    // vertices is to be rendered.
    // That is, it stores:
    // 1)  The DATA (in vertex BUFFERS) to be drawn
    // 2)  THE SEMANTICS of that data (vertex format)
    // 3)  THE LINKAGE TO THE SHADER THAT WILL BE USED TO DRAW THIS DATA.
 
    // So you can see, it's all very intermingled and messy.
    // TO draw vertex data with GLSL, you have to:
    //   1) Load the raw vertex data into a vertex buffer
    //   2) set up vertex attributes (via glVertexAttribPointer)
    //      WHICH does 2 things:
    //      a)  It tells OpenGL the VERTEX FORMAT (floats? 3 elements? 4 elements? stride?)
    //      b)  It tells OpenGL THE SHADER VARIABLE THAT THIS VERTEX ATTRIBUTE LINKS INTO.
    //   3) Call glDrawArrays or glDrawElements( ..., 0 ) 
    //      
    // INIT THE VERTEX ARRAY (stuff to draw)
    // The vertex array OBJECT remembers info about
    // WHAT VERTEX ATTRIBS ARE TO BE BOUND, to what
    // indices, and the actual vertex buffer object
    // from which to pull data when rendering.
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
 
    glEnableVertexAttribArray(positionAttribute);
    glVertexAttribPointer(
        positionAttribute,  // index. NOTE THIS HAS BEEN CONNECTED UP EARLIER
                            // WITH THE VERTEX SHADER THAT WILL BE USED TO RENDER THIS VERTEX ARRAY
                            // IN THE LINE:
                            //   > positionAttribute = glGetAttribLocation( glslProgId, "position" ) ; // C++ code line
                            // and "position" is used in the GLSL vertex shader as:
                            //   > attribute vec3 position; // GLSL shader line
                            // SO. Don't be confused, the `positionAttribute` variable is simply connected up
                            // to the vertex shader's INCOMING "position" attribute.  Naked girls.
        3,          // size. 3 floats/vertex
        GL_FLOAT,   // type. floats!
        0,          // normalized? No.
        sizeof(VertexPC),          // stride
        0           // pointer.  0 says to use the CURRENTLY BOUND
                    // VERTEX BUFFER (WHATEVER THAT IS AT THE TIME OF THE DRAW CALL).
                    // If you want to draw from CLIENT MEMORY you would pass AN ACTUAL ADDRESS
                    // here (BUT YOU MUST MAKE SURE TO HAVE NO VERTEX BUFFER BOUND BECAUSE THEN
                    // THE MEMORY ADDRESS YOU PASS HERE WOULD BE INTERPRETTED AS AN __OFFSET__
                    // INTO THAT VERTEX BUFFER, TRIGGERING A SEGFAULT/OUT OF BOUNDS EXCEPTION TYPE THING.)
    );
 
    glEnableVertexAttribArray(colorAttribute);
 
    int offset = 3 * sizeof(float);
    glVertexAttribPointer(colorAttribute, 4, GL_FLOAT, 0, sizeof(VertexPC),
 
        (void*)offset  // RE: THE LAST PARAMETER: I know it looks ridiculous!! to pass a NUMBER as cast to VOID* here,
                       // but that's C api's for you.  "Wait! Shouldn't it be &offset?"
                       // NO. Your eyes kid you not.  You take the INTEGER NUMBER (which amounts to 12 here)
                       // AND JUST PASS THAT AS IF IT WERE A "VOID*" POINTER. Even though you and I know it is not.
    );
 
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 27: //esc
        glDeleteVertexArrays(1, &vao);
        glDeleteProgram(glslProgId);
        glDeleteShader(vshId);
        glDeleteShader(pshId);
        exit(0);
        break;
    }
}
 
void resizeWindow(int width, int height)
{
    w = width, h = height;
}
 
void draw()
{
    glViewport(0, 0, w, h);
 
    glClearColor(0.1f, 0.1f, 0.1f, 0.1f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    // Bind the shader I created earlier
    glUseProgram(glslProgId);
 
    // Update the uniform variable.  YOU CAN
    // ONLY UPDATE THE UNIFORMS OF __BOUND SHADERS__ --
    // IE glUniformMatrix4fv must be called AFTER glUseProgram
    float m[16] = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
    glUniformMatrix4fv(uniformModelViewMatrix, 1, false, m);
 
    // Here we bind the vertex array "object".  This is EQUIVALENT
    // to "replaying" 
    glBindVertexArray(vao);
 
    // Now we could draw in one of 2 ways:
 
    // DRAW USING THE VERTEX BUFFER (ONLY):
    //glDrawArrays( GL_TRIANGLES, 0, 3 ) ; // draw as vertex buffer (with no index buffer)
 
    // DRAW USING INDEX BUFFER + VERTEX BUFFER
    glDrawElements(
        GL_TRIANGLES,
        3, //# INDICES in the index buffer
        GL_UNSIGNED_INT, // I used 4-byte ints. Some other people use shorts, but I never do.
        0  // 0 means, use the index buffer bound
    );
 
    glutSwapBuffers();
}
 
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(w, h);
    glutCreateWindow("GLSL with GLUT");
 
    glutDisplayFunc(draw);
    glutIdleFunc(draw);
    glutReshapeFunc(resizeWindow);
    glutKeyboardFunc(keyboard);
 
    glewInit();
    //if( glewIsSupported("GL_VERSION_3_0") )
 
    glEnable(GL_DEPTH_TEST);
    glClearColor(1.0, 1.0, 1.0, 1.0);
 
    setupShaders();
 
    glutMainLoop();
 
    return 0;
}


Я проверил, код работает:
Скриншот


Добавлено через 13 минут
Для того, чтобы скрыть окно консоли в коде выше в Visual Studio нужно до функции main() добавить строку:
C++
1
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
Эта строка так же подстраховывает, если забыть в настройках линкера выбрать точку входа main()
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
14.02.2017, 12:38  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Пример кода, как использовать GLSL из GLUT
Чтобы код заработал нужно всякого подключать. Новичкам будет сложно все понять без исходников.
На всякий случай кину, библиотеку <GL/glew.h>:
Вложения
Тип файла: zip glew-1.9.0-win64.zip (1.34 Мб, 19 просмотров)
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
14.02.2017, 12:42  [ТС]
Здесь написано про подключение библиотеки GL/glew.h: http://www.gamedev.ru/code/forum/?id=170533
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
14.02.2017, 13:38
Лучший ответ Сообщение было отмечено infobos как решение

Решение

Цитата Сообщение от infobos Посмотреть сообщение
Чтобы код заработал нужно всякого подключать. Новичкам будет сложно все понять без исходников.
Тогда поясню, как я подключил GLUT к VS 2015.

Я создал следующие папки на диске C для GLUT и GLEW:
  • C:\OpenGL\glut\include\GL
  • C:\OpenGL\glut\lib\
  • C:\OpenGL\glew\

В папку "C:\OpenGL\glew" я скопировал содержимое архива glew-2.0.0-win32.zip с официального сайта: http://glew.sourceforge.net/

Скачал архив GLUT glutdlls37beta.zip с официального сайта здесь в этой строке:
If you want just the GLUT header file, the .LIB, and .DLL files all pre-compiled for Intel platforms, you can simply download the glutdlls37beta.zip file (149 kilobytes).
Из скаченного архива заголовочный файл "glut.h" я скопировал в папку C:\OpenGL\glut\include\GL"

Библиотеку "glut32.lib" я скопировал в папку "C:\OpenGL\glut\lib"

Открыл VS, создал проект "Empty Project" и выставил настройки показанные на прикреплённых скриншотах внизу сообщения (в настройках я выбрал платформу для запуска на Windows XP).

В корне проекта, рядом с main.cpp нужно скопировать glut32.dll

P.S. Я считаю, что нужно скачивать 32-битные версии библиотек и создавать 32-битные приложения, так как это значительно увеличивает аудиторию. А 64-битные версии нужно создавать только в крайних случаях. Например, когда ваше приложение будет использовать больше 4 ГБайт оперативной памяти.
Миниатюры
Исходники Проектов на OpenGL   Исходники Проектов на OpenGL   Исходники Проектов на OpenGL  

Исходники Проектов на OpenGL  
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 515
14.02.2017, 14:01  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я создал следующие папки на диске C для GLUT и GLEW:
C:\OpenGL\glut\include\GL
C:\OpenGL\glut\lib\
C:\OpenGL\glew\
Я подозреваю, что Ваш скомпилированный exe - файл не запустится на других ПК. Так как будут искать эти файлы, которых не будет в других ПК. Поэтому желательно создавать файлы максимально автономными.

Скиньте Exe - файл для теста на моем ПК.

Добавлено через 11 минут
Мне фрилансер написал код, в котором используется шейдерный код, но GL/glew.h нету.
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
14.02.2017, 14:06
Цитата Сообщение от infobos Посмотреть сообщение
Я подозреваю, что Ваш скомпилированный exe - файл не запустится на других ПК.
Да, вы правы, поэтому в своём блоге, я написал, что для запуска на других ПК нужно размещать glut32.dll рядом с EXE.

Для GLEW не нужно копировать DLL, так как я подключил статическую версию GLEW: glew32s.lib (обратите внимание на букву "s"). А в самом примере написано:
C++
1
2
3
4
// THIS IS HOW YOU COMPILE GLEW AS A STATIC LIB:
#define GLEW_STATIC
#include <GL/glew.h>
#pragma comment( lib, "glew32s.lib" )   // the 's' is for 'static'
Правда, получилось избыточно, то что я и а настройках подлючил статическую версию библиотеки и в самом проекте. Но это нестрашно, можно так оставить.

Статические библиотеки вшиваются в EXE.

И ещё один момент. При сборке в Release вылезут ошибки с текстом "module unsafe for GLUTAndGLSL SAFESEH image". Для того, чтобы их исправить нужно поменять настройки, как на скриншоте:
Миниатюры
Исходники Проектов на OpenGL  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2017, 14:06
Помогаю со студенческими работами здесь

Исходники Проектов на DirectX
Здравствуйте программисты! Дай думаю напишу, может реально кто кинет ссылки где можно скачать готовые исходники: минипроекты с...

Ищу исходники интересных проектов на C++
Приветствую всех! Мне тут подсказали, что для эффективного изучения языка и основных приемов, используемых в нем, необходимо читать...

Подскажите где найти исходники программ(проектов) на QT
Хотелось бы нормальный рабочий проект (например с поддержкой БД) на QT, чтоб запустить и разбираться просто для обучения, ато быдлокодить...

Где можно посмотреть исходники шаблонов проектов для C#?
Где можно посмотреть исходники шаблонов проектов для C#?

[Опрос] Где Вы храните исходники своих приватных проектов?
Добрый день, раньше никогда не любил пихать чтолибо важное в облака, но после очередной поломки жеских дисков сразу на неск. машинах, решил...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru