Мой ответ довольно поздний, и я тоже почти новичок, но, возможно, другие новички могут его использовать.
Есть много шагов, пока вы не заставите opengl работать так, как вам хочется, но я наконец-то запустил его сегодня с freeglut на VS2017 c++ и clr-mode на windows 64bit.
Я использую freeglut по причинам, но без этого вы можете использовать перенасыщение подобным образом.
Скачайте и свяжите opengl с вашим проектом (увиденным на youtube), скопируйте dll в выходной каталог вашего проекта, например, отладку и / или выпуск.
Скачайте и свяжите freeglut 3.0 с вашим проектом, не копируйте некоторые DLL в систему Windows или аналогичную, скопируйте freeglut.dll (не скомпилированный файл freeglutd.dll) в выходной каталог проекта, например, отладку или выпуск.
смотреть все установлено на 64-битных (в том числе 64-битных DLL) или вы получите неразрешенные ... ошибки
Создайте новый проект (также возможно использование clr/form) и основной файл .cpp (проверьте в Google, как создать и показать clr-форму из main.cpp)
включить глотку, как это
#define FREEGLUT_STATIC
#define _LIB
#define FREEGLUT_LIB_PRAGMAS 0
#include <GL/freeglut.h>
...
в main.cpp внутри функции int main() {} или fe (clr) form.h после «InitializeComponent ();» команда) fe GLForm1.h-
...
GLForm1(void)
{
InitializeComponent();
int argc = 1;
char *argv[1] = { (char*)"Something" };
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(200, 100);
glutCreateWindow("Scene Modeling and Interaction");
-продолжение следует-
в clr-проекте вы должны создать новый заголовочный файл, в котором все должно быть объявлено статическим, как показано ниже, в противном случае вы можете использовать main.cpp и вам не нужны статические объявления:
myGLStuff.h-
static GLfloat CamZ=-6.0f;
static void MyMouse(int button, int state, int x, int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON:
{ CamZ -= 0.15f;
if (state == GLUT_UP)
{//...
}
break;
}
//...
}
//...
}
static void MyGLInit(void)
{
glShadeModel(GL_SMOOTH); // Enable smooth shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black background
glClearDepth(1.0f); // Depth buffer setup
glEnable(GL_DEPTH_TEST); // Enables depth testing
glDepthFunc(GL_LEQUAL); // The type of depth testing to do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really nice perspective calculations
}
static GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize and initialise the gl window
{
if (height == 0) // Prevent A Divide By Zero By
{
height = 1; // Making Height Equal One
}
glViewport(0, 0, width, height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
GLfloat fieldOfView = 45.0f;
GLfloat zNear = 0.1f;
GLfloat zFar = 255.0f;
GLfloat aspect = float(width) / float(height);
GLfloat fH = tan(float(fieldOfView / 360.0f * 3.14159f)) * zNear;
GLfloat fW = fH * aspect;
glFrustum(-fW, fW, -fH, fH, zNear, zFar);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer
glLoadIdentity(); // Reset the current modelview matrix
glTranslatef(-1.5f, 0.0f, CamZ); // Move left 1.5 units and into the screen 6.0
glRotatef(50, 1, 0, 0);
glutSolidCone(.5, 1, 10, 10);
glutSwapBuffers();
}
----- Назад к main.cpp или form.h --------------- -continued-
MyGLInit();
glutDisplayFunc(display);
glutReshapeFunc(ReSizeGLScene);
glutMouseFunc(MyMouse);
как видите, freeglut очень прост в использовании событий / обратных вызовов, таких как мышь ...
и вот пункты, которые помогли мне выйти из пустого и / или белого экрана.
- проверить все находится в поле зрения (z-значения)
в не-clr проектах вы можете использовать glutMainLoop (); начать, но это бесконечный, блокирующий цикл
на clr вы можете использовать таймер.
обновить gl там fe (извините, кодовые теги не работают)
private: System:: Void timer1_Tick (System:: Object ^ sender, System:: EventArgs ^ e) {glutMainLoopEvent (); //freeglut дает вам возможность сделать собственное обновление glutPostRedisplay ();}
поэтому стандартные события могут быть обработаны
Я получил большую часть кода выше от разных кодеров, и это следует понимать как обходной путь, извините, что я не помню, откуда или кто это был
для моего частного робототехнического проекта лучше всего подходят инструменты outgatet freeglut/opengl/opencv, но есть и более современные инструменты, такие как vulkan
надеюсь я смогу помочь
busybyte