-1

Проект, над которым я работаю в университете, требует, чтобы мы работали в Visual Studio 2017 и использовали библиотеки OpenGL и Glut. По причинам, я не могу использовать freeglut.

Проблема в том, что я не знаю, как получить OpenGL и Glut в Visual Studio, и мне не повезло, что я нашел помощь в Интернете. Я довольно новичок в Visual Studio, поэтому я не знаю, как он работает полностью.

TLDR: Как мне заставить OpenGL работать в Visual Studio 2017?

1 ответ1

-2

Мой ответ довольно поздний, и я тоже почти новичок, но, возможно, другие новички могут его использовать. Есть много шагов, пока вы не заставите opengl работать так, как вам хочется, но я наконец-то запустил его сегодня с freeglut на VS2017 c++ и clr-mode на windows 64bit. Я использую freeglut по причинам, но без этого вы можете использовать перенасыщение подобным образом.

  1. Скачайте и свяжите opengl с вашим проектом (увиденным на youtube), скопируйте dll в выходной каталог вашего проекта, например, отладку и / или выпуск.

  2. Скачайте и свяжите 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 очень прост в использовании событий / обратных вызовов, таких как мышь ... и вот пункты, которые помогли мне выйти из пустого и / или белого экрана.

  1. проверить все находится в поле зрения (z-значения)
  2. в не-clr проектах вы можете использовать glutMainLoop (); начать, но это бесконечный, блокирующий цикл

  3. на clr вы можете использовать таймер. обновить gl там fe (извините, кодовые теги не работают)

    private: System:: Void timer1_Tick (System:: Object ^ sender, System:: EventArgs ^ e) {glutMainLoopEvent (); //freeglut дает вам возможность сделать собственное обновление glutPostRedisplay ();}

поэтому стандартные события могут быть обработаны

Я получил большую часть кода выше от разных кодеров, и это следует понимать как обходной путь, извините, что я не помню, откуда или кто это был

для моего частного робототехнического проекта лучше всего подходят инструменты outgatet freeglut/opengl/opencv, но есть и более современные инструменты, такие как vulkan

надеюсь я смогу помочь

busybyte

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .