LINUX.ORG.RU
ФорумTalks

Direct3D

 


1

1

Вот не понимаю, 2013-ый год на дворе, всякие планшеты-смартфоны на каждом шагу, линуксы-макоси начинают претендовать на роль игровых платформ, а игроделы всё продолжают использовать DirectX и конкретно Direct3D. Почему бы не перейти обратно на OpenGL? Ведь плюсы очевидны - не нужно писать рендер отдельно для Windows и отдельно для всех остальных, можно написать один код с некоторым количеством ifdef-ов, кода получится меньше - а значит, тестировать будет проще, следовательно, потенциально будет меньше ошибок.
Более того, почему гугль сделал транслятор из OpenGL в Direct3D? Неужели у OpenGL под вендой такие проблемы? Ни разу такого не замечал.


Direc3D сделана куда умнее, и работать с ним приятнее. Вот бы его открыли, а OpenGL закопали.

dmfd
()

Почему бы не перейти обратно на OpenGL

Это все равно что писать sql запрос на ассемблере, есть же куча библиотек облегчающих это занятие в разы.

splinter 👍👍👍
()
Ответ на: комментарий от dmfd

Но ведь всё равно придется писать для андроида и ios.

h31
() автор топика

Раз это Talks, предложу ТС написать два Helloworld с двигающимся спрайтом на обеих библиотеках, и после ответить на свой вопрос.

Deleted
()
Ответ на: комментарий от splinter

Напрямую используется ли OpenGL или через какую-нибудь либу - в контексте моего вопроса не суть важно.

h31
() автор топика
Ответ на: комментарий от note173

Просвети пожалуйста, я использовал полигон с текстурой в 3д пространстве, других методов не видел.

Deleted
()
Ответ на: комментарий от note173

В смысле D3DX ?

// Вопрос был про OpenGL, есть ли какая-то возможность по более удобно реализовать спрайты ?

Deleted
()
Ответ на: комментарий от Deleted

Хотя, я смотрю, d3dx уже выкинули. Он сильно упрощал разработку простых приложений, много нужных функций.

Про спрайты — да все точно так же, как в d3d. Заполняем буферы и отправляем рисоваться. Часть работы можно перенести на шейдеры. Есть расширения для оптимизации некоторых случаев.

note173
()

Почему бы не перейти обратно на OpenGL?

Переходят помаленьку (см. HIB, Steam, Kickstarter). Даже CD Project RED OGL-рендером разродились для второго Ведьмака.

Неужели у OpenGL под вендой такие проблемы? Ни разу такого не замечал.

Например в драйверах, идущих в комплекте с системой, поддержки OpenGL нет.

RussianNeuroMancer
()
Ответ на: комментарий от RussianNeuroMancer

Например в драйверах, идущих в комплекте с системой, поддержки OpenGL нет.

О как, не знал. Видимо, как раз из-за этого и сделали транслятор. Но для игр это не очень актуально - не знаю как сейчас, а раньше почти всегда на диске имелись свежие драйвера.

h31
() автор топика
Ответ на: комментарий от dmfd

Вот бы его открыли

В смысле открыли? API на уровне исходного кода вроде открыто, иначе как бы программы писали. Есть патентные ограничения?

Ttt
()
Ответ на: комментарий от Ttt

Есть патентные ограничения?

Я слышал, там серьёзные (маразматические) ограничения на распространение самих библиотек. Прибавим к этому несовместимость даже минорных версий, и получаем dll hell.

kranky
()
Ответ на: комментарий от Ttt

Более того, были энтузиасты, которые пилили его для месы.

buddhist ☕☕☕☕
()
Ответ на: комментарий от kranky

А зачем нам вендобиблиотеки на других платформах? OpenGL же — это только спецификация. Mesa никакого отношения к Khronos Group не имеет.

Ttt
()
Ответ на: комментарий от stevejobs

Ну не знаю, судя по написанному note173 моего гугль-скилла не хватило. Хотя вполне возможно, я не сильно старался, давно это было.

Deleted
()
Ответ на: комментарий от kranky

Нельзя взять какую-то отдельную либу и тащить со своей игрой. С другой стороны, т.к. в системе есть очень жесткие ограничения на версионирование некоторых либ, ты должен тащить с собой именно ту либу, под которую ты писал на девелоперской машине. Если они где-нибудь там в восьмой цифре после точки в номере версии не совпадут - все, кирдык. Это точно так для XNA, для ядра директикса не знаю. Плюс то, что формально более старшая версия .NET должна иметь в себе файлы более младшей, а на практике это не так. Поэтому все производители игр просто тащат с собой весь DirectX+XNA runtime, плюс VisualC runtime, плюс .NET runtime разных версий (стало менее актуально в 8ке, где напрямую 1й и 2й .NET запретили устанавливать из файлов инсталлятора - этим сломалась куча прог), и в обязаловку прогоняют установщики всего этого хлама сразу же после установки файлов игры.

stevejobs
()
Ответ на: комментарий от stevejobs

Это точно так для XNA

