Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
7 страниц V  « < 5 6 7  
Тема закрытаНачать новую тему
> Разработка игрового движка с нуля, как создать игровой движок
jamakasi
сообщение 22.01.2018, 08:27
Сообщение #121


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 21.01.2018, 23:22) *
Кстати, столкнулся с таким странным поведением OpenGL - не получается изменить размер RT в большую сторону.

конечно врядли но проверь может ли твоя видяшка такие размеры текстур, если указываешь что то большое.
Перейти в начало страницы
 
autistic
сообщение 22.01.2018, 08:56
Сообщение #122


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Tron, не, имеется в виду размер приаттаченных текстур аля ширина/высота.

Цитата(jamakasi @ 22.01.2018, 10:27) *
конечно врядли но проверь может ли твоя видяшка такие размеры текстур, если указываешь что то большое.

С этим тоже все норм, проверял на исходном разрешении 800х600, изменял до 1280х720, оба разрешения поддерживаются видеокартой. Да и glTexImage2d вернула бы статус ошибки в случае неподходящего размера. Тут скорее всего я что-то не так делаю.


--------------------
nop
Перейти в начало страницы
 
jamakasi
сообщение 22.01.2018, 09:35
Сообщение #123


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 22.01.2018, 08:56) *
800х600, изменял до 1280х720

О, так желательно квадратные текстуры делать аля 512х512 1024х1024 2048х2048 и т.д. , Помню гдето сталкивался с такой бякой и это помогло.
Перейти в начало страницы
 
SkyLoader
сообщение 22.01.2018, 09:41
Сообщение #124


Почти Игроман
*********

Репутация:   153  
Группа: Участник
Сообщений: 614
Награды: 4
Регистрация: 03.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


jamakasi, это же RT, а не просто текстуры smile.gif Всегда должны поддерживать практически любые размеры (размеры 4К и больше в расчет не берем).

refuse, а масок нет никаких при рендере? Может при создании девайса некорректно параметры указаны?
Вообще я делал похожее на дх9, проблем не было. Но вот с дх10/11 появились, часть RT почему-то не захотела подстраиваться под увеличенный размер. Но это скорее всего мой косяк, ибо в играх подобное реализовано нормально.

Сообщение отредактировал SkyLoader - 22.01.2018, 09:45
Перейти в начало страницы
 
jamakasi
сообщение 22.01.2018, 09:43
Сообщение #125


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(SkyLoader @ 22.01.2018, 09:41) *
это же RT, а не просто текстуры smile.gif Всегда должны поддерживать любые размеры (размеры 4К и больше в расчет не берем).

Так то оно так, но это openGL который построен на костылях и магии laugh.gif
ps Кстати, у меня тут для одного проекта получилась этакая cvs для файлов с дедубликацией. Никому не надо? а то думаю вот обернуть ее в нечто самостоятельное. Достаточно удобно применяется для последующего хранения чегото на хостинге и отдачи клиенту с возможностью отката на предыдущие версии.

Сообщение отредактировал jamakasi - 22.01.2018, 09:46
Перейти в начало страницы
 
autistic
сообщение 22.01.2018, 09:48
Сообщение #126


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(jamakasi @ 22.01.2018, 11:35) *
О, так желательно квадратные текстуры делать аля 512х512 1024х1024 2048х2048 и т.д.

Так нужно чтобы размер текстуры совпадал с размером экранного буфера, иначе копирование в экранный буфер не будет работать. Да и нужно 1:1 копировать, иначе искажения могут быть, порери точности и прочие сайд эффекты.

Цитата(SkyLoader @ 22.01.2018, 11:41) *
а масок нет никаких при рендере? Может при создании девайса некорректно параметры указаны?

Вроде нету, буфер глубины разве что, но я его размер тоже меняю.


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 22.01.2018, 12:05
Сообщение #127


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 21.01.2018, 23:22) *
P.S. Кстати, столкнулся с таким странным поведением OpenGL - не получается изменить размер RT в большую сторону. В меньшую - пожалуйста, а в большую конечный результат обрезается вот таким образом

Может все меняется, просто какой-нибудь Scissor Test работает?
Перейти в начало страницы
 
Молния в вакууме
сообщение 22.01.2018, 17:31
Сообщение #128


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


refuse, что-то у меня вообще ничего не рендерится. Скрипт и тестовое приложение из 112 поста подходят к последней ревизии?
Перейти в начало страницы
 
autistic
сообщение 22.01.2018, 19:39
Сообщение #129


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


saas, ну да, тестовое приложение со скриптом немного изменились. А кроме того в GraphicsShape появилось поле shaderName, я туда пока что название шейдера хардкодом добавляю, надо дорабатывать конвертер, чтоб это название из свойств FBX-материала бралось.

Код
struct GraphicsShape
{
    VertexFormat vertexFormat;
    HardwareBufferId hardwareBufferId;
    String shaderName = "cat";
};



Тестовое приложение
Код
#include <engine/model.h>
#include <engine/platform.h>
#include <engine/shader.h>

int main()
{
    Engine::Platform *platform = Engine::GetPlatform();
    if (!platform->CreateMainWindow())
        return -1;

    platform->SetMainWindowSize(1280, 720, false);

    Engine::ModelManager *modelManager = Engine::GetModelManager();
    Engine::ModelPtr teapot = modelManager->GetModel("teapot");

    Engine::Matrix4 rotation(Engine::Matrix3(M_PI * 0.25f, M_PI * 0.1f, 0));

    Engine::Matrix4 proj, view, world;
    view.SetIdentity();
    proj.SetPerspective(1.3f, 1.78f, 0.1f, 100000.0f);
    world.SetTranslation(Engine::Vector3(-0.35, -0.3f, -1.5f));
    world = rotation * world;

    Engine::Shader *shader = Engine::GetShader();
    shader->SetFrameBufferSize(1280, 720);
    shader->Compile("cat", false);
    shader->SetWorldViewProj(world, view, proj);

    for (;;) {
        if (!platform->UpdateMainWindow()) {
            break;
        }

        shader->BeginFrame();
        shader->Draw(teapot->GetGraphicsShapes()[0]);
        shader->EndFrame();
    }
}


Скрипт
Код
#include <exception>
#include <fstream>
#include <iostream>
#include <set>
#include <vector>

#include <fbxsdk.h>

void ConvertMesh(FbxMesh *fbxMesh, std::vector<short> &indices, std::vector<float> &vertices)
{
    if (!fbxMesh->IsTriangleMesh()) {
        throw std::exception("The mesh should be a triangle mesh");
    }

    const FbxVector4 *controlPoints = fbxMesh->GetControlPoints();

    FbxStringList uvSets;
    fbxMesh->GetUVSetNames(uvSets);
    fbxMesh->GenerateNormals();

    short k = 0;
    for (int i = 0; i < fbxMesh->GetPolygonCount(); ++i) {
        for (int j = 0; j < 3; ++j) {
            int index = fbxMesh->GetPolygonVertex(i, j);
            indices.push_back(k++);

            const FbxVector4 &controlPoint = controlPoints[index];
            vertices.push_back(controlPoint[0]);
            vertices.push_back(controlPoint[1]);
            vertices.push_back(controlPoint[2]);

            FbxVector4 normal;
            fbxMesh->GetPolygonVertexNormal(i, j, normal);
            vertices.push_back(normal[0]);
            vertices.push_back(normal[1]);
            vertices.push_back(normal[2]);

            vertices.resize(vertices.size() + 6);

            bool unmapped;
            FbxVector2 textureUV;
            fbxMesh->GetPolygonVertexUV(i, j, uvSets[0], textureUV, unmapped);
            vertices.push_back(textureUV[0]);
            vertices.push_back(1-textureUV[1]);
        }
    }
}

void ConvertMesh(const std::vector<short> &indices, const std::vector<float> &vertices, FbxMesh *mesh)
{
    int count = vertices.size() / 14;
    mesh->InitControlPoints(count);

    const float *verts = vertices.data();
    FbxVector4 *points = mesh->GetControlPoints();

    for (int i = 0; i < count; ++i) {
        float x = *verts++;
        float y = *verts++;
        float z = *verts++;
        verts += 11;
        points[i] = FbxVector4(x, y, z);
    }

    count = indices.size();
    for (int i = 0; i < count; i +=3) {
        mesh->BeginPolygon();
        for (int j = 0; j < 3; ++j) {
            int index = indices[i + j];
            mesh->AddPolygon(index);
        }
        mesh->EndPolygon();
    }
}

void ExportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxImporter* importer = FbxImporter::Create(sdkManager, "");
    if (!importer->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene* scene = FbxScene::Create(sdkManager, "ImportedScene");
    importer->Import(scene);
    importer->Destroy();

    std::ofstream file;
    file.open(target, std::ios::out | std::ios::binary);
    file.write("mdl\0", 4);

    short minor = 1, major = 0;
    file.write((char*)&major, 2);
    file.write((char*)&minor, 2);

    FbxNode *root = scene->GetRootNode();
    for (int i = 0; i < root->GetChildCount(); ++i) {
        std::vector<short> indices;
        std::vector<float> vertices;
        FbxNode *child = root->GetChild(i);
        ConvertMesh(child->GetMesh(), indices, vertices);

        int chunkId = 1, size = indices.size() * 2, fmt = 31;
        file.write((char*)&chunkId, 4);
        file.write((char*)&size, 4);
        file.write((const char*)indices.data(), indices.size() * 2);

        size = vertices.size() * 4;
        file.write((char*)&fmt, 4);
        file.write((char*)&size, 4);
        file.write((const char*)vertices.data(), vertices.size() * 4);
    }

    file.close();
}

void ImportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    std::ifstream file;
    file.open(source, std::ios::in | std::ios::binary);
    if (!file)
        throw std::exception("Can't open source file");

    int size;
    file.seekg(12, SEEK_CUR);
    file.read((char*)&size, 4);

    indices.resize(size);
    file.read((char*)&indices[0], size);

    file.seekg(4, SEEK_CUR);
    file.read((char*)&size, 4);
    vertices.resize(size);
    file.read((char*)&vertices[0], size);

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxExporter* exporter = FbxExporter::Create(sdkManager, "");
    if (!exporter->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene *scene = FbxScene::Create(sdkManager, "ExportedScene");
    FbxNode *root = scene->GetRootNode();

    FbxNode *child = FbxNode::Create(sdkManager, "teapot");
    FbxMesh *mesh = FbxMesh::Create(scene, "teapot");

    ConvertMesh(indices, vertices, mesh);

    child->SetNodeAttribute(mesh);
    root->AddChild(child);

    exporter->Export(scene);
    exporter->Destroy();
}

int main(int argc, char *argv[])
{
    try {
        if (argc != 3) {
            throw std::exception("Invalid parameters passed.");
        }

#if 0
        ExportMesh(argv[1], argv[2]);
#elif 0
        ImportMesh(argv[2], argv[1]);
#else
        ExportMesh(argv[1], argv[2]);
        ImportMesh(argv[2], argv[1]);
#endif
    }
    catch (const std::exception &error) {
        std::clog << error.what() << std::endl;
    }
}


cat.shader
Код
{
    // Diffuse map
    DiffuseMap = cat_diff;
}


--------------------
nop
Перейти в начало страницы
 
Молния в вакууме
сообщение 22.01.2018, 21:18
Сообщение #130


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 22.01.2018, 19:39) *
А кроме того в GraphicsShape появилось поле shaderName, я туда пока что название шейдера хардкодом добавляю

Ага, вот в чём дело.

Баг с рендертаргетом у тебя из за того, что ты i передал вторым параметром в glTexImage2D в ResizeRenderTarget. У рендертаргета вообще могут быть мипмапы? smile.gif

Ещё надо #include <algorithm> добавить в renderer.cpp, GCC не может найти std::find_if без него.
Перейти в начало страницы
 
autistic
сообщение 22.01.2018, 21:31
Сообщение #131


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Ох, моя рассеянность меня доканает когда-нибудь =( Спасибо! smile.gif


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 04.02.2018, 23:54
Сообщение #132


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Итак, отложенное затенение работает. Освещение реализовано самым примитивным способом, с ограничением в 32 точечных источника освещения и скорее всего будет переработано, но тем не менее поставленная цель достигнута.


Далее возникла небольшая дилемма, в связи с тем, что время которое я могу уделить этому проекту весьма ограничено возникает естественный вопрос, на что его лучше потратить: продолжать разработку в формате изучения отдельных компонентов движка, либо сконцентрироваться на разработке вполне конкретной игры? Создал опрос

Сообщение отредактировал Орхетектор - 04.02.2018, 23:57


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 26.02.2018, 01:33
Сообщение #133


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Исправил освещение.
Освещенность вычисляется как скалярное произведение вектора направления света с вектором нормали.
В предыдущей версии нормали не были преобразованы в пространство камеры и поэтому освещенность текселей вычислялась неправильно.
Для того чтобы выполнить соответствующие преобразования необходимо каждую нормаль умножить на специальную матрицу, которая вычисляется как обратная от произведения мировой матрицы на матрицу вида. Вычислять такую матрицу шейдером для каждой вершины слишком накладно, разумнее вычислить ее на процессоре один раз и передать в шейдерную программу.
Пришлось дописать код который инвертирует матрицу, дифф можно посмотреть тут
Использованные материалы (осторожно, траффик)













--------------------
nop
Перейти в начало страницы
 
Supple Hope
сообщение 26.02.2018, 04:02
Сообщение #134


Босс
********************

Репутация:   257  
Группа: Участник
Сообщений: 4151
Награды: 4
Регистрация: 15.08.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Орхетектор @ 26.02.2018, 00:33) *
Исправил освещение.
Освещенность вычисляется как скалярное произведение вектора направления света с вектором нормали.

Так это ты только по Ламберту освещение сделал, не? Щас уже по Орен-Найяру модно.
Перейти в начало страницы
 
autistic
сообщение 09.03.2018, 19:56
Сообщение #135


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Победил экспорт моделей из макса и рассчет освещения. Слева направо освещение модели с нормалями без учета групп сглаживания, с учетом групп сглаживания, из карты нормалей.


Цитата(Hoyt Ridge @ 26.02.2018, 06:02) *
Так это ты только по Ламберту освещение сделал, не? Щас уже по Орен-Найяру модно.

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


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 10.03.2018, 15:25
Сообщение #136


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Реализовано отражение (specular lighting)



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

Сообщение отредактировал Орхетектор - 11.03.2018, 12:07


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 06.05.2018, 16:56
Сообщение #137


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Продолжаю эксперименты с освещением. Oren-Nayar и Cook-Torrance для диффузного освещения и отражений.



Сообщение отредактировал Орхетектор - 06.05.2018, 16:58


--------------------
nop
Перейти в начало страницы
 

7 страниц V  « < 5 6 7
Тема закрытаНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20.04.2024, 00:15