Войти
ФлеймФорумПрограммирование

Убогость OpenGL API

Страницы: 1 2 338 39 Следующая »
#0
10:28, 3 июля 2012

Я конечно понимаю что десятки лет назад некогда было думать и проектировать - надо было кодить. А потом легаси, чёрт его побери, легаси давило и не давало дышать.
Но когда уже OpenGL 3.0, 4.0 бодяжили - ведь многое почистили, многое вытряхнули, но почему не пересмотрели уж совсем убогие вещи?!

За примерами в карман лезть далеко не надо.
Любой новичок подтвердит что обеими ногами всегда и не один раз вступал в типичную для OGL траблу: забыл отключить какой нибудь буфер или стейт в конце предыдущего кадра, отчего следующий "поплыл". Это меня всегда бесило и бесит до сих пор, да и не только меня. Тысячи нас.

Все знают что основу GL API составляет plain C подход с хэндлами. Но даже его они извратили так как никакой другой API с хендлами не работает.
Например функции генерации хендлов, как например:

glGenTextures(  GLsizei    n,  GLuint *    textures) 
и иже с ней.
На типобезопасность - плюём, размер массива - вручную контролируемая величина. Но хуже даже концепт - почему то предполагается что есть реальная потребность архибыстро генерировать кучу хендлов. Как потом их из массива распихивать по целевым местам - никто не подумал конечно же. То что это явно не приоритет - генерировать кучу текстурных хендлов - никто так в реальном коде не делает - да просто незачем, и какая то экономия на вызовах функции тут просто бессмысленная экономия на спичках. Должно быть так:
GLuint texId = glGenTexture(); 
Сравнитие с:
GLuint texId;
glGenTexture( 1, &texId );
Просто замусоривание кода, вот что это такое. Бессмысленное и ненужное.

Ну сегенерировали хендл с грехом пополам. Но дальше - то про что я уже говорил - начинаются какие то мутные концепции "текущей текстуры" и функции работающие с текстурами вместо того как полагается в приличном хендл-ориентированном API не принимают хендл на текстуру, а блин полагаются на то что текстура должна быть выбрана как текущая. Т.е. даже не для задачи собственно рендера (о нём отдельная речь), а просто для того чтобы модифицирнуть какую то текстуру - нужно блин:

glBindTexture( texId );
glglTexImage2D( ... );
вместо более логичного и не забивающего "стейты":
glTexImage2D( texId, ... ); // первый парамтр в функцию - хендл!
Адепты могут возразить что glTexImage2D может работать без текущей текстуры грузя сырые данные в видеопамять по месту вызова - но блин так никто в реальном проекте не делает! Отбросили же шелуху в GL 3.0, разве не?
А ведь код становится монолитнее - труднее забыть и даже перепутать хендлы текстур (как я уже говорил - самая частая ошибка в OGL - путание в стейтах и "текущих" объектах), не надо биндить хендл влияя на рендер-стейты чтобы просто модифицировать текстуру. Это же очевидно!
В конце концов - почему код инициализирующий текстуру должен начинаться с команды которая предназначена для рендера? Убого...

Думаете всё? Не, этот вопрос можно обсуждать почти бесконечно, пока всю спецификацию не вычитаешь от корки до корки.
Без труда вспоминаются многострадальные VBO. Ну сделали как расширение, ну пришли к концепту GAPI памяти - но зачем пытаться экономить на спичках и использовать для работы с новым концептом старые функции? А именно glVertexPointer - бывший параметр типа void * указывающий на память, вдруг зачем то "зареюзали" и уже договорились ложить в него целое число, что приводит к уродливому коду вида:
glVertexPointer( ... , (void *) idx );
Вот это (void *) - оно кому надо? Для красоты? Сэкономили, да? Почему бы раз уж ввели новые функции по работе с VBO не сделать и:
glVertexPointerVBO с красивой сигнатурой?
Убого...

И кстати да, не холивар.


#1
10:29, 3 июля 2012

*бегом за попкорном!!!

#2
10:30, 3 июля 2012
facepalm | Убогость OpenGL API

почему не в флейме ?
кастую сюда Andrey :):):)
#3
10:32, 3 июля 2012

