Разработка игрового движка с нуля, как создать игровой движок |
Здравствуйте, гость ( Авторизация | Регистрация )
Разработка игрового движка с нуля, как создать игровой движок |
22.01.2018, 08:27
Сообщение
#121
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
|
 
|
|
|
|
22.01.2018, 08:56
Сообщение
#122
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Tron, не, имеется в виду размер приаттаченных текстур аля ширина/высота.
конечно врядли но проверь может ли твоя видяшка такие размеры текстур, если указываешь что то большое. С этим тоже все норм, проверял на исходном разрешении 800х600, изменял до 1280х720, оба разрешения поддерживаются видеокартой. Да и glTexImage2d вернула бы статус ошибки в случае неподходящего размера. Тут скорее всего я что-то не так делаю. -------------------- nop
|
 
|
|
22.01.2018, 09:35
Сообщение
#123
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
|
 
|
|
22.01.2018, 09:41
Сообщение
#124
|
|
Почти Игроман Репутация: 153 Группа: Участник Сообщений: 614 Награды: 4 Регистрация: 03.05.2012 |
jamakasi, это же RT, а не просто текстуры Всегда должны поддерживать практически любые размеры (размеры 4К и больше в расчет не берем).
refuse, а масок нет никаких при рендере? Может при создании девайса некорректно параметры указаны? Вообще я делал похожее на дх9, проблем не было. Но вот с дх10/11 появились, часть RT почему-то не захотела подстраиваться под увеличенный размер. Но это скорее всего мой косяк, ибо в играх подобное реализовано нормально. Сообщение отредактировал SkyLoader - 22.01.2018, 09:45 |
 
|
|
22.01.2018, 09:43
Сообщение
#125
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
это же RT, а не просто текстуры smile.gif Всегда должны поддерживать любые размеры (размеры 4К и больше в расчет не берем). Так то оно так, но это openGL который построен на костылях и магии ps Кстати, у меня тут для одного проекта получилась этакая cvs для файлов с дедубликацией. Никому не надо? а то думаю вот обернуть ее в нечто самостоятельное. Достаточно удобно применяется для последующего хранения чегото на хостинге и отдачи клиенту с возможностью отката на предыдущие версии. Сообщение отредактировал jamakasi - 22.01.2018, 09:46 |
 
|
|
22.01.2018, 09:48
Сообщение
#126
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
О, так желательно квадратные текстуры делать аля 512х512 1024х1024 2048х2048 и т.д. Так нужно чтобы размер текстуры совпадал с размером экранного буфера, иначе копирование в экранный буфер не будет работать. Да и нужно 1:1 копировать, иначе искажения могут быть, порери точности и прочие сайд эффекты. а масок нет никаких при рендере? Может при создании девайса некорректно параметры указаны? Вроде нету, буфер глубины разве что, но я его размер тоже меняю. -------------------- nop
|
 
|
|
22.01.2018, 12:05
Сообщение
#127
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
P.S. Кстати, столкнулся с таким странным поведением OpenGL - не получается изменить размер RT в большую сторону. В меньшую - пожалуйста, а в большую конечный результат обрезается вот таким образом Может все меняется, просто какой-нибудь |
 
|
|
22.01.2018, 17:31
Сообщение
#128
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
refuse, что-то у меня вообще ничего не рендерится. Скрипт и тестовое приложение из 112 поста подходят к последней ревизии?
|
 
|
|
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 |
А кроме того в GraphicsShape появилось поле shaderName, я туда пока что название шейдера хардкодом добавляю Ага, вот в чём дело. Баг с рендертаргетом у тебя из за того, что ты i передал вторым параметром в glTexImage2D в ResizeRenderTarget. У рендертаргета вообще могут быть мипмапы? Ещё надо #include <algorithm> добавить в renderer.cpp, GCC не может найти std::find_if без него. |
 
|
|
22.01.2018, 21:31
Сообщение
#131
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Ох, моя рассеянность меня доканает когда-нибудь =( Спасибо!
-------------------- nop
|
 
|
|
04.02.2018, 23:54
Сообщение
#132
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Итак, отложенное затенение работает. Освещение реализовано самым примитивным способом, с ограничением в 32 точечных источника освещения и скорее всего будет переработано, но тем не менее поставленная цель достигнута.
Далее возникла небольшая дилемма, в связи с тем, что время которое я могу уделить этому проекту весьма ограничено возникает естественный вопрос, на что его лучше потратить: продолжать разработку в формате изучения отдельных компонентов движка, либо сконцентрироваться на разработке вполне конкретной игры? Создал опрос Сообщение отредактировал Орхетектор - 04.02.2018, 23:57 -------------------- nop
|
 
|
|
26.02.2018, 01:33
Сообщение
#133
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Исправил освещение.
Освещенность вычисляется как скалярное произведение вектора направления света с вектором нормали. В предыдущей версии нормали не были преобразованы в пространство камеры и поэтому освещенность текселей вычислялась неправильно. Для того чтобы выполнить соответствующие преобразования необходимо каждую нормаль умножить на специальную матрицу, которая вычисляется как обратная от произведения мировой матрицы на матрицу вида. Вычислять такую матрицу шейдером для каждой вершины слишком накладно, разумнее вычислить ее на процессоре один раз и передать в шейдерную программу. Пришлось дописать код который инвертирует матрицу, дифф можно посмотреть Использованные материалы (осторожно, траффик) -------------------- nop
|
 
|
|
26.02.2018, 04:02
Сообщение
#134
|
|
Босс Репутация: 257 Группа: Участник Сообщений: 4151 Награды: 4 Регистрация: 15.08.2008 |
|
 
|
|
09.03.2018, 19:56
Сообщение
#135
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Победил экспорт моделей из макса и рассчет освещения. Слева направо освещение модели с нормалями без учета групп сглаживания, с учетом групп сглаживания, из карты нормалей.
Так это ты только по Ламберту освещение сделал, не? Щас уже по Орен-Найяру модно. Сейчас модель освещения самая примитивная, без затухания и всего такого, т.к. главная задача сейчас чтобы все правильно заработало в комплексе. После того как более-менее стабильно все заработает уже можно будет любую технику заиспользовать. -------------------- nop
|
 
|
|
10.03.2018, 15:25
Сообщение
#136
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Реализовано отражение (specular lighting)
EDIT: Немного доработал отражения, на скрине справа результат затенения новой техникой. Сообщение отредактировал Орхетектор - 11.03.2018, 12:07 -------------------- nop
|
 
|
|
06.05.2018, 16:56
Сообщение
#137
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Продолжаю эксперименты с освещением. Oren-Nayar и Cook-Torrance для диффузного освещения и отражений.
Сообщение отредактировал Орхетектор - 06.05.2018, 16:58 -------------------- nop
|
 
|
|
Текстовая версия | Сейчас: 03.05.2024, 00:43 |