Разработка игрового движка с нуля, как создать игровой движок |
Здравствуйте, гость ( Авторизация | Регистрация )
Разработка игрового движка с нуля, как создать игровой движок |
03.12.2017, 21:02
Сообщение
#1
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Пилю в свободное время графический движок
Что-то с проекцией не то: Треугольник равносторонний: (-0.5, -0.5, 0), (0.5, -0.5, 0), (0, 0.5, 0) Клиентский код: + Код #include <engine/platform.h> #include <engine/renderer.h> std::string vertexShaderSrc = "\n\ attribute vec4 vertexPosition;\n\ uniform mat4 modelViewProj;\n\ void main()\n\ {\n\ gl_Position = modelViewProj * vertexPosition;\n\ }\n\ \0"; std::string fragmentShaderSrc = "\n\ void main()\n\ {\n\ gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);\n\ }\n\ \0"; struct Vertex { float x, y, z; }; Vertex vertices[] = { {-0.5f, -0.5f, 0}, {0.5f, -0.5f, 0}, {0.0f, 0.5f, 0}, }; unsigned short indices[] = { 0, 1, 2 }; int main() { Engine::Platform *platform = Engine::GetPlatform(); if (!platform->CreateMainWindow()) return -1; Engine::Renderer *renderer = Engine::GetRenderer(); size_t size = vertexShaderSrc.size(); const Engine::Byte *pVertShaderData = reinterpret_cast<const Engine::Byte*>(vertexShaderSrc.data()); Engine::ByteVector vertexSrc(pVertShaderData, pVertShaderData + size); size = fragmentShaderSrc.size(); const Engine::Byte *pFragShaderData = reinterpret_cast<const Engine::Byte*>(fragmentShaderSrc.data()); Engine::ByteVector fragSrc(pFragShaderData, pFragShaderData + size); auto progId = renderer->CreateGpuProgram(Engine::STATIC_VERTEX, vertexSrc, fragSrc); renderer->BindGpuProgram(progId); const Engine::Byte *pVertData = reinterpret_cast<const Engine::Byte*>(vertices); Engine::ByteVector verts(pVertData, pVertData + sizeof(vertices)); const Engine::Byte *pIndexData = reinterpret_cast<const Engine::Byte*>(indices); Engine::ByteVector inds(pIndexData, pIndexData + sizeof(indices)); auto buffId = renderer->CreateHardwareBuffer(Engine::STATIC_VERTEX, verts, inds); Engine::Matrix4 proj, model, modelViewProj; proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f); model.SetTranslation(Engine::Vector3(0, 0, -1.5f)); modelViewProj = model * proj; renderer->SetGpuProgramConstant(progId, "modelViewProj", modelViewProj); platform->SetMainWindowSize(1280, 720, true); renderer->SetViewport(1280, 720); for (;;) { if (!platform->UpdateMainWindow()) { break; } renderer->BeginRenderFrame(); renderer->DrawHardwareBuffer(buffId); renderer->EndRenderFrame(); } renderer->DestroyHardwareBuffer(buffId); renderer->DestroyGpuProgram(progId); } Нука быстра, помогите найти в чем проблема, пожалуйста? -------------------- nop
|
 
|
|
|
|
03.12.2017, 22:32
Сообщение
#2
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f);
Я не спец. Если честно, вообще не шарю. Так что не пинайте. Я как увидел файл СиМаки, решил задать вопрос: а что все в последнее время так в неё ударились? Сообщение отредактировал andreyholkin - 03.12.2017, 22:40 |
 
|
|
04.12.2017, 09:55
Сообщение
#3
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f); А что здесь не так? Вроде правильно проекцию строю: 1-й параметр - угол обзора в радианах, 1.3 рад = 75 градусов 2-й параметр - соотношение сторон экрана монитора 16:9 = 1.7(7) 3-й параметр - ближняя плоскость отсечения 4-й параметр - дальняя плоскость отсечения Код ф-ии SetPerspective Формула, по которой строится матрица Вроде верно все, но мои глаза говорят мне обратное =/ а что все в последнее время так в неё ударились? Я нахожу удобство этой системы сборки в том, что она позволяет абстрагироваться от среды разработки и версии компилятора, лишь бы поддерживал стандарт С++11 Сообщение отредактировал refuse - 04.12.2017, 09:56 -------------------- nop
|
 
|
|
04.12.2017, 10:26
Сообщение
#4
|
|
Почти Мастер Репутация: 1357 Группа: Участник Сообщений: 1155 Награды: 5 Регистрация: 28.05.2010 |
А если сделать окно 1280х768?
А если отрисовать в 5:4 1280х1024? А билд для тестирования уже есть? -------------------- Сверхнарод, не желающий кормить своего уицраора шаввой, будет кормить чужого гаввахом!
--------------- ------------ ---------- -------- ------ ---- -- |
 
