purebasic.info

PureBasic forum
Текущее время: Пн окт 22, 2018 3:11 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с OpenGL
СообщениеДобавлено: Вс июн 28, 2015 9:07 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вот такая заморочка - на WinXP не рисует, либо черный экран, либо белый.
Подскажите, в чем дело плз.

Выход из программы - Esc


Вложения:
3ddraw.zip [8.34 KiB]
Скачиваний: 112

_________________
Захотелось мартышки любви со слоном, тут она и лопнула
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Проблема с OpenGL
СообщениеДобавлено: Вс июн 28, 2015 10:37 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб сен 20, 2014 7:08 pm
Сообщений: 37
Благодарил (а): 2 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Во первых, он вообще нигде не работает, во вторых это быдло-код. Как вы его вообще писали? Чаще убирайте закомментированные строки кода, выделяйте весь текст и нажимайте Ctrl+I, если такой напряг с расстановкой отступов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Проблема с OpenGL
СообщениеДобавлено: Вс июн 28, 2015 11:03 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
во-первых, работает.
во-вторых, ниасилятор детект.

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Проблема с OpenGL
СообщениеДобавлено: Вс июн 28, 2015 2:22 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6384
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
egons писал(а):
Вот такая заморочка - на WinXP не рисует, либо черный экран, либо белый.
Подскажите, в чем дело плз.

В Пурике есть OpenGLGadget
Не знаю, к чему такие заморочки у тебя, но всё работает прекрасно из коробки, при чем на всех поддерживаемых системах:
Код:
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
; OpenGL Gadget demonstration
;
; Кординатные оси:
;
;             +
;             y
;
;             |
;             |
;  +          |
;  x ---------\
;              \
;               \
;                \
;                  z+
;
;
;Центр OpenGL экрана находится в точке 0, 0, 0. Координаты, расположенные
; слева, снизу и вглубь от него, имеют отрицательное значение, расположенные справа, сверху и по направлению к наблюдателю
; – положительное.
 
Global RollAxisX.f
Global RollAxisY.f
Global RollAxisZ.f
 
Global RotateSpeedX.f = 1.0
Global RotateSpeedY.f
Global RotateSpeedZ.f = 1.0
 
Global ZoomFactor.f = 1.0 ; Расстояние до камеры. Отрицательная величина уменьшает масштаб изображения
 
Procedure DrawCube(Gadget)
  SetGadgetAttribute(Gadget, #PB_OpenGL_SetContext, #True)
 
  glPushMatrix_()                  ; Сохранить оригинальные координаты
  glMatrixMode_(#GL_MODELVIEW)
 
  glTranslatef_(0, 0, ZoomFactor)  ;  переместить его немного вперед
 
  glRotatef_ (RollAxisX, 1.0, 0, 0) ; вращкние вокруг оси X
  glRotatef_ (RollAxisY, 0, 1.0, 0) ; вращкние вокруг оси Y
  glRotatef_ (RollAxisZ, 0, 0, 1.0) ; вращкние вокруг оси Z
 
  RollAxisX + RotateSpeedX
  RollAxisY + RotateSpeedY
  RollAxisZ + RotateSpeedZ
 
  ; Очистим буфер кадров и глубины
 
  glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
 
  ; рисуем грани куба в цвете
 
  ;Строим куб из 4-х вершин
  ;4 вершины (GL_QUADS) образуют прямоугольную поверхность.
  glDisable_(#GL_LIGHTING)
  glBegin_  (#GL_QUADS)
 
 
 
  ;Теперь, цвет граней : Это состовляющие R, G, В, значения дробные от 0,0 до 1,0 (0 - нет цвета и 1,0 полн. интенсивность)
   
  glNormal3f_ (0,0,1.0)
  glColor3f_  (0,0,1.0)
  glVertex3f_ (0.5,0.5,0.5)  
  glColor3f_  (0,1.0,1.0)        
  glVertex3f_ (-0.5,0.5,0.5)
  glColor3f_  (1.0,1.0,1.0)
  glVertex3f_ (-0.5,-0.5,0.5)
  glColor3f_  (0,0,0)
  glVertex3f_ (0.5,-0.5,0.5)
 
  ; То же вамое, только теперь используем нрадиентны цвет
 
 
  glNormal3f_ (0,0,-1.0)
  glColor3f_  (0,0,1.0)
  glVertex3f_ (-0.5,-0.5,-0.5)
  glColor3f_  (0,0,1.0)
  glVertex3f_ (-0.5,0.5,-0.5)
  glColor3f_  (1.0,1.0,1.0)
  glVertex3f_ (0.5,0.5,-0.5)
  glColor3f_  (1.0,1.0,1.0)
  glVertex3f_ (0.5,-0.5,-0.5)
 
  glEnd_()
 
  ; рисуем тени
 
  glEnable_(#GL_LIGHTING)
  glEnable_(#GL_LIGHT0)
  glBegin_ (#GL_QUADS)
 
  glNormal3f_ (   0, 1.0,   0)
  glVertex3f_ ( 0.5, 0.5, 0.5)
  glVertex3f_ ( 0.5, 0.5,-0.5)
  glVertex3f_ (-0.5, 0.5,-0.5)
  glVertex3f_ (-0.5, 0.5, 0.5)
 
  glNormal3f_ (0,-1.0,0)
  glVertex3f_ (-0.5,-0.5,-0.5)
  glVertex3f_ (0.5,-0.5,-0.5)
  glVertex3f_ (0.5,-0.5,0.5)
  glVertex3f_ (-0.5,-0.5,0.5)
 
  glNormal3f_ (1.0,0,0)
  glVertex3f_ (0.5,0.5,0.5)
  glVertex3f_ (0.5,-0.5,0.5)
  glVertex3f_ (0.5,-0.5,-0.5)
  glVertex3f_ (0.5,0.5,-0.5)
 
  glNormal3f_ (-1.0,   0,   0)
  glVertex3f_ (-0.5,-0.5,-0.5)
  glVertex3f_ (-0.5,-0.5, 0.5)
  glVertex3f_ (-0.5, 0.5, 0.5)
  glVertex3f_ (-0.5, 0.5,-0.5)
 
  glEnd_()
 
  glPopMatrix_()
  glFinish_()
 
  SetGadgetAttribute(Gadget, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
 
 
Procedure SetupGL()
   
  glMatrixMode_(#GL_PROJECTION)
  gluPerspective_(30.0, 200/200, 1.0, 10.0)
 
  ; положение просмотра
  glMatrixMode_(#GL_MODELVIEW)
 
  glTranslatef_(0, 0, -5.0)
 
  glEnable_(#GL_DEPTH_TEST)   ; Убеждаемся, что буфер заполнен
 
  glEnable_(#GL_CULL_FACE)    ; Для увеличения скорости рендерим тольео видимые поверхности
   
  glShadeModel_(#GL_SMOOTH)
EndProcedure
 
 
Procedure HandleError (Result, Text$)
  If Result = 0
    MessageRequester("Error", Text$, 0)
    End
  EndIf
EndProcedure
 
OpenWindow(0, 0, 0, 530, 320, "OpenGL Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
OpenGLGadget(0, 10, 10, 200, 200)
SetupGL()
 
OpenGLGadget(1, 220, 10, 300, 300)
SetupGL()
 
AddWindowTimer(0, 1, 16) ; about 60 fps
 
Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1
        DrawCube(0)
        DrawCube(1)
      EndIf
  EndSelect
 
Until Event = #PB_Event_CloseWindow
 



Или совсем простой пример, я делал кальку с 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
 
Procedure SetupGL(w.i,h.i)
  glMatrixMode_(#GL_PROJECTION );            // Выбор матрицы проекций
  glLoadIdentity_();              // Сброс матрицы проекции
    ;// Вычисление соотношения геометрических размеров для окна
 
    gluPerspective_( 45.0, w/h, 0.1, 100.0 );
    glMatrixMode_( #GL_MODELVIEW );            // Выбор матрицы вида модели
    glLoadIdentity_()             ;              // Сброс матрицы вида модели
   
    glShadeModel_( #GL_SMOOTH );            // Разрешить плавное цветовое сглаживание
    glClearColor_(0.0, 0.0, 0.0, 0.0);          // Очистка экрана в черный цвет
    glClearDepth_( 1.0 );              // Разрешить очистку буфера глубины
 
    glEnable_( #GL_DEPTH_TEST );            // Разрешить тест глубины
 
    glDepthFunc_( #GL_LEQUAL );            // Тип теста глубины
    glHint_( #GL_PERSPECTIVE_CORRECTION_HINT, #GL_NICEST );      // Улучшение в вычислении перспективы
EndProcedure
 
 
; Вызов функции gLoadIdentity() устанавливает начало системы координат в центр экрана, причем ось X идет слева направо,
; ось Y вверх и вниз, а ось Z к и от наблюдателя. Центр OpenGL экрана находится в точке 0, 0, 0. Координаты, расположенные
; слева, снизу и вглубь от него, имеют отрицательное значение, расположенные справа, сверху и по направлению к наблюдателю
; – положительное.
 
Procedure DrawGLScene()
  SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)
 
 
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);     // Очистка экрана
                                                    ;    // и буфера глубины
glLoadIdentity_();                            ;         // Сброс просмотра
glTranslatef_(-1.5,0.0,-6.0) ;                          // Сдвинемся влево на 1.5 единицы и
                               ;                          // в экран на 6.0
; Первая строка после glBegin описывает первую вершину нашего полигона. Функция glVertex3f() получает в качестве параметров
; ее X, Y и Z координаты. Первая вершина треугольника смещена только от оси Y на 1, таким образом, мы расположим ее точно в
; центре и она будет самой верхней. Следующая вершина будет располагаться на оси Х слева от центра и на оси Y вниз от центра.
; Эта вершина будет расположена внизу слева. Третья вершина будет справа и снизу от центра. Функция glEnd() указывает OpenGL,
; что вершин больше не будет. Результатом всего этого будет залитый цветом по умолчанию треугольник.
 
glBegin_(#GL_TRIANGLES);
                glVertex3f_( 0.0, 1.0, 0.0);  // Вверх
                glVertex3f_(-1.0,-1.0, 0.0);  // Слева снизу
                glVertex3f_( 1.0,-1.0, 0.0);  // Справа снизу
 glEnd_()                   ;
               
                glTranslatef_(3.0,0.0,0.0);           // Сдвинем вправо на 3 единицы      
               
; Здесь мы изобразим квадрат. Так как он является четырехсторонним полигоном, мы будем использовать GL_QUADS. Создание
; квадрата напоминает создание треугольника, правда указывать нужно четыре вершины. Они будут идти в следующем порядке
; – левая вверху, правая вверху, правая снизу и левая снизу.            
 glBegin_(#GL_QUADS);
                glVertex3f_(-1.0, 1.0, 0.0);  // Слева вверху
                glVertex3f_( 1.0, 1.0, 0.0);  // Справа вверху
                glVertex3f_( 1.0,-1.0, 0.0);  // Справа внизу
                glVertex3f_(-1.0,-1.0, 0.0);  // Слева внизу
        glEnd_();          
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
     
OpenWindow(0, 0, 0, 800, 600, "OpenGL Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenGLGadget(0, 0, 0, 800, 600)
 
AddWindowTimer(0, 1, 16) ; about 60 fps
SetupGL(GadgetWidth(0),GadgetHeight(0))
Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1
       DrawGLScene()
      EndIf
  EndSelect
 
Until Event = #PB_Event_CloseWindow



Пользуйся всеми возможностями языка, на котором пишешь программы, незачем изобретать велосипед.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Проблема с OpenGL
СообщениеДобавлено: Вс июн 28, 2015 2:30 pm 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
Пользуйся всеми возможностями языка, на котором пишешь программы, незачем изобретать велосипед.


тот же код переведен на Ассемблер, у меня работает прекрасно, на хрюшке - нет.

Какие заморочки - не знаю, я взял тот же код, что работал раньше.

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Проблема с OpenGL
СообщениеДобавлено: Пт июл 03, 2015 6:59 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Перенес код из урока Nehe#25, заработало.Попробую адаптировать на PB.

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB