Форум программистов, компьютерный форум, киберфорум
Наши страницы
Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/31: Рейтинг темы: голосов - 31, средняя оценка - 4.58
Quiet Snow
4416 / 1313 / 378
Регистрация: 25.04.2010
Сообщений: 3,409
1

Графика FreeBasic

01.11.2012, 10:29. Просмотров 6130. Ответов 34
Метки нет (Все метки)

Приветствую всех cyber-форумчан!

Несмотря на наличие графического треда в младшем разделе, создаю ещё одну тему конкретно для FreeBasic.

Считаю, что так будет удобнее, итак друзья, предмет дискуссии:
  1. Обсуждаем графические приложения, написанные на FreeBasic
  2. Выкладываем интересные и полезные примеры программ (исходники)
  3. Делимся опытом по реализации графических программ

Что подразумевается под графическими приложениями:
  • В первую очередь программы работающие в графическом режиме, с упором на вывод графики.
  • Разные рисунки, анимация, эффекты, воспроизводящиеся непосредственно в программе(Runtime).
  • Мультимедиа приложения и игры.
  • Все прочие программы использующие средства для вывода графики.

Прошу построить обсуждение следующим образом:
  1. Выкладывается программа
  2. Задаются вопросы
  3. Автор программы по возможности отвечает
  4. Возвращаемся к пункту a

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


В качестве, стартовых примеров выкладываю 2 портированных собственных программы и одну
портированную с си. Компилируются примеры через FBIde с опцией сборки QB GUI
100% совместимая версия компилятора: 0.22.0
Интерполяция Лагранжа
Графика FreeBasic

Рейкастер
Графика FreeBasic

