Fix DrawLevelMesh bugs
This commit is contained in:
parent
fc65d43ae8
commit
05e46e0cb4
6 changed files with 24 additions and 13 deletions
|
|
@ -74,7 +74,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key)
|
|||
};
|
||||
|
||||
const auto& desc = effectshaders[key.SpecialEffect];
|
||||
program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines);
|
||||
program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines, key.UseLevelMesh);
|
||||
program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.defines, key);
|
||||
}
|
||||
else
|
||||
|
|
@ -112,7 +112,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key)
|
|||
if (key.EffectState < FIRST_USER_SHADER)
|
||||
{
|
||||
const auto& desc = defaultshaders[key.EffectState];
|
||||
program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines);
|
||||
program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines, key.UseLevelMesh);
|
||||
program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump, desc.Defines, key);
|
||||
}
|
||||
else
|
||||
|
|
@ -121,14 +121,14 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key)
|
|||
const FString& name = ExtractFileBase(desc.shader.GetChars());
|
||||
FString defines = defaultshaders[desc.shaderType].Defines + desc.defines;
|
||||
|
||||
program.vert = LoadVertShader(name, mainvp, defines.GetChars());
|
||||
program.vert = LoadVertShader(name, mainvp, defines.GetChars(), key.UseLevelMesh);
|
||||
program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key);
|
||||
}
|
||||
}
|
||||
return &program;
|
||||
}
|
||||
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *defines)
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh)
|
||||
{
|
||||
FString definesBlock;
|
||||
definesBlock << defines;
|
||||
|
|
@ -142,6 +142,9 @@ std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername
|
|||
definesBlock << "#define NO_CLIPDISTANCE_SUPPORT\n";
|
||||
}
|
||||
|
||||
if (levelmesh)
|
||||
definesBlock << "#define USE_LEVELMESH\n";
|
||||
|
||||
FString layoutBlock;
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_shared.glsl").GetChars() << "\n";
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_vert.glsl").GetChars() << "\n";
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ public:
|
|||
void RemoveVkPPShader(VkPPShader* shader);
|
||||
|
||||
private:
|
||||
std::unique_ptr<VulkanShader> LoadVertShader(FString shadername, const char *vert_lump, const char *defines);
|
||||
std::unique_ptr<VulkanShader> LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh);
|
||||
std::unique_ptr<VulkanShader> LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *lightmodel_lump, const char *defines, const VkShaderKey& key);
|
||||
|
||||
ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system);
|
||||
|
|
|
|||
|
|
@ -622,7 +622,7 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint)
|
|||
auto passSetup = GetRenderPassManager()->GetRenderPass(key);
|
||||
|
||||
RenderPassBegin beginInfo;
|
||||
beginInfo.RenderPass(passSetup->GetRenderPass(CT_Depth | CT_Stencil));
|
||||
beginInfo.RenderPass(passSetup->GetRenderPass(CT_Color | CT_Depth | CT_Stencil));
|
||||
beginInfo.RenderArea(0, 0, buffers->GetWidth(), buffers->GetHeight());
|
||||
beginInfo.Framebuffer(buffers->GetFramebuffer(key));
|
||||
beginInfo.AddClearColor(screen->mSceneClearColor[0], screen->mSceneClearColor[1], screen->mSceneClearColor[2], screen->mSceneClearColor[3]);
|
||||
|
|
@ -668,9 +668,9 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint)
|
|||
pipelineKey.DrawType = DT_Triangles;
|
||||
pipelineKey.VertexFormat = vertexFormatIndex;
|
||||
pipelineKey.RenderStyle = DefaultRenderStyle();
|
||||
pipelineKey.DepthTest = false;
|
||||
pipelineKey.DepthWrite = false;
|
||||
pipelineKey.DepthFunc = 0;
|
||||
pipelineKey.DepthTest = true;
|
||||
pipelineKey.DepthWrite = true;
|
||||
pipelineKey.DepthFunc = DF_Less;
|
||||
pipelineKey.DepthClamp = false;
|
||||
pipelineKey.DepthBias = false;
|
||||
pipelineKey.StencilTest = false;
|
||||
|
|
@ -726,6 +726,8 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint)
|
|||
#ifdef NPOT_EMULATION
|
||||
streamdata.uNpotEmulation = { 0,0,0,0 };
|
||||
#endif
|
||||
streamdata.uClipSplit.X = -1000000.f;
|
||||
streamdata.uClipSplit.Y = 1000000.f;
|
||||
|
||||
rsbuffers->StreamBuffer->Write(streamdata);
|
||||
|
||||
|
|
|
|||
|
|
@ -146,6 +146,8 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou
|
|||
|
||||
vp.SetViewAngle(r_viewwindow);
|
||||
|
||||
vp.FieldOfView = DAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint)
|
||||
|
||||
auto lightmode = camera->Level->info->lightmode;
|
||||
if (lightmode == ELightMode::NotSet)
|
||||
lightmode = ELightMode::ZDoomSoftware;
|
||||
|
|
@ -162,7 +164,6 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou
|
|||
VPUniforms.mViewMatrix.rotate(vp.HWAngles.Yaw.Degrees(), 0.0f, mult, 0.0f);
|
||||
VPUniforms.mViewMatrix.translate(vp.Pos.X * mult, -vp.Pos.Z * planemult, -vp.Pos.Y);
|
||||
VPUniforms.mViewMatrix.scale(-mult, planemult, 1);
|
||||
VPUniforms.mNormalViewMatrix.loadIdentity();
|
||||
VPUniforms.mViewHeight = viewheight;
|
||||
VPUniforms.mGlobVis = (float)R_GetGlobVis(r_viewwindow, r_visibility) / 32.f;
|
||||
VPUniforms.mPalLightLevels = static_cast<int>(gl_bandedswlight) | (static_cast<int>(gl_fogmode) << 8) | ((int)lightmode << 16);
|
||||
|
|
@ -170,17 +171,18 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou
|
|||
VPUniforms.mShadowmapFilter = static_cast<int>(gl_shadowmap_filter);
|
||||
VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0);
|
||||
VPUniforms.mCameraPos = FVector4(vp.Pos.X, vp.Pos.Z, vp.Pos.Y, 0.0f);
|
||||
VPUniforms.CalcDependencies();
|
||||
|
||||
screen->DrawLevelMesh(VPUniforms);
|
||||
|
||||
PostProcess.Clock();
|
||||
//if (toscreen) di->EndDrawScene(mainvp.sector, RenderState); // do not call this for camera textures.
|
||||
|
||||
if (RenderState.GetPassType() == GBUFFER_PASS) // Turn off ssao draw buffers
|
||||
/*if (RenderState.GetPassType() == GBUFFER_PASS) // Turn off ssao draw buffers
|
||||
{
|
||||
RenderState.SetPassType(NORMAL_PASS);
|
||||
RenderState.EnableDrawBuffers(1);
|
||||
}
|
||||
}*/
|
||||
|
||||
auto cm = CM_DEFAULT; // di->SetFullbrightFlags(mainview ? vp.camera->player : nullptr);
|
||||
float flash = 1.f;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
void main()
|
||||
{
|
||||
#ifdef USE_LEVELMESH
|
||||
FragColor = vec4(fract(gl_FragCoord.x / 500), fract(gl_FragCoord.x / 500), 1.0, 1.0);
|
||||
FragColor = vec4(vec3(pixelpos.w / 1000), 1.0);
|
||||
#else
|
||||
|
||||
#ifdef NO_CLIPDISTANCE_SUPPORT
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@ void main()
|
|||
parmTexCoord = aTexCoord;
|
||||
parmPosition = bones.Position;
|
||||
|
||||
#ifdef USE_LEVELMESH
|
||||
parmPosition.xyz = parmPosition.xzy; // The level mesh is in world coordinates
|
||||
#endif
|
||||
|
||||
#ifndef SIMPLE
|
||||
vec4 worldcoord = ModelMatrix * mix(parmPosition, aVertex2, uInterpolationFactor);
|
||||
#else
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue