Форум программистов

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Форум программистов (https://programmersforum.ru/index.php)
-   Gamedev - cоздание игр: Unity, OpenGL, DirectX (https://programmersforum.ru/forumdisplay.php?f=33)
-   -   Не поддерживаются функции OpenGl (https://programmersforum.ru/showthread.php?t=346852)

Timurkh77 01.04.2024 18:30

Не поддерживаются функции OpenGl
 
Вложений: 1
В рассматриваемом примере использовалась библиотека GL/glut.h , у меня использовалась библиотека gl/GLU.h.С ней не поддерживаются функции OPENGL,что делать?
Код:

#include<math.h>
#include<stdio.h>
#include<gl/GLU.h>

#define res 1
#define SW 160*res
#define SH 120*res
#define SW2 (SW/2)
#define SH2 (SH/2)
#define pixelScale 4/res
#define GLSW (SW*pixelscale)
#define GLSH (SH*pixelScale)

typedef struct
{
        int fr1, fr2;
}time; time T;

typedef struct
{
        float cos[360];
        float sin[360];
}math; math M;

typedef struct
{
        int w, s, a, d;
        int sl, sr;
        int m;
}keys; keys K;

typedef struct
{
        int x, y, z;
        int a;
        int l;
}player; player P;

void pixel(int x, int y, int c)
{
        int rgb[3];
        if (c == 0) { rgb[0] = 255; rgb[1] = 255; rgb[2] = 0; }
        if (c == 1) { rgb[0] = 160; rgb[1] = 160; rgb[2] = 0; }
        if (c == 2) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 0; }
        if (c == 3) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 0; }
        if (c == 4) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 255; }
        if (c == 5) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 160; }
        if (c == 6) { rgb[0] = 160; rgb[1] = 100; rgb[2] = 0; }
        if (c == 7) { rgb[0] = 110; rgb[1] = 50; rgb[2] = 0; }
        if (c == 8) { rgb[0] = 0; rgb[1] = 60; rgb[2] = 130; }

        glColor3ub(rgb[0], rgb[1], rgb[2]);
        glBegin(GL_POINTS);
        glVertex2i(x * pixelScale + 2, y * pixelScale + 2);
        glEnd();
}

void movePlayer()
{
        if (K.a == 1 && K.m == 0) { P.a -= 4; if (P.a < 0) { P.a += 360; } }
        if (K.d == 1 && K.m == 0) { P.a += 4; if (P.a > 359) { P.a -= 360; } }

        int dx = M.sin[P.a] * 10;
        int dy = M.cos[P.a] * 10;

        if (K.w == 1 && K.m == 0) { P.x += dx; P.y += dy; }
        if (K.s == 1 && K.m == 0) { P.x -= dx; P.y -= dy; }

        if (K.sr == 1) { P.x += dy; P.y -= dx; }
        if (K.sl == 1) { P.x -= dy; P.y += dx; }

        if (K.a == 1 && K.m == 1) { P.l -= 1; }
        if (K.d == 1 && K.m == 1) { P.l += 1; }
        if (K.w == 1 && K.m == 1) { P.z -= 4; }
        if (K.s == 1 && K.m == 1) { P.z += 4; }
}


void clearBackground()
{
        int x, y;
        for (y = 0; y < SH; y++)
        {
                for (x = 0; x < SW; x++) { pixel(x, y, 8); }
        }

}

void drawWall(int x1, int x2, int b1, int b2, int t1, int t2)
{
        int x, y;
        int dyb = b2 - b1;
        int dyt = t2 - t1;
        int dx = x2 - x1;

        if (dx == 0) dx = 1;

        int xs = x1;

        if (x1 < 1) { x1 = 1; }
        if (x2 < 1) { x2 = 1; }
        if (x1 > SW - 1) { x1 = SW - 1; }
        if (x2 > SW - 1) { x2 = SW - 1; }

        for (x = x1; x < x2; x++)
        {
                int y1 = dyb * (x - xs + 0.5) / dx + b1;
                int y2 = dyt * (x - xs + 0.5) / dx + t1;

                if (y1 < 1) { y1 = 1; }
                if (y2 < 1) { y2 = 1; }
                if (y1 > SH - 1) { y1 = SH - 1; }
                if (y2 > SH - 1) { y2 = SH - 1; }

                for (y = y1; y < y2; y++)
                {
                        pixel(x, y, 0);
                }
        }
}

