Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OpenGL в VB.NET

14K
29 сентября 2009 года
Ambal
10 / / 14.04.2006
Всем доброго времени суток! Начал изучать OpenGL, оказывается очень мало литературы по использованию оного в VB. При переводе примеров из С возникают ошибки, разобраться с которыми сам не смогу.

Может кто-нибудь помочь материалами, исходниками на Бейсике, или просто перевести код, например этот: http://opengl.org.ru/books/open_gl/chapter2/shapes_glut/shapes_glut.c ?
241
11 октября 2009 года
Sanila_san
1.6K / / 07.06.2005
А в чём, собственно, проблема? Если не работает перевод из Си на Бейсик, так приведите сюда код. Разберёмся.:)
5
11 октября 2009 года
hardcase
4.5K / / 09.08.2005
Если используете TAO Framework, то задача будет сводиться к простому переводу синтаксиса C на VB.NET. В любом случае я не рекомендовал использовать VB.NET - синтаксис крайне неудобен, но это хардкейзовское имхо.
14K
12 октября 2009 года
Ambal
10 / / 14.04.2006
Привожу код:
Код:
' Тут все ясно
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Инициализация
        TAO.InitializeContexts()                                        ' Инициализация поля графика
        Call InitGL(TAO.Width, TAO.Height)
        Call ReSizeGLScene(TAO.Width, TAO.Height)
        Call DrawGLScene()
End Sub

' Инициализация GL (тут тоже все нормально)
Private Sub InitGL(ByVal Width As Single, ByVal Height As Single)   ' Вызвать после создания окна GL
        Call LoadGLTextures()
        glEnable(GL_TEXTURE_2D)         ' Разрешение наложение текстуры
        glClearColor(0, 0, 0, 1)         'Очистка экрана заданным цветом
        ' Создаем буфер глубины
        glClearDepth(1.0)                   ' Разрешить очистку буфера глубины
        glDepthFunc(GL_LESS)                ' Тип теста глубины
        glEnable(GL_DEPTH_TEST)             ' разрешить тест глубины
        ' антиалиасинг
        glShadeModel(GL_SMOOTH)             ' разрешить плавное цветовое сглаживание
        glMatrixMode(GL_PROJECTION)         ' Выбор матрицы проекции
        glLoadIdentity()                    ' Сброс матрицы проекции
        gluPerspective(45.0F, Width / Height, 0.1, 100.0) ' Вычислить соотношение геометрических размеров для окна
        glMatrixMode(GL_MODELVIEW)          ' Выбор матрицы просмотра модели
End Sub

' И здесь все понятно
Private Sub ReSizeGLScene(ByVal Width As Single, ByVal Height As Single)
        If Height = 0 Then Height = 1 ' Предотвращение деления на ноль, если окно слишком мало
        glViewport(0, 0, Width, Height)         ' Сброс текущей области вывода и перспективных преобразований
        glMatrixMode(GL_PROJECTION)             ' Выбор матрицы проекций
        glLoadIdentity()                        ' Сброс матрицы проекции
        gluPerspective(45.0, Width / Height, 0.1, 100.0)    ' Вычисление соотношения геометрических размеров для окна
        glMatrixMode(GL_MODELVIEW)                          ' Выбор матрицы просмотра модели
End Sub

' А вот тут не уверен
' Загрузка текстур
Private Sub LoadGLTextures()
        Dim textureImage(0) As Bitmap
        textureImage(0) = New Bitmap("NeHe.bmp")

        ' Создание текстуры
        glGenTextures(1, texture(0))
        ' Создаем текстуру 1
        Dim rectangle As New Rectangle(0, 0, textureImage(0).Width, textureImage(0).Height)
        Dim bitmapData As BitmapData = textureImage(0).LockBits(rectangle, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb)
        glBindTexture(GL_TEXTURE_2D, texture(0))
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, textureImage(0).Width, textureImage(0).Height, 0, GL_BGR, GL_UNSIGNED_BYTE, bitmapData.Scan0)

        ' Выбор типа фильтрации
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

        textureImage(0).UnlockBits(bitmapData)
        'textureImage.Dispose()
