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 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.