|
|
04.12.2017, 10:34
Сообщение
#5
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
refuse, сдается мне ты запустил его, поменял размер окна или его что то другое изменило но не пересчитал proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f) второй параметр =)
Высчитывай его динамически. Так же возможно ошибка закралась в самой функции SetPerspective. Код void SetPerspective(float fov, float aspect, float znear, float zfar) { assert(aspect && fov > 0 && fov < M_PI && znear < zfar); //а может быть ... aspect > 0 && fov > 0 .... ?) const float m22 = 1.0f / tanf(fov / 2.0f); const float m11 = m22 / aspect; const float m33 = zfar / (znear - zfar); const float m34 = -1.0f; const float m43 = znear * m33; x = { m11 * 1.5f, 0, 0, 0 }; //А тут что за магия 1.5f ? y = { 0, m22, 0, 0 }; z = { 0, 0, m33, m34 }; w = { 0, 0, m43, 0 }; } ps как же вырвиглазно выглядит с++ Я конечно не знаю зачем с нуля делать двиг но мне в студенческие годы очень понравился SFML как либа для старта своего двигла и Irrlicht как уже готовый двиг =) |
 
|
|
04.12.2017, 10:39
Сообщение
#6
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
|
 
|
|
04.12.2017, 11:25
Сообщение
#7
|
|
Почти Мастер Репутация: 1357 Группа: Участник Сообщений: 1155 Награды: 5 Регистрация: 28.05.2010 |
Андрей прав, по координатам треугольник действительно равнобедренный, глаза не врут
-------------------- Сверхнарод, не желающий кормить своего уицраора шаввой, будет кормить чужого гаввахом!
--------------- ------------ ---------- -------- ------ ---- -- |
 
|
|
04.12.2017, 12:49
Сообщение
#8
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Подтверждаю, длинна нижней грани совпадает с расстоянием от неё же до верхней точки.
как же вырвиглазно выглядит с++ Там в новых стандартах вообще какую-то дичь делают, добавили этот using = вместо typedef, просто чтобы был и портил совместимость со старыми компиляторами, лямбда с ужасным синтаксисом, типа такого: [&] (int a, int b ) -> float { ... }. Лучше уж Objective-C. Еще auto для тех, кому лень писать имя типа, но эта штука с совсем древними компиляторами в которых есть ещё неявный int будет работать иногда. Я например представленный движок собрал в C++ Builder 6, auto не заменял и всё ровно запустилось. Сообщение отредактировал saas - 04.12.2017, 13:43 |
 
|
|
04.12.2017, 12:50
Сообщение
#9
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
|
 
|
|
04.12.2017, 13:38
Сообщение
#10
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
А зачем писать графический движок?
Эти же не просят лицензии покупать. Я понял - это программа импортозамещения. Придёт пора, придёт Рогозин и внедрит это. А почему падают ракеты? Виной тому, то что у нас нет своего хорошего программного обеспечения, или то что оно импортное? Сообщение отредактировал andreyholkin - 04.12.2017, 13:43 |
 
|
|
04.12.2017, 13:43
Сообщение
#11
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
А зачем писать графический движок? Эти же не просят лицензии покупать. Так это и не графические движки, а просто API для доступа к видеокарте. |
 
|
|
04.12.2017, 14:08
Сообщение
#12
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
А зачем писать графический движок? Эти же не просят лицензии покупать. Так это и не графические движки, а просто API для доступа к видеокарте. Я не спец. И что в x-ray является графическим движком? Где он зарыт? |
 
|
|
04.12.2017, 14:09
Сообщение
#13
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
andreyholkin, в xrRender_R1,R2,R3,R4.
|
 
|
|
04.12.2017, 14:13
Сообщение
#14
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
|
 
|
|
04.12.2017, 15:34
Сообщение
#15
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Не подскажите тему, как это сделать? Отражение в воде. |
 
|
|
04.12.2017, 19:47
Сообщение
#16
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Ткнули носом в ОГСЕ. Отбой.
|
 
|
|
04.12.2017, 21:27
Сообщение
#17
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
По координатам, треугольник не может быть равносторонним. Андрей прав, по координатам треугольник действительно равнобедренный, глаза не врут Подтверждаю, длинна нижней грани совпадает с расстоянием от неё же до верхней точки. Ох, позор на мою седую голову, верно же! >_< А зачем писать графический движок? Иногда полезнее иметь собственное простое и доступное решение, чтобы протестировать что-то или дему какую-нить запилить, нежели раскатывать монструозный движок с гигабайтной документацией к нему (и кучей чужих багов впридачу). Ну и вопрос с лицензированием, само собой, не на последнем месте стоит. А билд для тестирования уже есть? Эх запилю что-нибудь эдакое! Но это когда уже будет основной каркас более-менее готов. -------------------- nop
|
 
|
|
04.12.2017, 21:37
Сообщение
#18
|
|
Самый некомпетентный на форуме Репутация: 312 Группа: Участник Сообщений: 4074 Награды: 4 Регистрация: 04.09.2012 |
|
 
|
|
04.12.2017, 22:06
Сообщение
#19
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
Иногда полезнее иметь собственное простое и доступное решение, чтобы протестировать что-то или дему какую-нить запилить, нежели раскатывать монструозный движок с гигабайтной документацией к нему (и кучей чужих багов впридачу). Ну и вопрос с лицензированием, само собой, не на последнем месте стоит. Ну так это, у sfml лицензия zlib: Цитата
Данная лицензия не требует обязательного распространения исходных текстов вместе с продуктом. Что может быть удобнее чем такой лаконичный пример для 3d |
 
|
|
04.12.2017, 22:57
Сообщение
#20
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Что может быть удобнее чем такой лаконичный пример для 3d Боян же, там FFP во все поля. Ты покажи пример где SM реализована, да так чтобы я без проблем мог кастомные шейдера писать, и чтобы удобно было Все проблемы абстракции решены, матан и потоки уже тоже отточены годами и юзаются элементарно. Нафига нужен свой колхоз Сказки все это, там точно такой же колхоз и багло там плавает годами, как и везде. Свой колхоз ценен тем, что я имплеменчу только то что буду использовать и не забиваю голову поддержкой 100500 различных фичей на все случаи жизни, которые мне никогда не понадобятся. -------------------- nop
|
 
|
|
Текстовая версия | Сейчас: 27.04.2024, 10:09 |