=A=L=X=
> . Но дальше - то про что я уже говорил - начинаются какие то мутные концепции
> "текущей текстуры" и функции работающие с текстурами вместо того как полагается
> в приличном хендл-ориентированном API не принимают хендл на текстуру, а блин
> полагаются на то что текстура должна быть выбрана как текущая

OpenGL - хрень

Это условно пофиксено.
http://steps3d.narod.ru/tutorials/dsa-tutorial.html
#4
10:35, 3 июля 2012

=A=L=X=
> GLuint texId = glGenTexture();

А если glGenTexture() сфейлит, что он вернёт texId?  нолик? уж лучше так:

GLuint texId;
GLresult = glGenTexture( 1, &texId );
#5
10:38, 3 июля 2012

TheGrayWolf
> А если glGenTexture() сфейлит, что он вернёт texId? нолик?
Из 4294967296 индексов уж можно выбрать нидекс фейла. Да, тот же нолик.

GLuint texId = glGenTexture();
if(!texId) MessageBox(0, "Fuck your OpenGL!", "Error", 0);
#6
10:40, 3 июля 2012
GLuint alxGenTexture()
{
GLuint texId;
glGenTexture( 1, &texId );
return texId;
}
пользуйтесь, сэр :)
#7
10:42, 3 июля 2012

-Eugene-
Так не делается,
кроме самого факта фейла не плохо получить и номер ошибки, см DX.

#8
10:43, 3 июля 2012

TheGrayWolf
Если фейл, зовем glGetError.

#9
10:45, 3 июля 2012

TheGrayWolf
> А если glGenTexture() сфейлит, что он вернёт texId?  нолик? уж лучше так:

Нолик - отличный ход, куча API именноо так хендлы и возвращает в случае ошибки (fopen как пример).
А теперь ответь мне как по спецификации OpenGL 4.3 ты должен проверять ошибку функцией:

void glGenTextures(  GLsizei    n,
  GLuint *    textures);

Пруфлинк: http://www.opengl.org/sdk/docs/man4/
Мде...

#10
10:52, 3 июля 2012

HolyDel
> GLuint alxGenTexture()

Почему я должен работать за ARB комитет и еще и замусоривать свой код при этом вспомогательными функциями?

#11
10:53, 3 июля 2012

TheGrayWolf
> Если фейл, зовем glGetError.
Это дальше усложнит код.

-Eugene-
> Из 4294967296 индексов уж можно выбрать нидекс фейла
А это из разряда «640КБ должно хватить всем»

=A=L=X=
> А теперь ответь мне как по спецификации OpenGL 4.3 ты должен проверять ошибку функцией:
А я не спорю, я свой вариант предложил выше :)

#12
10:55, 3 июля 2012

=A=L=X=
> конечно понимаю что десятки лет назад некогда было думать и проектировать -
> надо было кодить.

"и тут Остапа понесло..." :)

ok, отчего же при всей "убогости" апи, до сих пор не предоставили альтернативу ?

#13
10:57, 3 июля 2012

=A=L=X=
> А теперь ответь мне как по спецификации OpenGL 4.3 ты должен проверять ошибку
> функцией:
> void glGenTextures( GLsizei n,
> GLuint * textures);
Что-то я не вижу, чтобы их надо было вообще проверять...

Errors
            GL_INVALID_VALUE is generated if n is negative.
       
            GL_INVALID_OPERATION is generated if glGenTextures is executed
            between the execution of glBegin and the corresponding
            execution of glEnd.

Наверное, ассерты в дебаге с glGetError.

Про стейты: одеваешь один раз враппер и не паришься, если надо.

#14
10:57, 3 июля 2012

-Eugene-
> Это условно пофиксено.
> http://steps3d.narod.ru/tutorials/dsa-tutorial.html

О! Вот это - тема! Только всё опять через попу - вместо того чтобы это расширение сделать единственным правильным вариантом в GL 3.0/4.0 оставили старый, а этот подход сделали расширением. Ну блин, и какого фига, надо проверить сделали ли его хотя бы обязательным расширением с какой то версии...

Страницы: 1 2 338 39 Следующая »
ФлеймФорумПрограммирование