Ru/Adding a dynamic sky to your mod: Difference between revisions
(Russian initialize commit) |
m (Multipage removal) |
||
(9 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{LanguageBar|title = Добавление динамического неба в ваш мод}} | ||
{{cleanup|Перевод можно было сформулировать лучше}} | |||
[[File:Dynamic Sky.jpg|500px|thumb|right|Динамичное небо]] | [[File:Dynamic Sky.jpg|500px|thumb|right|Динамичное небо]] | ||
Эта статья покажет вам | Эта статья покажет вам как реализовать динамическое небо в вашем {{src13|4}} моде. | ||
{{warning|Этот шейдер очень требовательный и снижает частоту кадров в секунду на 25-40. Поэтому | {{note|Это руководство использует код из отмененного мода Vance}} | ||
{{warning|Этот шейдер очень требовательный и снижает частоту кадров в секунду на 25-40. Поэтому лучше использовать его только на мощных компьютерах}} | |||
== Требования == | == Требования == | ||
Line 12: | Line 15: | ||
{{note|Если вы не знаете | {{note|Если вы не знаете как компилировать шейдеры или еще не работали с ними в {{src|4}}, рекомендуется сначала прочитать и осмыслить эти статьи: {{L|Shader Authoring|Разработка шейдеров}} & {{L|Source_SDK_2013:_Your_First_Shader|Ваш первый шейдер}}}} | ||
== Реализация == | == Реализация == | ||
Прежде чем | Прежде чем что-то делать, нам нужно скачать файлы. ''Они внутри zip-архива.'' | ||
* [https://drive.google.com/file/d/1C-OYYR14C71DtBQdgClwNyhXSt7v2AVw/view?usp=share_link skydome.zip] | * [https://drive.google.com/file/d/1C-OYYR14C71DtBQdgClwNyhXSt7v2AVw/view?usp=share_link skydome.zip] | ||
Когда вы загрузите zip-файл, извлеките файлы | Когда вы загрузите zip-файл, извлеките файлы из {{code|select=all|shaders}} в: {{Path|src/materialsystem/stdshaders/}}, а файлы из {{code|select=all|code}} в: {{Path|src/game/}} | ||
Line 56: | Line 59: | ||
Теперь нам нужно создать купол. Чтобы сделать это, откройте {{Path|src/game/client/viewrender|cpp|icon=file}} | Теперь нам нужно создать купол. Чтобы сделать это, откройте {{Path|src/game/client/viewrender|cpp|icon=file}} | ||
Под {{code|select=all|<nowiki>#include "sourcevr/isourcevirtualreality.h"</nowiki>}} добавьте: | |||
{{codeblock|<nowiki>#include "c_env_skydome.h"</nowiki>}} | |||
{{note|Это должно исправить все ошибки с отсутствием определения для g_pSkyDome}} | |||
Под функцией {{code|select=all|<nowiki>void CViewRender::DrawViewModels( const CViewSetup &view, bool drawViewmodel )</nowiki>}} добавьте: | Под функцией {{code|select=all|<nowiki>void CViewRender::DrawViewModels( const CViewSetup &view, bool drawViewmodel )</nowiki>}} добавьте: | ||
Line 107: | Line 115: | ||
// | // | ||
int idx = 0; | int idx = 0; | ||
for (i = nPhi - | for ( i = 0; i < nPhi - 1; ++i ) | ||
{ | { | ||
for (j = | for ( j = 0; j < nTheta; ++j ) | ||
{ | { | ||
idx = nTheta * i + j; | idx = nTheta * i + j; | ||
meshBuilder.Index(idx | meshBuilder.Index( idx ); | ||
meshBuilder.AdvanceIndex(); | meshBuilder.AdvanceIndex(); | ||
meshBuilder.Index(idx); | meshBuilder.Index( idx + nTheta ); | ||
meshBuilder.AdvanceIndex(); | meshBuilder.AdvanceIndex(); | ||
} | } | ||
Line 124: | Line 132: | ||
// a connecting triangle. | // a connecting triangle. | ||
// | // | ||
if (i < nPhi - 2) | if ( i < nPhi - 2 ) | ||
{ | { | ||
meshBuilder.Index(idx); | meshBuilder.Index( idx + nTheta ); | ||
meshBuilder.AdvanceIndex(); | meshBuilder.AdvanceIndex(); | ||
meshBuilder.Index( | meshBuilder.Index( ( i + 1 ) * nTheta ); | ||
meshBuilder.AdvanceIndex(); | meshBuilder.AdvanceIndex(); | ||
} | } | ||
Line 149: | Line 157: | ||
Теперь для | Теперь для включения и отключения отрисовки вам нужно перейти к функции {{code|select=all|<nowiki>void CRendering3dView::DrawWorld( float waterZAdjust )</nowiki>}} и | ||
выше {{code|select=all|<nowiki>unsigned long engineFlags = BuildEngineDrawWorldListFlags( m_DrawFlags );</nowiki>}} добавить: | выше {{code|select=all|<nowiki>unsigned long engineFlags = BuildEngineDrawWorldListFlags( m_DrawFlags );</nowiki>}} добавить: | ||
{{codeblock | {{codeblock|<nowiki>if ((m_DrawFlags & DF_DRAWSKYBOX) && (g_pSkyDome && g_pSkyDome->IsDynamicSkyEnabled())) | ||
{ | { | ||
m_DrawFlags &= ~DF_DRAWSKYBOX; // dont render engine sky, we have our own sky now | m_DrawFlags &= ~DF_DRAWSKYBOX; // dont render engine sky, we have our own sky now | ||
Line 162: | Line 170: | ||
=== Шейдеры === | === Шейдеры === | ||
Удалите | {{note|Удалите все файлы из {{path|stdshader_dx9_30|txt|icon=file}} и убедитесь, что в вашем {{path|stdshader_dx9_30|txt|icon=file}} файле есть только {{code|select=all|skydome_ps30}} и {{code|select=all|skydome_vs30}}, чтобы ускорить компиляцию шейдеров (НЕ ЗАБУДЬТЕ ОЧИСТИТЬ {{path|stdshader_dx9_20b|txt|icon=file}})}} | ||
{{ | |||
skydome_ps30 | |||
{{ | |||
А теперь откройте {{path|game_shader_dx9_base|vpc|icon=file}} | А теперь откройте {{path|game_shader_dx9_base|vpc|icon=file}} | ||
И под {{code|select=all|<nowiki>$File "screenspace_general.cpp"</nowiki>}} добавьте: | И под {{code|select=all|<nowiki>$File "screenspace_general.cpp"</nowiki>}} добавьте: | ||
{{codeblock | {{codeblock|<nowiki>$File "skydome_atmosphere.cpp" | ||
$File "skydome_atmosphere_helper.cpp" | $File "skydome_atmosphere_helper.cpp" | ||
$File "skydome_atmosphere_helper.h"</nowiki>}} | $File "skydome_atmosphere_helper.h"</nowiki>}} | ||
Line 185: | Line 184: | ||
Хорошо, а сейчас нам нужно сделать наше динамическое небо доступным через {{hammer|4}}. | Хорошо, а сейчас нам нужно сделать наше динамическое небо доступным через {{hammer|4}}. | ||
Для этого вам понадобиться пользовательский | Для этого вам понадобиться пользовательский {{L|FGD|fgd}} файл. | ||
{{CodeBlock|lines=22|src=skydome.fgd|<nowiki>@include "halflife2.fgd" | {{CodeBlock|lines=22|src=skydome.fgd|<nowiki>@include "halflife2.fgd" | ||
Line 215: | Line 214: | ||
Теперь вам нужна последняя деталь и это - материал. | Теперь вам нужна последняя деталь и это - материал. | ||
Перейдите в вашу директорию {{path|materials}} и создайте поддиректорию с названием {{path|shaders}} | Перейдите в вашу директорию {{path|materials}} и создайте поддиректорию с названием {{path|shaders}} | ||
После этого, создайте файл {{path|skydome|vmt|icon=file}} и вставьте это внутрь: | После этого, создайте файл {{path|skydome|vmt|icon=file}} и вставьте это внутрь: | ||
Line 226: | Line 225: | ||
Создайте карту с сущностью {{code|select=all|env_skydome}} и вот оно! Теперь в вашем моде должно быть динамическое небо. | Создайте карту с сущностью {{code|select=all|env_skydome}} и вот оно! Теперь в вашем моде должно быть динамическое небо. | ||
{{ACategory|Modding}} | |||
{{ACategory|Tutorials}} |
Latest revision as of 04:02, 12 July 2024

Эта статья покажет вам как реализовать динамическое небо в вашем Source 2013 моде.


Требования
- Умение компилировать шейдеры.
- Умение компилировать решения.


Реализация
Прежде чем что-то делать, нам нужно скачать файлы. Они внутри zip-архива.
Когда вы загрузите zip-файл, извлеките файлы из shaders в: src/materialsystem/stdshaders/
, а файлы из code в: src/game/
Откройте src/game/client/client_base.vpc
Перейдите к строке $File "$SRCDIR\game\client\c_vote_controller.cpp" и под ней добавьте:
Далее откройте src/game/server/server_base.vpc
и под $File "$SRCDIR\game\server\vote_controller.cpp" добавьте:
И после этого, пересоберите свое games.sln
решение.
Теперь мы можем перейти к реализации кода отрисовки.
Код отрисовки
Сначала нам нужно отредактировать код клиента для динамического неба.
Откройте src/game/client/view.cpp
В функции void CViewRender::Init( void ), под m_ModulateSingleColor.Init( "engine/modulatesinglecolor", TEXTURE_GROUP_OTHER ); добавьте:
Теперь откройте src/game/client/viewrender.h
И под функцией void SetWaterOverlayMaterial( IMaterial *pMaterial ) добавьте:
Найдите CMaterialReference m_UnderWaterOverlayMaterial; и под этим добавьте:
Теперь нам нужно создать купол. Чтобы сделать это, откройте src/game/client/viewrender.cpp
Под #include "sourcevr/isourcevirtualreality.h" добавьте:

Под функцией void CViewRender::DrawViewModels( const CViewSetup &view, bool drawViewmodel ) добавьте:
Теперь для включения и отключения отрисовки вам нужно перейти к функции void CRendering3dView::DrawWorld( float waterZAdjust ) и
выше unsigned long engineFlags = BuildEngineDrawWorldListFlags( m_DrawFlags ); добавить:
Шейдеры


stdshader_dx9_30.txt
и убедитесь, что в вашем 
stdshader_dx9_30.txt
файле есть только skydome_ps30 и skydome_vs30, чтобы ускорить компиляцию шейдеров (НЕ ЗАБУДЬТЕ ОЧИСТИТЬ 
stdshader_dx9_20b.txt
)А теперь откройте game_shader_dx9_base.vpc
И под $File "screenspace_general.cpp" добавьте:
Скомпилируйте шейдер динамического неба и пересоберите ваше решение.
Хорошо, а сейчас нам нужно сделать наше динамическое небо доступным через Hammer.
Для этого вам понадобиться пользовательский fgd файл.
Заключение
Теперь вам нужна последняя деталь и это - материал.
Перейдите в вашу директорию materials
и создайте поддиректорию с названием shaders
После этого, создайте файл skydome.vmt
и вставьте это внутрь:
Создайте карту с сущностью env_skydome и вот оно! Теперь в вашем моде должно быть динамическое небо.