void draw3D()
{
        int wx[4], wy[4], wz[4];
        float CS = M.cos[P.a], SN = M.sin[P.a];

        int x1 = 40 - P.x;
        int x2 = 40 - P.x;
        int y1 = 10 - P.y;
        int y2 = 290 - P.y;

        wx[0] = x1 * CS - y1 * SN;
        wx[1] = x2 * CS - y2 * SN;;
        wx[2] = wx[0];
        wx[3] = wx[1];

        wy[0] = y1 * CS + x1 * SN;
        wy[1] = y2 * CS + x2 * SN;
        wy[2] = wy[0];
        wy[3] = wy[1];

        wz[0] = 0 - P.z + ((P.l * wy[0]) / 32.0);
        wz[1] = 0 - P.z + ((P.l * wy[1]) / 32.0);
        wz[2] = wz[0] + 40;
        wz[3] = wz[1] + 40;

        wx[0] = wx[0] * 200 / wy[0] + SW2;
        wx[1] = wx[1] * 200 / wy[1] + SW2;
        wx[2] = wx[2] * 200 / wy[2] + SW2;
        wx[3] = wx[3] * 200 / wy[3] + SW2;

        wy[0] = wz[0] * 200 / wy[0] + SH2;
        wy[1] = wz[1] * 200 / wy[1] + SH2;
        wy[2] = wz[2] * 200 / wy[2] + SH2;
        wy[3] = wz[3] * 200 / wy[3] + SH2;


        drawWall(wx[0], wx[1], wy[0], wy[1], wy[2], wy[3]);

}

void display()
{
        int x, y;
        if (T.fr1 - T.fr2 >= 50)
        {
                clearBackground();
                movePlayer();
                draw3D();
                T.fr2 = T.fr1;
                glutSwapBuffers();
                glutReshapeWindow(GLSW, GLSH);
        }

        T.fr1 = glutGet(GLUT_ELAPSED_TIME);
        printf(" %i\n", glutGet(GLUT_ELAPSED_TIME) / 1000);
        glutPostRedisplay();
}


void KeysDown(unsigned char key, int x, int y)
{
        if (key == 'w' == 1) { K.w = 1; }
        if (key == 's' == 1) { K.s = 1; }
        if (key == 'a' == 1) { K.a = 1; }
        if (key == 'd' == 1) { K.d = 1; }
        if (key == 'm' == 1) { K.m = 1; }
        if (key == ',' == 1) { K.sr = 1; }
        if (key == '.' == 1) { K.sl = 1; }

}

void KeysUp(unsigned char key, int x, int y)
{

        if (key == 'w' == 1) { K.w = 0; }
        if (key == 's' == 1) { K.s = 0; }
        if (key == 'a' == 1) { K.a = 0; }
        if (key == 'd' == 1) { K.d = 0; }
        if (key == 'm' == 1) { K.m = 0; }
        if (key == ',' == 1) { K.sr = 0; }
        if (key == '.' == 1) { K.sl = 0; }
}

void init()
{
        int x;
        for (x = 0; x < 360; x++)
        {
                M.cos[x] = cos(x / 180 * M_PI);
                M.sin[x] = sin(x / 180 * M_PI);
        }

        P.x = 70;
        P.y = -110;
        P.z = 20;
        P.a = 0;
        P.l = 0;
}

