' Тут все ясно
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() ' сигнал для обновление элемента реализующего визуализацию.
OpenGL в VB.NET
Может кто-нибудь помочь материалами, исходниками на Бейсике, или просто перевести код, например этот: http://opengl.org.ru/books/open_gl/chapter2/shapes_glut/shapes_glut.c ?
А в чём, собственно, проблема? Если не работает перевод из Си на Бейсик, так приведите сюда код. Разберёмся.:)
TAO Framework, то задача будет сводиться к простому переводу синтаксиса C на VB.NET. В любом случае я не рекомендовал использовать VB.NET - синтаксис крайне неудобен, но это хардкейзовское имхо.
Если используете
Привожу код:
Код на С не привожу, впринципе разобрался и автор не использует TAO. Но смущает то, что на С это работает! Может всетаки дело в работе с самим TAO?
hardcase: про отношение к Бейсику всем все давно понятно, но я недопрограммист рода электронщик, так что приходиться работать на том, что могу самосотоятельно изучать в кратчайшие сроки.
P.S. Программка простая - вращающийся по трем осям куб, обтянутый текстурой.