Скринсейвер
Графика FreeBasic
4
Вложения
Тип файла: zip LAGRANGE.zip (68.4 Кб, 72 просмотров)
Тип файла: zip RAYCAST.zip (78.4 Кб, 45 просмотров)
Тип файла: zip SCREEN SAVER.zip (74.7 Кб, 46 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 10:29
Ответы с готовыми решениями:

FreeBASIC
Заметил, что уже имеющиеся на форуме темы в разделах: - QBasic - Visual Basic - VBA - Pure...

Осваиваю (ем) FreeBasic
Решил больше не тянуть, а приступить сегодня. Если тема будет актуальна - возможно модераторы...

Немного о FreeBasic
Чаще всего при начальном использовании какого-то языка , люди стараются выбрать простую,...

FreeBASIC и сети
Здравствуй, форум. Всё дело в том, что есть одни сетевые функции, и для этих функций Я решил...

Синтаксические особенности FreeBasic
По совету Stabud создаю тему, в которой будем обсуждать семантику и синтаксис диалекта FreeBasic....

34
locm
2198 / 958 / 121
Регистрация: 28.10.2011
Сообщений: 3,203
Записей в блоге: 6
12.11.2012, 21:57 21

Не по теме:

Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
на пюре только под XP
можно было писать крутые проги, а семёрка убивала весь перфоманс
А не пробовали на OpenGL делать как в этом коде?

И учтите тот факт, что вы подключаете сторонние движки и тоже самое можно было бы сделать и на PB подключив их к нему.



Добавлено через 24 минуты
Кликните здесь для просмотра всего текста

Не по теме:

Раз уже затронулась тема того, что PB тормозит при выводе графики, то вот пример из дистрибутива (наверняка его видели), использующий OpenGL.
FPS больше тысячи.

PureBasic
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
;
; Native OpenGL Test
;
; (c) Fantaisie Software
;
; This source is based on an ASM source code found on the web (can't remember which one).
;
; Axis explainations:
;
;             +
;             y
;
;             |
;             |
;  +          |
;  x ---------\
;              \
;               \
;                \ 
;                  z+
;
; So a rotate on the y axis will take the y axis as center. With OpenGL, we can specify
; positive And negative value. Positive values are always in the same sens as the axis
; (like described on the schmatic, with '+' signs)
;
 
DisableDebugger
XIncludeFile #PB_Compiler_Home+"Examples\Sources - Advanced\OpenGL Cube\OpenGL.pbi"
 
Global RollAxisX.f
Global RollAxisY.f
Global RollAxisZ.f
 
Global RotateSpeedX.f
Global RotateSpeedY.f
Global RotateSpeedZ.f
 
Global ZoomFactor.f
 
Procedure DrawCube(hdc)
  glPushMatrix_()                  ; Save the original Matrix coordinates
  glMatrixMode_(#GL_MODELVIEW)
 
  glTranslatef_(0, 0, ZoomFactor)  ;  move it forward a bit
 
  glRotatef_ (RollAxisX, 1.0, 0, 0) ; rotate around X axis
  glRotatef_ (RollAxisY, 0, 1.0, 0) ; rotate around Y axis
  glRotatef_ (RollAxisZ, 0, 0, 1.0) ; rotate around Z axis
 
  RollAxisX + RotateSpeedX 
  RollAxisY + RotateSpeedY 
  RollAxisZ + RotateSpeedZ 
 
  ; clear framebuffer And depth-buffer
 
  glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
 
  ; draw the faces of a cube
  
  ; draw colored faces
 
  glDisable_(#GL_LIGHTING)
  glBegin_  (#GL_QUADS)
  
  ; Build a face, composed of 4 vertex ! 
  ; glBegin() specify how the vertexes are considered. Here a group of
  ; 4 vertexes (GL_QUADS) form a rectangular surface.
 
  ; Now, the color stuff: It's r,v,b but with float values which
  ; can go from 0.0 To 1.0 (0 is .. zero And 1.0 is full intensity) 
  
  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) 
 
  ; The other face is the same than the previous one 
  ; except the colour which is nice blue To white gradiant
 
  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_()
  
  ; draw shaded faces
 
  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_()
 
  SwapBuffers_(hdc)
EndProcedure
 
 
Procedure HandleError (Result, Text$)
  If Result = 0
    MessageRequester("Error", Text$, 0)
    End
  EndIf
EndProcedure
 
Procedure GetFPS() 
  Static StartProc
  Static GetFPS_Count.l, GetFPS_FPS.l, GetFPS_Start.l
  GetFPS_Count + 1 
  If GetFPS_Start = 0 
    GetFPS_Start = ElapsedMilliseconds()
  EndIf 
  If ElapsedMilliseconds() - GetFPS_Start >= 1000 Or StartProc = 0
    GetFPS_FPS   = GetFPS_Count 
    GetFPS_Count = 0 
    GetFPS_Start + 1000 
    StartProc = 1  
    SetWindowTitle(0, "FPS: "+Str(GetFPS_FPS))
  EndIf
  ProcedureReturn GetFPS_FPS 
EndProcedure
 
 
pfd.PIXELFORMATDESCRIPTOR
 
FlatMode = 0         ; Enable Or disable the 'Flat' rendering
 
WindowWidth  = 600   ; The window & GLViewport dimensions
WindowHeight = 600
 
RotateSpeedX = 5.0   ; The speed of the rotation For the 3 axis
RotateSpeedY = 0
RotateSpeedZ = 5.0
 
ZoomFactor = 1       ; Distance of the camera. Negative value = zoom back
 
hWnd = OpenWindow(0, 10, 10, WindowWidth, WindowHeight, "First OpenGL Test")
 
hdc = GetDC_(hWnd)
 
pfd\nSize        = SizeOf(PIXELFORMATDESCRIPTOR)
pfd\nVersion     = 1
pfd\dwFlags      = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
pfd\dwLayerMask  = #PFD_MAIN_PLANE
pfd\iPixelType   = #PFD_TYPE_RGBA
pfd\cColorBits   = 32
pfd\cDepthBits   = 32 
 
pixformat = ChoosePixelFormat_(hdc, pfd)
 
HandleError( SetPixelFormat_(hdc, pixformat, pfd), "SetPixelFormat()")
 
hrc = wglCreateContext_(hdc)
 
HandleError( wglMakeCurrent_(hdc,hrc), "vglMakeCurrent()")
 
glMatrixMode_(#GL_PROJECTION)
 
gluPerspective_(30.0, WindowWidth/WindowHeight, 1.0, 10.0) 
 
; position viewer
glMatrixMode_(#GL_MODELVIEW)
 
glTranslatef_(0, 0, -5.0)
 
If (FlatMode)
  glShadeModel_(#GL_FLAT) 
Else
  glShadeModel_(#GL_SMOOTH) 
EndIf
 
glEnable_(#GL_DEPTH_TEST)   ; Enabled, it slowdown a lot the rendering. It's to be sure than the
                            ; rendered objects are inside the z-buffer.
 
glEnable_(#GL_CULL_FACE)    ; This will enhance the rendering speed as all the back face will be
                            ; ignored. This works only with CLOSED objects like a cube... Singles
                            ; planes surfaces will be visibles only on one side. 
 
glViewport_(0, 0, WindowWidth-30, WindowHeight-30)
 
Repeat
  
  GetFPS()
  
  Repeat 
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
  
  Until Event = 0
  
  DrawCube(hdc)
  ;Delay(20)
Until Quit = 1

1
Вложения
Тип файла: rar opengl.rar (9.7 Кб, 15 просмотров)
Quiet Snow
4416 / 1313 / 378
Регистрация: 25.04.2010
Сообщений: 3,409
12.11.2012, 22:06  [ТС] 22
А не пробовали на OpenGL делать как в этом коде?
Нет не пробовал, думаю по коду там существенно проще будет, только вот
небольшие геморы с созданием окна и определением формата пикселей.
Мне больше непонятно, почему при перекомпиляции под OpenGL там этого
не сделали встроенными средствами, тогда, наверное, вопрос про перфоманс
бы вообще не поднимался, а ведь встроенное 3D на OpenGL великолепно
работает на пюре, помнится я пример с кубиком выкладывал, сейчас в
новой версии как вы говорите функционал серьёзно подрос.
Кликните здесь для просмотра всего текста
Но увы, увы, проект портируется вновь, как когда-то с блитца на пюр))),
только теперь с пюра на FB, надеюсь посделний раз, ибо устал...
0
locm
12.11.2012, 22:14
  #23

Не по теме:

Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
проект портируется вновь
Я думаю прежде чем портировать, изучите имеющийся движок на наличие подводных камней, чтобы при их наличии, не пришлось опять переписывать код под другой движок.

1
Quiet Snow
12.11.2012, 22:42  [ТС]
  #24

Не по теме:

locm, хороший совет. Движок, кстати говоря, не буду использовать, т.к. уже
в принципе разобрался по минимуму с OpenGL в двухмерке, а PNG мне не суть, оно
только чтобы быстро писать программы. Пока в FB напрягает отсутствие встроенного
сетевого и звукового интерфейса, сёкеты не знаю и не хочу туда лезть, долго это и
сложно. Пожалуй это единственный подводный камень, остальное вроде бы более
менее стандартное. Надеюсь существуют библиотеки для чайников в этих вопросах.

0
locm
12.11.2012, 22:58
  #25

Не по теме:

Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
сёкеты не знаю и не хочу туда лезть, долго это и
сложно.
Не, не очень сложно. Наааамного проще чем OpenGL.

1
WLF
05.06.2017, 18:02
  #26

Не по теме:

Кто-нибудь есть живой?

0
Замабувараев
349 / 355 / 93
Регистрация: 18.12.2014
Сообщений: 722
Записей в блоге: 1
06.06.2017, 23:58 27
Я живой.
0
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 95
08.06.2017, 09:50 28
Создаю такое окно:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "fbgfx.bi"
USING FB
 
DIM AS INTEGER nWidth, nHeight, nDepth, nRate, cx, cy, count
DIM AS ulongint clr = 0, i = 0
 
screeninfo nWidth, nHeight, nDepth, , , nRate
screenres nWidth, nHeight, nDepth, , (GFX_FULLSCREEN + GFX_NO_FRAME), nRate
 
IF screenptr = 0 THEN
    PRINT "Error setting video mode!"
    END
END IF
Под виндой7 получаю 1920х1080х32.
Хочу получить квадрат 1024х1024 с палитрой, что-то типа такого
Графика FreeBasic

но со всеми цветами, от черного до белого.
Естественно, все 16 млн цветов в квадрат 1024х1024 не влезут, поэтому палитру надо равномерно сжать, но никак не могу понять КАК...
0
The trick
Модератор
7752 / 2767 / 772
Регистрация: 22.02.2013
Сообщений: 3,916
Записей в блоге: 77
08.06.2017, 13:25 29
Цитата Сообщение от WLF Посмотреть сообщение
но со всеми цветами, от черного до белого.
Насколько мне известно все цветовые модели трехмерны.
0
Замабувараев
349 / 355 / 93
Регистрация: 18.12.2014
Сообщений: 722
Записей в блоге: 1
08.06.2017, 19:06 30
WLF, Можно сделать так.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "fbgfx.bi"
 
USING FB
 
DIM AS INTEGER nWidth, nHeight, nDepth, nRate, cx, cy, count
 
ScreenInfo nWidth, nHeight, nDepth, , , nRate
ScreenRes nWidth, nHeight, nDepth, , (GFX_FULLSCREEN + GFX_NO_FRAME), nRate
 
DIM SHARED Colors(1024 - 1, 1024 - 1) AS INTEGER
 
FOR y AS INTEGER = 0 TO 1024 - 1
    FOR x AS INTEGER = 0 TO 1024 - 1
        Colors(x, y) = RGBA(x \ 4, y \ 4, 256 - x \ 4, 255)
    NEXT
NEXT
 
 
FOR y AS INTEGER = 0 TO 1024 - 1
    FOR x AS INTEGER = 0 TO 1024 - 1
        PSET (x, y), Colors(x, y)
    NEXT
NEXT
1
Pro_grammer
Модератор
6208 / 2290 / 447
Регистрация: 24.04.2011
Сообщений: 4,077
Записей в блоге: 10
08.06.2017, 20:42 31
Цитата Сообщение от Замабувараев Посмотреть сообщение
Можно сделать так.
Второй цикл лишний. Можно сократить вместе с массивом. И добавить ожидание клавиши q для выхода:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "fbgfx.bi"
 
USING FB
 
DIM AS INTEGER nWidth, nHeight, nDepth, nRate, cx, cy, count
 
ScreenInfo nWidth, nHeight, nDepth, , , nRate
ScreenRes nWidth, nHeight, nDepth, , (GFX_FULLSCREEN + GFX_NO_FRAME), nRate
 
FOR y AS INTEGER = 0 TO 1024 - 1
    FOR x AS INTEGER = 0 TO 1024 - 1
        PSET (x, y), RGBA(x \ 4, y \ 4, 256 - x \ 4, 255)
    NEXT
NEXT
DO
    SLEEP 1, 1
LOOP UNTIL Inkey = "q"
1
Замабувараев
349 / 355 / 93
Регистрация: 18.12.2014
Сообщений: 722
Записей в блоге: 1
15.07.2017, 07:12 32
Создал группу по фрибейсику, вступаем http://www.cyberforum.ru/groups/71/
0
Quiet Snow
4416 / 1313 / 378
Регистрация: 25.04.2010
Сообщений: 3,409
16.07.2017, 01:40  [ТС] 33
Нет раздела, создаём группу, ахаха, хитрожопо, сам вот этими социальными фиговинами не пользуюсь,
что там по функционалу хоть? На форум хоть немного похоже, а то может и толку то не будет.
В любом случае это всё очень далеко зарыто.

Вообще убеждаюсь что эти темы никому толком не нужны, зафлудили и тут.
0
Замабувараев
349 / 355 / 93
Регистрация: 18.12.2014
Сообщений: 722
Записей в блоге: 1
17.07.2017, 11:34 34
Группа создана для координации действий по захвату мира^W^W программированию на фрибейсике. Обсуждать вопросы, спрашивать ответы, делиться наблюдениями и исходным кодом, тонкостями конпелятора.
Есть же всякие си плас плас. Им можно, значит, и нам тоже можно.
0
locm
2198 / 958 / 121
Регистрация: 28.10.2011
Сообщений: 3,203
Записей в блоге: 6
17.07.2017, 14:40 35
Создание группы имеет смысл. Если там будет нормальная активность, то это возможно приведет к созданию раздела на форуме.
Неудобно то что нельзя отвечать в темах если не вступил в группу.

Добавлено через 11 секунд
Создание группы имеет смысл. Если там будет нормальная активность, то это возможно приведет к созданию раздела на форуме.
Неудобно то что нельзя отвечать в темах если не вступил в группу.
0
17.07.2017, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2017, 14:40

FreeBasic круги на воде
Очень интересный код имитирующий распространение кругов на воде. Описание алгоритма тут Что меня...

Задача на графику в FreeBASIC
Помогите с задача по графике в FreeBASIC Построить совокупность n равных отрезков, центры которых...

FreeBasic. MyFbFramework + VisualFBEditor
Начал новый фреймворк для FreeBasic: MyFbFramework И редактор для него: VisualFBEditor Файлы...


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

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

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