int main(int argc, char* argv[])
{
        glutInit(&argc, &argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowPosition(GLSW / 2, GLSH / 2);
        glutInitWindowSize(GLSW, GLSH);
        glutCreateWindow(" ");
        glPointSize(pixelScale);
        glOrtho2D(0, GLSW, 0, GLSH);
        init();
        glutDisplayFunc(display);
        glutKeyboardFunc(KeysDown);
        glutKeyboardFunc(KeysUp);
        glutMainLoop();

        return 0;
}


p51x 01.04.2024 19:14

Если используете виндовые либы, то перед подключайте Windows.h. Но лучше берите инклуды от драйверных сдк.

Timurkh77 02.04.2024 19:48

Откуда взять библиотеки OpenGL и как их присоединить?

p51x 02.04.2024 20:42

Виндовые есть в винсдк. От производителей драйверов в их сдк.

Timurkh77 03.04.2024 17:28

Вложений: 1
Установил OpenGl , все функции поддерживаются.Осталась одна ошибка не поддерживается константа пи.Выдает ошибку , что не поддерживается константа M_PI.Что делать?

#include<math.h>
#include<stdio.h>
#include<glut.h>

#define res 1
#define SW 160*res
#define SH 120*res
#define SW2 (SW/2)
#define SH2 (SH/2)
#define pixelScale 4/res
#define GLSW (SW*pixelScale)
#define GLSH (SH*pixelScale)

typedef struct
{
int fr1, fr2;
}time; time T;

typedef struct
{
float cos[360];
float sin[360];
}math; math M;

typedef struct
{
int w, s, a, d;
int sl, sr;
int m;
}keys; keys K;

typedef struct
{
int x, y, z;
int a;
int l;
}player; player P;

void pixel(int x, int y, int c)
{
int rgb[3];
if (c == 0) { rgb[0] = 255; rgb[1] = 255; rgb[2] = 0; }
if (c == 1) { rgb[0] = 160; rgb[1] = 160; rgb[2] = 0; }
if (c == 2) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 0; }
if (c == 3) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 0; }
if (c == 4) { rgb[0] = 0; rgb[1] = 255; rgb[2] = 255; }
if (c == 5) { rgb[0] = 0; rgb[1] = 160; rgb[2] = 160; }
if (c == 6) { rgb[0] = 160; rgb[1] = 100; rgb[2] = 0; }
if (c == 7) { rgb[0] = 110; rgb[1] = 50; rgb[2] = 0; }
if (c == 8) { rgb[0] = 0; rgb[1] = 60; rgb[2] = 130; }

glColor3ub(rgb[0], rgb[1], rgb[2]);
glBegin(GL_POINTS);
glVertex2i(x * pixelScale + 2, y * pixelScale + 2);
glEnd();
}

void movePlayer()
{
if (K.a == 1 && K.m == 0) { P.a -= 4; if (P.a < 0) { P.a += 360; } }
if (K.d == 1 && K.m == 0) { P.a += 4; if (P.a > 359) { P.a -= 360; } }

int dx = M.sin[P.a] * 10;
int dy = M.cos[P.a] * 10;

if (K.w == 1 && K.m == 0) { P.x += dx; P.y += dy; }
if (K.s == 1 && K.m == 0) { P.x -= dx; P.y -= dy; }

if (K.sr == 1) { P.x += dy; P.y -= dx; }
if (K.sl == 1) { P.x -= dy; P.y += dx; }

if (K.a == 1 && K.m == 1) { P.l -= 1; }
if (K.d == 1 && K.m == 1) { P.l += 1; }
if (K.w == 1 && K.m == 1) { P.z -= 4; }
if (K.s == 1 && K.m == 1) { P.z += 4; }
}


void clearBackground()
{
int x, y;
for (y = 0; y < SH; y++)
{
for (x = 0; x < SW; x++) { pixel(x, y, 8); }
}

}

void drawWall(int x1, int x2, int b1, int b2, int t1, int t2)
{
int x, y;
int dyb = b2 - b1;
int dyt = t2 - t1;
int dx = x2 - x1;

if (dx == 0) dx = 1;

int xs = x1;

if (x1 < 1) { x1 = 1; }
if (x2 < 1) { x2 = 1; }
if (x1 > SW - 1) { x1 = SW - 1; }
if (x2 > SW - 1) { x2 = SW - 1; }

for (x = x1; x < x2; x++)
{
int y1 = dyb * (x - xs + 0.5) / dx + b1;
int y2 = dyt * (x - xs + 0.5) / dx + t1;

if (y1 < 1) { y1 = 1; }
if (y2 < 1) { y2 = 1; }
if (y1 > SH - 1) { y1 = SH - 1; }
if (y2 > SH - 1) { y2 = SH - 1; }

for (y = y1; y < y2; y++)
{
pixel(x, y, 0);
}
}
}

void draw3D()
{
int wx[4], wy[4], wz[4];
float CS = M.cos[P.a], SN = M.sin[P.a];

int x1 = 40 - P.x;
int x2 = 40 - P.x;
int y1 = 10 - P.y;
int y2 = 290 - P.y;

wx[0] = x1 * CS - y1 * SN;
wx[1] = x2 * CS - y2 * SN;;
wx[2] = wx[0];
wx[3] = wx[1];

wy[0] = y1 * CS + x1 * SN;
wy[1] = y2 * CS + x2 * SN;
wy[2] = wy[0];
wy[3] = wy[1];

wz[0] = 0 - P.z + ((P.l * wy[0]) / 32.0);
wz[1] = 0 - P.z + ((P.l * wy[1]) / 32.0);
wz[2] = wz[0] + 40;
wz[3] = wz[1] + 40;

wx[0] = wx[0] * 200 / wy[0] + SW2;
wx[1] = wx[1] * 200 / wy[1] + SW2;
wx[2] = wx[2] * 200 / wy[2] + SW2;
wx[3] = wx[3] * 200 / wy[3] + SW2;

wy[0] = wz[0] * 200 / wy[0] + SH2;
wy[1] = wz[1] * 200 / wy[1] + SH2;
wy[2] = wz[2] * 200 / wy[2] + SH2;
wy[3] = wz[3] * 200 / wy[3] + SH2;


drawWall(wx[0], wx[1], wy[0], wy[1], wy[2], wy[3]);

}