Хорошо, что его решили закопать.

kranky
()

Ведь плюсы очевидны - не нужно писать рендер отдельно для Windows и отдельно для всех остальных, можно написать один код с некоторым количеством ifdef-ов, кода получится меньше - а значит, тестировать будет проще, следовательно, потенциально будет меньше ошибок.

Помечтай, ага. OpenGL дрова для винды кривее линуксовых и если игра разрабатывается в линуксе а потом соберётся в винде то увиденное может сильно огорчить.

Неужели у OpenGL под вендой такие проблемы?

У плюсовиков КУУУУча проблем с переносимостью кода, вроде бы он переносится но что-то го#$#$$%но как-то.

Ни разу такого не замечал.

Если игра изначально виндовая, то она искаропки адаптирована к плохому виндовому OpenGL и перенести её на хороший линуксовый будет не так сложно. Если переносить в другую сторону, то возможно будет проще использовать директ и не мучаться.

Napilnik
()

всё продолжают использовать DirectX и конкретно Direct3D. Почему бы не перейти обратно на OpenGL?

Потому что это невыгодно, ваш КО!

zgen
()
Ответ на: комментарий от zgen

Потому что это невыгодно, ваш КО!

Не выгодно писать игру, которую легче портировать на 3 платформы разом? Плюс консоли и смартфоны.

Не выгодно это только для хыбокса. Но тут уже ссзб.

roman77
()
Ответ на: комментарий от dmfd

Direc3D сделана куда умнее, и работать с ним приятнее. Вот бы его открыли, а OpenGL закопали.

Чувствуются слова теоретика. В прямых иксах разные версии несовместимы друг с другом и плавного перехода на новую версию не допускают, в отличие от.

quiet_readonly
()
Ответ на: комментарий от roman77

Не выгодно писать игру, которую легче портировать на 3 платформы разом? Плюс консоли и смартфоны.

Не выгодно выпускать игру, которая будет тормозить и давать артефакты гораздо чаще конкурентов из-за плохих дров. Это под оффтопиком, разумеется.

quiet_readonly
()
Ответ на: комментарий от Deleted
#include <IL/il.h>

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#include <GL/glut.h>

int x = 0, y = 0;

int width = 0;
int height = 0;
GLint texture = 0;
GLint buffer = 0;

int screenWidth = 0;
int screenHeight = 0;

void randomPos()
{
    if(screenHeight > 0 && screenWidth > 0)
    {
        x = rand() % screenWidth;
        y = rand() % screenHeight; 
    }
    glutPostRedisplay();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(x, y, 0);
   
    glBindTexture(GL_TEXTURE_2D, texture);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_ARRAY_BUFFER);

    glBindBuffer(GL_ARRAY_BUFFER, buffer);

    glVertexPointer(2, GL_FLOAT, 4 * sizeof(float), 0);
    glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(float), ((void*)0) + sizeof(float) * 2);

    glDrawArrays(GL_QUADS, 0, 4);

    glDisableClientState(GL_ARRAY_BUFFER);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
   
    glutSwapBuffers();
}

void initOpenGL()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

void reshape(GLint w, GLint h)
{
    screenWidth = w; screenHeight = h;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, w, h, 0.0, -1.0, 1.0);
}

int main(int argc, char **argv)
{
    ilInit();
    ILuint image;
    ilGenImages(1, &image);
    ilBindImage(image);
    ilLoadImage("/tmp/test.png");

    width = ilGetInteger(IL_IMAGE_WIDTH);
    height = ilGetInteger(IL_IMAGE_HEIGHT);
    GLubyte *imageData = (GLubyte*)malloc(width * height * 4);
    ilCopyPixels(0, 0, 0, width, height, 1, IL_RGBA, IL_UNSIGNED_BYTE, imageData);
    ilDeleteImages(1, &image);
    
    glutInit(&argc, argv);
    glutInitWindowSize(1024, 768);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("OpenGL");
    
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(randomPos);
    
    initOpenGL();
    
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    free(imageData);
    
    glGenBuffers(1, &buffer);
    float vertexData[] = {0.0f, 0.0f, 0.0f, 0.0f,
                          width, 0.0f, 1.0f, 0.0f,
                          width, height, 1.0f, 1.0f,
                          0.0f, height, 0.0f, 1.0f};
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 4 * 4, vertexData, GL_STATIC_DRAW);

    glutMainLoop();
    
    glDeleteTextures(1, &texture);
    glDeleteBuffers(1, &buffer);
} 

Жду от кого-нибудь код с аналогичным принципом отрисовки на D3D/DX...

Kosyak
()
Ответ на: комментарий от Ttt

Mesa никакого отношения к Khronos Group не имеет.

Ну если не считать того, что Khronos Group сертифицирует Mesa на совместимость со спецификациями - то да, не имеет.

RussianNeuroMancer
()

Direct3D банально быстрее. По крайней мере позволяет выставлять больше сглаживаний, а порой и разрешение больше чем OpenGL на слабом железе в одной и той же игре (выставить и там и там не проблема одинаково, только вот количество fps будет более играбельное).