End Sub

' Здесь я рисую куб (вызываю в таймере)
Private Sub DrawGLScene()
        glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT)     ' очистка Экрана и буфера глубины
        glLoadIdentity()                                        ' Сброс просмотра

        glTranslatef(0.0F, 0.0F, -5.0F)    ' Сдвинемся влево на 1.5 единицы и в экран на 6.0
        glRotatef(xrot, 1.0F, 0.0F, 0.0F) ' Вращение по оси X
        glRotatef(yrot, 0.0F, 1.0F, 0.0F) ' Вращение по оси Y
        glRotatef(zrot, 0.0F, 0.0F, 1.0F) ' Вращение по оси Z

        ' Рисуем куб
        glBegin(GL_QUADS)

        ' Передняя грань
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(-1.0F, -1.0F, 1.0F)       ' Низ лево
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(1.0F, -1.0F, 1.0F)        ' Низ право
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(1.0F, 1.0F, 1.0F)         ' Верх право
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(-1.0F, 1.0F, 1.0F)        ' Верх лево

        ' Задняя грань
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(-1.0F, -1.0F, -1.0F) ' Низ право
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(-1.0F, 1.0F, -1.0F) ' Верх право
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(1.0F, 1.0F, -1.0F) ' Верх лево
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(1.0F, -1.0F, -1.0F) ' Низ лево

        ' Верхняя грань
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(-1.0F, 1.0F, -1.0F)       ' Верх лево
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(-1.0F, 1.0F, 1.0F)        ' Низ лево
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(1.0F, 1.0F, 1.0F)         ' Низ право
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(1.0F, 1.0F, -1.0F)        ' Верх право

        ' Нижняя грань
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(-1.0F, -1.0F, -1.0F) ' Верх право
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(1.0F, -1.0F, -1.0F) ' Верх лево
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(1.0F, -1.0F, 1.0F) ' Низ лево
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(-1.0F, -1.0F, 1.0F) ' Низ право

        ' Правая грань
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(1.0F, -1.0F, -1.0F) ' Низ право
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(1.0F, 1.0F, -1.0F) ' Верх право
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(1.0F, 1.0F, 1.0F) ' Верх лево
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(1.0F, -1.0F, 1.0F) ' Низ лево

        ' Левая грань
        glTexCoord2f(0.0F, 0.0F) : glVertex3f(-1.0F, -1.0F, -1.0F) ' Низ лево
        glTexCoord2f(0.0F, 1.0F) : glVertex3f(-1.0F, -1.0F, 1.0F) ' Низ право
        glTexCoord2f(1.0F, 1.0F) : glVertex3f(-1.0F, 1.0F, 1.0F) ' Верх право
        glTexCoord2f(1.0F, 0.0F) : glVertex3f(-1.0F, 1.0F, -1.0F) ' Верх лево
        glEnd()

        TAO.Invalidate()            ' сигнал для обновление элемента реализующего визуализацию.

End Sub
14K
12 октября 2009 года
Ambal
10 / / 14.04.2006
Так вот, дело в том, что, в зависимости от частоты таймера, процедура рисования вызывается, например, 40-45 раз и приложение виснет. Если компилированное, то просто вылетает без каких либо сообщений об ошибке.

Код на С не привожу, впринципе разобрался и автор не использует TAO. Но смущает то, что на С это работает! Может всетаки дело в работе с самим TAO?

hardcase: про отношение к Бейсику всем все давно понятно, но я недопрограммист рода электронщик, так что приходиться работать на том, что могу самосотоятельно изучать в кратчайшие сроки.

P.S. Программка простая - вращающийся по трем осям куб, обтянутый текстурой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог