PMG

Форумы по созданию игр
Текущее время: 21 сен 2021 07:00

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Помогите начинающему.
СообщениеДобавлено: 25 ноя 2007 20:32 
Не в сети
Новичок

Зарегистрирован: 25 ноя 2007 20:22
Сообщения: 2
Вобщем проблема такая. Захотел я попробовать ченить сделать используя opengl.

Нашел программку которая якобы работает (ссылку сразу давать не буду чтоб не подумали что это реклама)

Вот листинг -

Код:
#include <stdlib.h>

/* подключаем библиотеку GLUT */
#include <gl/glut.h>

/* начальная ширина и высота окна */
GLint Width = 512, Height = 512;

/* размер куба */
const int CubeSize = 200;

/* эта функция управляет всем выводом на экран */
void Display(void)
{
    int left, right, top, bottom;

    left  = (Width - CubeSize) / 2;
    right = left + CubeSize;
    bottom = (Height - CubeSize) / 2;
    top = bottom + CubeSize;

    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
   
    glColor3ub(255,0,0);
    glBegin(GL_QUADS);
      glVertex2f(left,bottom);
      glVertex2f(left,top);
      glVertex2f(right,top);
      glVertex2f(right,bottom);
    glEnd();

    glFinish();
}

/* Функция вызывается при изменении размеров окна */
void Reshape(GLint w, GLint h)
{
    Width = w;
    Height = h;

    /* устанавливаем размеры области отображения */
    glViewport(0, 0, w, h);

    /* ортографическая проекция */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, 0, h, -1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/* Функция обрабатывает сообщения от клавиатуры */
void Keyboard(unsigned char key, int x, int y)
{
#define ESCAPE '\033'

    if( key == ESCAPE )
        exit(0);
}

/* Главный цикл приложения */
main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(Width, Height);
    glutCreateWindow("Red square example");

    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutKeyboardFunc(Keyboard);

    glutMainLoop();
}


В конце статьи где приведен листинг написано следующее
Цитата:
Несмотря на малый размер, это полностью завершенная программа, которая должна компилироваться и работать на любой системе, поддерживающей OpenGL и GLUT.


Вобщем в итоге ниче не получилось у меня чтоб она заработала, помогите разобраться с этим.
Дальше скрин на чем я остановился.

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 26 ноя 2007 09:41 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
После include поставь: #pragma comment( lib, "opengl32.lib" )

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 ноя 2007 21:04 
Не в сети
Новичок

Зарегистрирован: 25 ноя 2007 20:22
Сообщения: 2
разобрался уже, opengl32.lib был какой-то битый, заменил и все заработало.

еще для visual c++ 7/8 нужно перед мейин int поставить, для чего незнаю но работает )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: 20 авг 2008 18:03 
Не в сети
Новичок

Зарегистрирован: 20 авг 2008 15:36
Сообщения: 1
Iverton писал(а):
еще для visual c++ 7/8 нужно перед мейин int поставить, для чего незнаю но работает )

Отжег :). Давно так не смеялся.
Это не только для 7/8 нужно ставить int или void, но так же для всего ANCI C++, в соответствии со стандартом....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 20 авг 2008 21:26 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 28 янв 2008 19:24
Сообщения: 230
Откуда: Санкт Петербург
Цитата:
Отжег :). Давно так не смеялся. Это не только для 7/8 нужно ставить int или void, но так же для всего ANCI C++, в соответствии со стандартом....

Я тоже давно так не смеялся. :D Кстати можна ставить не только int или void, но и любой другой тип.
Вот глядите:
Код:
#include <stdio.h>

char main()
{
printf("Hello World\n");

return '0';
}

_________________
С уважением, Андрей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: 25 авг 2008 11:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Iverton писал(а):
разобрался уже, opengl32.lib был какой-то битый, заменил и все заработало.

еще для visual c++ 7/8 нужно перед мейин int поставить, для чего незнаю но работает )


По завершению работы всякая прога возвращает операционке код своего завершения. Например, это можно использовать в командных файлов, через переменную errorlevel. Вот этот int и есть код завершения.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 20 янв 2010 12:22 
Не в сети
Любитель

Зарегистрирован: 19 янв 2010 15:58
Сообщения: 14
Откуда: Комсомольск-на-Амуре
Начал разбираться с OpenGL, и сразу появились вопросы. Что означает формат (например для цвета) 0.0f? Если это шестнадцатеричное число, то что обозначает точка? Может я просто не догоняю. В WinAPI на каждый цвет (RGB) идет, к примеру, один байт и его интенсивность определяется числом 0 - ff. Этот формат я пока понять не могу. По системе координат я не могу разобраться, что такое одна единца. Она определяется в количестве пикселей, процента от длины экрана или от каких-либо других величин? Буду очень благодарен за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 20 янв 2010 18:22 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
Это не шестнадцатеричное число, а просто приведение к типу float: если написать 0.0 то это будет тип double, а если 0.0f то float
По-моему совершенно ненужная вещь, я нигде не ставлю эту f, и убрал в компиляторе warning на эту тему.
А в системе координат сам задавай что является у тебя единицей, всё зависит от размеров твоих моделей. Я например взял за 1 метр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 21 янв 2010 14:27 
Не в сети
Любитель

Зарегистрирован: 19 янв 2010 15:58
Сообщения: 14
Откуда: Комсомольск-на-Амуре
Большое спасибо, насчет float я действительно затупил. Не понятно, зачем использовать дробь для реализации цвета? По-моему в API это сделано намного лучше. Получается в каждой градации цвета всего 10 степеней интенсивности?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 21 янв 2010 15:04 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
В OpenGL тоже можно использовать цвета от 0 до 255, для этого пользуйся функцией glСolor3ub() вместо glСolor3f().
Не знаю, но мне кажется в итоге все цвета переводятся в дроби т.к. в шейдерах используется дроби для цветов, а там вряд ли стали бы делать дроби просто так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 22 янв 2010 12:33 
Не в сети
Любитель

