Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL - не инициализируется 
:(
    Опции темы
Arks
Дата 10.4.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Класс реализует рендеринг с использованием OpenGL API. Написан на VS2005, для использования в .net проектах.
OpenGL не инициализируется (на ф-ции wglCreateContext). В других проектах (предыдущих), использующих подобный код инициализации и теже настройки pdf, всё работает.
Код класса:
Код

namespace Rendering
{

    using namespace System;

    /// Класс реализует рендеринг с использованием OpenGL API
    public ref class GLRenderer
    {
        // Данные
    private:
        HWND WindowHandle;                        // Handle to the window
        HDC Hdc;                                // Device context
        HGLRC Hrc;                                // Rendering context
        GLsizei Height;                            // Window height
        GLsizei Width;                            // Window width
        __int32 ColorDepth;                        // Color depth
        __int32 ZBufferDepth;                        // Z-Buffer depth: 16 or 32 bits
        unsigned __int32 OGL_CLEAR_MASK;                    // What buffers are we using? ( color buffer, depth buffer, etc.)

        // Методы
    public:
    ...
        /// Инициализирует OpenGL
        bool Initialize(IntPtr windowHandle, __int32 height, __int32 width, __int32 colorDepth, __int32 zBufferDepth)
        {
            UInt32 clearMask = GL_COLOR_BUFFER_BIT;
            WindowHandle = (HWND) windowHandle.ToPointer();
            Height         = (GLsizei) height;
            Width         = (GLsizei) width;
            ColorDepth     = colorDepth;
            ZBufferDepth = zBufferDepth;
            if(zBufferDepth > 0)
                clearMask |= GL_DEPTH_BUFFER_BIT;

            PIXELFORMATDESCRIPTOR pfd;
            Int32 ipfd;

            // Выставить формат пикселей
            memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));
            pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
            pfd.nVersion = 1;
            pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_TYPE_RGBA;
            pfd.cColorBits = ColorDepth;
            pfd.cDepthBits = ZBufferDepth;
            pfd.iLayerType = PFD_MAIN_PLANE;
        /*
                        ...    
                      (Тоже, что и выше. Инициализация pfd, но расписанная по каждому пункту (т.е. куча pfd.что-то = 0; )) 
                */

            if(!Hdc)
                Hdc = GetDC(WindowHandle);
            ipfd = ChoosePixelFormat(Hdc,&pfd);
            if(!SetPixelFormat(Hdc,ipfd,&pfd))
            {
                return false;
            }

            // Создаём rendering context
            if(!Hdc)
            {
                return false;
            }
            Hrc = wglCreateContext(Hdc);
            if(!wglMakeCurrent(Hdc,Hrc))
            {
                return false;        // Заходит сюда, т.к. в wglCreateContext Hrc не устанавливается (остается underfind)
            }

            // Выставляем параметры различные
            glClearColor(0.0f,0.0f,0.0f,1.0f);    // Чёрный цвет фона
            if(ZBufferDepth)
            {
                glEnable(GL_DEPTH_TEST);
            }
            glEnable(GL_LIGHTING);
            glEnable(GL_LIGHT0);
            // Настроить размеры
            Resize(Height,Width);
            return true;
        }
            ...
}


Функция из класса формы, в которой вызывается инициализация:

Код

public ref class Form1 : public System::Windows::Forms::Form
    {
        // Данные
    private:
        GLRenderer ^rnd;
        // Методы
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
            rnd = gcnew GLRenderer();
            if(!rnd->Initialize(this->Handle,this->Height,this->Width,16,16))
            {
                // Инициализация провалилась
                MessageBox::Show(this,"Could not initialize OpenGL!");
                rnd = nullptr;
            }
        }
   ...


PM MAIL ICQ Skype MSN   Вверх
Arks
Дата 10.4.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Сам же и закрываю этот вопрос.
Решение такое:
Код
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;


Добавлено через 14 минут и 19 секунд
Поспешил...
Первая ошибка была "Invalid window handle".
А handle я получаю так:
WindowHandle = (HWND) windowHandle.ToPointer();
(В начале функции Initialize)

"invalid window handle" появляется после:
ipfd = ChoosePixelFormat(Hdc,&pfd);
До вызова этой функции её нет - проверял (понаставил кучу GetLastError)

PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.