anonymous_sama
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от RussianNeuroMancer

Khronos Group сертифицирует Mesa

А такое разве было? ЕМНИП то не было. Был разговор о том что интел хочет свой драйвер (не-то в 9.0 не-то в 9.1) сертифицировать у Khronos Group с ОпенГЛ 3.0.

Behem0th
()
Ответ на: комментарий от roman77

Не выгодно писать игру, которую легче портировать на 3 платформы разом?

Все такие комерсанты - пипец. Кого не спросишь - знает, как мильярды заработать!

zgen
()
Последнее исправление: zgen (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

В прямых иксах разные версии несовместимы друг с другом

Да, но старые версии поддерживаются долго. На семёрке (вроде бы) можно спокойно работать с софтом на DX8.

Отсутствие обратной совместимости компенсируется продуманностью API и шейдерного языка. А поклонение ей порождает таких чудовищ как C++.

dmfd
()
Ответ на: комментарий от devl547

Речь идёт не о коде, который пишут студенты, разрабатывая свои MMORPG, а о API.

В DX9 дизайн ещё был омрачён паттерном God Object (объект устройства). В DX11 всё намного красивее было.

dmfd
()

DirectX используют потому, что он покрывает сразу все нужные потребности: звук, ввод и рендер.

winddos
()
Ответ на: комментарий от anonymous_sama

Direct3D банально быстрее.

Адовый бред. Скачай себе утекший Unreal Engine 3.5 с исходниками, и потесть там рендеры на разных задачах.
У nvidia на винде в производительности D3D и OGL паритет.

Производительность рендера зависит исключительно от того, как он написал.
Т.е важно чтобы человек который его писал знает своё дело.

winddos
()
Ответ на: комментарий от dmfd

Да, но старые версии поддерживаются долго. На семёрке (вроде бы) можно спокойно работать с софтом на DX8.

А вот opengl просто совместим через compatibility extensions. Причём можно сделать контекст без них и использовать OpenGL 3+.

Отсутствие обратной совместимости компенсируется продуманностью API

Как раз API ничуть не более продуманный, чем в OpenGL. Более того, невозможность плавного перехода к новой версии для API является безусловным фейлом.

Отсутствие обратной совместимости компенсируется продуманностью API и шейдерного языка. А поклонение ей порождает таких чудовищ как C++.

Ваше личное неосиляторство плюсов к OpenGL vs DirectX примешивать не надо.

quiet_readonly
()
Ответ на: комментарий от winddos

Т.е важно чтобы человек который его писал знает своё дело.

Вот тут не соглашусь, в университетах не учат по 5 лет работе с ещё не вышедшими версиями DirectX/OpenGL, так что полнота документации, примеров и количество общедоступных наработок тоже решает. У DirectX были определённые успехи в этом плане в 2000-х, когда OpenGL испытывал застой.

quiet_readonly
()
Ответ на: комментарий от quiet_readonly

D3D10 был анонсирован вроде в 2005 году, а SDK появился в 2006:
http://www.microsoft.com/en-us/download/details.aspx?id=10368
Реально же на него переходить начали только в прошлом году, подумай об этом.

Проблема OpenGL в 2000-х это был не столько застой, сколько отсутствие нормальных библиотек для всего остального (звук, ввод, etc).
Т.е уже были OpenAL, SDL и так далее, но они были куда более сырыми нежели сейчас.
И как минимум они были намного сырее, чем DirectX.

winddos
()
Последнее исправление: winddos (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

Как раз API ничуть не более продуманный, чем в OpenGL. Более того, невозможность плавного перехода к новой версии для API является безусловным фейлом.

А почему выход новой версии DX всегда совпадает с какими-то кардинальными изменениями графического конвейера? Потому что для более эффективного использования этих возможностей нужно переписать legacy код. Да, это жестоко по отношению к ленивым кодеришкам, которые держатся за древние костыли. Но эволюционный подход имеет свои недостатки, и если API желает их избежать, это вполне оправдано.

Ваше личное неосиляторство плюсов

Я бы не назвал себя таким уж неосилятором плюсов. У меня есть довольно большой проект, написанный в духе boost. Просто я ещё и некоторые другие языки знаю, есть с чем сравнивать.

dmfd
()
Ответ на: комментарий от dmfd

Потому что для более эффективного использования этих возможностей нужно переписать legacy код.

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

Ещё раз повторю, что в OpenGL можно создать контекст без функций, объявленных deprecated с выходом OpenGL 3.0.

Я бы не назвал себя таким уж неосилятором плюсов. У меня есть довольно большой проект, написанный в духе boost. Просто я ещё и некоторые другие языки знаю, есть с чем сравнивать.

Движки большинства из которых написаны на C++ и могут связывать код на языке с кодом на плюсах. Называть C++ чудовищем просто за то, что он не является очередным DSL с прокинутыми из движка YOBA функциями, как-то нелепо.

quiet_readonly
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.