Для уменьшения зависимостей, делаю загрузчик функций OpenGL.
Используется загрузчик так
//Инициализирую OpenGL 1.5 OpenGLLoader loader(1,5);
Для каждой версии свой заголовок
https://github.com/JordanCpp/Lib-LDL/blob/master/include/LDL/Open… OpenGL1_0.hpp
Инициализирую функции так
#include <LDL/Loaders/OpenGLLoader.hpp> #include <LDL/Core/Library.hpp> #include <LDL/OpenGL/OpenGL1_0.hpp> #include <LDL/Graphics/Gpu/GpuFunctions.hpp> using namespace LDL::Loaders; OpenGLLoader::OpenGLLoader(size_t major, size_t minor) : _Major( major), _Minor( minor) { LDL::Graphics::GpuFunctions _Library; glAccum = ( pglAccum*)_Library.Function( "glAccum"); glAlphaFunc = ( pglAlphaFunc*)_Library.Function( "glAlphaFunc"); glAreTexturesResident = ( pglAreTexturesResident*)_Library.Function( "glAreTexturesResident"); glArrayElement = ( pglArrayElement*)_Library.Function( "glArrayElement"); glBegin = ( pglBegin*)_Library.Function( "glBegin"); glBindTexture = ( pglBindTexture*)_Library.Function( "glBindTexture");
Вопрос, как правильно объявить прототипы функций OpenGL? Сейчас это выглядит так, что не правильно, но не могу понять как правильно.
typedef void (pglVertex4sv)( const GLshort* v); typedef void ( pglVertexPointer)( GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); typedef void ( pglViewport)( GLint x, GLint y, GLsizei width, GLsizei height); pglAccum* glAccum = NULL; pglAlphaFunc* glAlphaFunc = NULL;
Для того, что бы загрузить динамически все функции OpenGL и новый и старые, делаю так
void* GpuFunctionsImpl::Function(const char* name) { void* p = ( void*)wglGetProcAddress( name); if ( p == 0 || ( p == ( void*)0x1) || ( p == ( void*)0x2) || ( p == ( void*)0x3) || ( p == ( void*)-1)) { p = _Library.Function( name); } return p; }
Aroch
> Если так, то возможно проще будет воспользоваться glDrawPixels
Ок. Спасибо, посмотрю.
Cheb
> При эффектах с рендером в текстуру брали текстуру 1024х1024 для 800х600 и
> 1024х768 и использовали только часть её.
Ок. Добавлю проверку и буду создавать квадратную текстуру. Сейчас я создаю именно текстуру по размеру экрана.
Cheb
> Ну, просто "рисование в текстуру" и вуду - это две вещи несовместные. Не по
> Сеньке шапка. Не было тогда такого, обходились без.
> GeForce 2 MX 400 ещё как-то тянет, крякнув, пёрднув, и с трудом вытягивая 60
> фпс на голом кубике. Но вторая жифорсина - это уже другая эпоха.
Спасибо за инфу.
JordanCpp
Вот я не пойму твой посыл. Ты решил по собственному желанию скатиться в "каменный век".
Поддерживая, железо и софт, которого ни у кого уже нет. Тут как бы вопросов нет, имеешь полное право, но тогда какого лешего терроризируешь людей на форуме?
Размер текстур со степенью двойки, это только начало и впереди много "веселухи". OpenGL причесали только к версии 4.5-4.6. Тебе придётся написать кучу "костылей" в коде, потратить своё время на решение задач, по воссозданию прежних проблем, которые уже исправлены в новых версиях.
> //Инициализирую OpenGL 1.5
К счастью бронтозавры вымерли
> Инициализирую функции так
Они все устаревшие.
Funtik
> но тогда какого лешего терроризируешь людей на форуме?
Данный сайт лучший русскоязычный сайт по разработке игр. Здесь полно матерых геймдев разработчиков. Где как не здесь задавать вопросы? На сайте Unity? У них слишком тонкая душевная ориентация:)
И если бы я прям террорезироал форум. Меня бы модераторы давно выпилили:)
Funtik
> Вот я не пойму твой посыл. Ты решил по собственному желанию скатиться в
> "каменный век".
> Поддерживая, железо и софт, которого ни у кого уже нет.
Совершенно верно. Еще будет поддержка ms-dos. Мой посыл написать фреймворк с поддержкой старых и новых систем. Это поддержка не только Voodoo3, но и всякие GMA Intel и т.д
Funtik
Я нахожу чарующее в том, что бы прикоснуться в программном коде, к старым системам, инструментам и подходам. Я юзер с Old-Games.ru ну ты понял:) И еще мне не нравится как быстро устаревает железо и системы.
Свои мотивы к данному безобразию описал в следующих статьях, тут и тут.
JordanCpp
Вот не знаю как ты, а я начинаю испытывать депрессию, когда понимаю, что делаю бесполезную, никому не нужную работу.
У немцев во время ВОВ такая пытка была, они сгоняли пленных на замёрзшую реку и заставляли носить воду ведрами, из одной проруби черпают, а в другую носят выливают. И несколько часов так работали. Человек после такой работы надламывается, разрушается изнутри, от бессмысленности действий.
JordanCpp
> И еще мне не нравится как быстро устаревает железо и системы.
У меня лет десять валяется видюха ATI Radeon X800 GTO2 (SAPPHIRE)
Поддерживает OGL 2.0, DX9, стоила реальных денег - $200
Могу продать, если нужно...
Funtik
Моя цель написать аналог SDL2 но на С++. Но с поддержкой старых и новых систем. Для разработки я ограничил себя стандартом С++ 98. Но юзающие фреймворк могут использовать любой современный стандарт С++. Фреймворк предоставляет высокоуровневый API, то что он будет запускаться на любом утюге, жто чисто моё желание.
Фреймворк не бесполезен. Поддержка старого железа занимает 1000 строк. Ну как бы не о чем. Мне еще интересно как раньше писали игры и т.д
Funtik
> У меня лет десять валяется видюха ATI Radeon X800 GTO2 (SAPPHIRE)
> Поддерживает OGL 2.0, DX9, стоила реальных денег - $200
> Могу продать, если нужно...
У меня есть. Я ищу железо старее, что бы нативно тестировать свой фреймворк. Но за предложение спасибо:)
Для меня athlon 3000+ (2003) это уже новодел:)
JordanCpp
> Какие есть еще варианты задействовать OpenGL и рисовать пиксели на экране?
glDrawPixels
> Теперь я начинаю понимать, для чего дропают поддержку старого железа и систем. Что бы не писать лишний код учитывающий наслоения говн мамонта начиная с мезозоя:)
Вот. В дошейдерные времена был совсем другой GL, ничего общего с современным
> вплоть Ms-Dos, PS2
Упороться софтрендером. Все равно не сделаешь одинаково с GL. Еще Glide тогда уж вспомни
> делаю загрузчик функций OpenGL
glee?
Функции, которых нет в поддерживаемой версии GL иногда можно загрузить через расширения ARB, EXT итд
> Моя цель написать аналог SDL2 но на С++
Это аналог SFML
Рендерферма кроликов
> Упороться софтрендером. Все равно не сделаешь одинаково с GL. Еще Glide тогда
> уж вспомни
Для систем без аппаратного ускорения есть отдельный API CpuRender. Он схож с абстракцией над аппаратным. Я реализую 2D графику. Софтверный ogl делать не нужно.
Рендерферма кроликов
> Это аналог SFML
У него есть фатальный недостаток:)
Разобрался с загрузкой функций OpenGL.
Для порядка сигнатуры функций и дефайны для каждой версии будут находиться в своём hpp файле.
К примеру для инициализации OpenGL 4.6 будут инициализированы всё предыдущие версии, 1.0, 1.2 и в плоть по 4.6.
Классу загрузчику можно указать конкретную версию и проверить доступен ли запрашиваемый функционал.