void display()
{
int x, y;
if (T.fr1 - T.fr2 >= 50)
{
clearBackground();
movePlayer();
draw3D();
T.fr2 = T.fr1;
glutSwapBuffers();
glutReshapeWindow(GLSW, GLSH);
}

T.fr1 = glutGet(GLUT_ELAPSED_TIME);
printf(" %i\n", glutGet(GLUT_ELAPSED_TIME) / 1000);
glutPostRedisplay();
}


void KeysDown(unsigned char key, int x, int y)
{
if (key == 'w' == 1) { K.w = 1; }
if (key == 's' == 1) { K.s = 1; }
if (key == 'a' == 1) { K.a = 1; }
if (key == 'd' == 1) { K.d = 1; }
if (key == 'm' == 1) { K.m = 1; }
if (key == ',' == 1) { K.sr = 1; }
if (key == '.' == 1) { K.sl = 1; }

}

void KeysUp(unsigned char key, int x, int y)
{

if (key == 'w' == 1) { K.w = 0; }
if (key == 's' == 1) { K.s = 0; }
if (key == 'a' == 1) { K.a = 0; }
if (key == 'd' == 1) { K.d = 0; }
if (key == 'm' == 1) { K.m = 0; }
if (key == ',' == 1) { K.sr = 0; }
if (key == '.' == 1) { K.sl = 0; }
}

void init()
{
int x;
for (x = 0; x < 360; x++)
{
M.cos[x] = cos(x / 180 * M_PI);
M.sin[x] = sin(x / 180 * M_PI);
}

P.x = 70;
P.y = -110;
P.z = 20;
P.a = 0;
P.l = 0;
}

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(GLSW / 2, GLSH / 2);
glutInitWindowSize(GLSW, GLSH);
glutCreateWindow(" ");
glPointSize(pixelScale);
gluOrtho2D(0, GLSW, 0, GLSH);
init();
glutDisplayFunc(display);
glutKeyboardFunc(KeysDown);
glutKeyboardFunc(KeysUp);
glutMainLoop();

return 0;
}

p51x 03.04.2024 17:50

Код:

#define _USE_MATH_DEFINES
Сделать перед подключением математики

Timurkh77 03.04.2024 19:23

Сделал включение , теперь поддерживает константу.
Но выдается линковская ошибка , что не считывается файл glut32.lib.
Я делал следующее , скачал файлы:
glut.dll
glut.h
glut.lib
glut32.dll
glut32.lib
Файлы glut.dll и glut32.dll скачал в папку C:\WINDOWS\SYSWOW64
Файл glut.h в папку Programs Files \Microsoft Visual Studio \...\14.35.32215 в каталог include
Файлы glut.lib и glut32.lib в папку ...\14.35.32215 в каталог lib
Но у меня в каталоге lib есть еще три папки:
onecore
x64
x86
Я не знаю , правильно ли я сделал.
Почему-то не поддерживается библиотека glut32.lib.
Что делать?

p51x 03.04.2024 20:56

Выкинуть glut, который уже лет 20 не поддерживается, или хотя бы заменить на freeglut.
Не захломлять виндовые и компиляторные папки.
Определиться под какую разрядность вы компилируете.
Проверить настройки проекта и указана ли там либа.

Timurkh77 04.04.2024 18:18

Библиотека glut.h из примера.Установил библиотеки из youtube-овского примера , как установить OpenGL для Visual Studio.В свойствах программного файла установил ссылку на библиотеки opengl32.lib,glut32.lib,glu32.lib.Н е пойму почему не поддерживается glut32.lib?

Timurkh77 10.04.2024 19:54

Ошибка:пишет не удается открыть файл glut32.lib.Что делать?


02:22.