Зарегистрирован: 19 янв 2010 15:58
Сообщения: 14
Откуда: Комсомольск-на-Амуре
Большое спасибо. Буду дальше изучать Великий и Могучий OpenGL )))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 23 янв 2010 12:43 
Не в сети
Любитель

Зарегистрирован: 19 янв 2010 15:58
Сообщения: 14
Откуда: Комсомольск-на-Амуре
А еще меня давно мучает такой вопрос. Exe-программа использует библиотеки OpenGL, установленные на компьютере или компилятор вставляет их в код программы? Если библиотеки внешние, то можно ли вставить их в код?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 23 янв 2010 14:34 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
использует внешнюю библиотеку opengl32.dll Включить ее в ехе не знаю как, да и зачем? Она поставляется вместе с драйверами для видеокарты. И opengl32.dll зависти от винды: например в XP х86 opengl32.dll имеет размер ~600 кб, на windows 7 x86 ~800, на windows 7 x64 ~1мб.
И если использовать не тот opengl32.dll, то на этой проверке
Код:
if (!glewIsSupported( "GL_VERSION_2_0" ))
{                      
         MessageBox(hWnd, "Ваша видеокарта не поддерживает: GL_VERSION_2_0", "Ошибка", MB_ICONERROR | MB_OK);
         return FALSE;
}
выдает FALSE. Очень долго ломал голову почему возвращает FALSE даже на самых новых видяхах, а у меня всё работает, пока не поставил две версии 7 и обнаружил различия между размерами opengl32.dll. Так что нужно поставлять с игрой для каждой винды свою библиотеку или надеяться что в system32 лежит нужная opengl32.dll


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 23 янв 2010 20:59 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Не совсем так. В opengl32.dll, который поставляется с Visual C++ включены только функции версии 1.2. Все остальные функции можно например получить через glee или glew. В самой системе windows есть два типа драйверов ogl: MCD - Mini Client Driver (урезанная версия аппаратной поддержки OpenGL - аппаратно поддерживает только некоторые функции OpenGL, остальное поддерживается программной реализацией; ICD - Installable Client Driver - полная поддержка OpenGL API реализации версии... которая зависит от производителя.
Код:
DescribePixelFormat(hDC_ogl_win, pixelFormat,sizeof pfd_ptr, &pfd_ptr);
#ifdef YES_DEBUG
  {
    int pal, mcd, acc, icd, opengl, window, bitmap, dbuff;
         pal = (pfd_ptr.iPixelType == PFD_TYPE_COLORINDEX);
      // MCD - Mini Client Driver (урезанная версия аппаратной поддержки OpenGL - аппаратно поддерживает
      // только некоторые функции OpenGL, остальное поддерживается программной реализацией.
      // ICD - Installable Client Driver - полная поддержка OpenGL API реализации 1.2
      // PFD_GENERIC_ACCELERATED PFD_GENERIC_FORMAT   Смысл
      //  0                       0                     полноценный ICD-драйвер с функциями ускорения   
      //  0                       1                     <недопустимая комбинация>   
      //  1                       0                     режим программной эмуляции; всю работу выполняет центральный процессор   
      //  1                       1                     MCD-драйвер; аппаратно реализуется только часть функций ускорения
         mcd = ((pfd_ptr.dwFlags & PFD_GENERIC_FORMAT) && (pfd_ptr.dwFlags & PFD_GENERIC_ACCELERATED));
         acc = !(((pfd_ptr.dwFlags & PFD_GENERIC_FORMAT) &&!(pfd_ptr.dwFlags & PFD_GENERIC_ACCELERATED)));
         icd = (!(pfd_ptr.dwFlags & PFD_GENERIC_FORMAT) &&!(pfd_ptr.dwFlags & PFD_GENERIC_ACCELERATED));
         opengl = (pfd_ptr.dwFlags & PFD_SUPPORT_OPENGL) ? true :false;
         window = (pfd_ptr.dwFlags & PFD_DRAW_TO_WINDOW) ? true :false;
         bitmap = (pfd_ptr.dwFlags & PFD_DRAW_TO_BITMAP) ? true :false;
         dbuff   =!!(pfd_ptr.dwFlags & PFD_DOUBLEBUFFER);
      log_debug(
        "/OGL_WIN3D/PixelFormat: pixelFormat=%d, bpp=%d, depth=%d, stencil=%d, alpha=%d, accum=%d, pal=%d, mcd=%d, acc=%d, icd=%d, opengl=%d, window=%d, bitmap=%d dbuff=%d PFD_GENERIC_FORMAT=%d PFD_GENERIC_ACCELERATED=%d",
        pixelFormat, pfd_ptr.cColorBits, pfd_ptr.cDepthBits, pfd_ptr.cStencilBits, pfd_ptr.cAlphaBits, pfd_ptr.cAccumBits, pal, mcd, acc, icd, opengl, window, bitmap, dbuff,
        pfd_ptr.dwFlags & PFD_GENERIC_FORMAT, pfd_ptr.dwFlags & PFD_GENERIC_ACCELERATED);
  }
#endif

  if ( GLeeInit()==GL_FALSE ) {
     log_message("%s: %s","GLeeInit Error","");
     return return_error(IS_ERROR,"%s",(char*)GLeeGetErrorString());
  }
  GLeeFunc();

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите начинающему.
СообщениеДобавлено: 23 янв 2010 21:00 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
В некоторых случаях icd драйвера на компе нет, или он может быть не задействан...

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB