renderer_vulkan: Fix culling related issues

This commit is contained in:
emufan
2022-06-19 00:09:02 +03:00
parent 816a846cfb
commit 69bde2b13b
3 changed files with 12 additions and 18 deletions

View File

@ -293,7 +293,8 @@ bool RasterizerVulkan::Draw(bool accelerate, bool is_indexed) {
// Sync the viewport // Sync the viewport
vk::Viewport viewport{0, 0, static_cast<float>(viewport_rect_unscaled.GetWidth() * res_scale), vk::Viewport viewport{0, 0, static_cast<float>(viewport_rect_unscaled.GetWidth() * res_scale),
static_cast<float>(viewport_rect_unscaled.GetHeight() * res_scale)}; static_cast<float>(viewport_rect_unscaled.GetHeight() * res_scale),
0.f, 1.f};
state.SetViewport(viewport); state.SetViewport(viewport);
if (uniform_block_data.data.framebuffer_scale != res_scale) { if (uniform_block_data.data.framebuffer_scale != res_scale) {
@ -1146,12 +1147,12 @@ void RasterizerVulkan::SyncCullMode() {
break; break;
case Pica::RasterizerRegs::CullMode::KeepClockWise: case Pica::RasterizerRegs::CullMode::KeepClockWise:
state.SetCullMode(vk::CullModeFlagBits::eBack); state.SetCullMode(vk::CullModeFlagBits::eFront);
state.SetFrontFace(vk::FrontFace::eClockwise); state.SetFrontFace(vk::FrontFace::eClockwise);
break; break;
case Pica::RasterizerRegs::CullMode::KeepCounterClockWise: case Pica::RasterizerRegs::CullMode::KeepCounterClockWise:
state.SetCullMode(vk::CullModeFlagBits::eBack); state.SetCullMode(vk::CullModeFlagBits::eFront);
state.SetFrontFace(vk::FrontFace::eCounterClockwise); state.SetFrontFace(vk::FrontFace::eCounterClockwise);
break; break;

View File

@ -1275,8 +1275,6 @@ std::string GenerateFragmentShader(const PicaFSConfig& config) {
out += R"( out += R"(
#version 450 #version 450
#extension GL_ARB_shader_image_load_store : enable
#extension GL_ARB_shader_image_size : enable
#define ALLOW_SHADOW 0 #define ALLOW_SHADOW 0
)"; )";
out += "#extension GL_ARB_separate_shader_objects : enable\n"; out += "#extension GL_ARB_separate_shader_objects : enable\n";
@ -1284,9 +1282,7 @@ std::string GenerateFragmentShader(const PicaFSConfig& config) {
out += GetVertexInterfaceDeclaration(false, true); out += GetVertexInterfaceDeclaration(false, true);
out += R"( out += R"(
#ifndef CITRA_GLES
in vec4 gl_FragCoord; in vec4 gl_FragCoord;
#endif // CITRA_GLES
layout (location = 0) out vec4 color; layout (location = 0) out vec4 color;
@ -1539,7 +1535,6 @@ vec4 secondary_fragment_color = vec4(0.0);
// do our own transformation according to PICA specification. // do our own transformation according to PICA specification.
out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n" out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n"
"float depth = z_over_w * depth_scale + depth_offset;\n"; "float depth = z_over_w * depth_scale + depth_offset;\n";
//out += "if (gl_FragCoord.z == 0) { color = vec4(1.0, 0.0, 0.0, 1.0); return; }\n";
if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) { if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) {
out += "depth /= gl_FragCoord.w;\n"; out += "depth /= gl_FragCoord.w;\n";
} }
@ -1657,13 +1652,11 @@ void main() {
normquat = vert_normquat; normquat = vert_normquat;
view = vert_view; view = vert_view;
// Convert OpenGL [-1, 1] to Vulkan [0, 1] gl_Position = vert_position;
vec4 position = vert_position; gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;
position.z = (position.z + 1) * 0.5; //gl_Position.y = -gl_Position.y;
//gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
gl_Position = position; //gl_ClipDistance[1] = dot(clip_coef, vert_position);
gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
gl_ClipDistance[1] = dot(clip_coef, vert_position);
} }
)"; )";

View File

@ -95,9 +95,9 @@ VulkanState::VulkanState(const std::shared_ptr<VKSwapChain>& swapchain) : swapch
// Create texture sampler // Create texture sampler
auto props = g_vk_instace->GetPhysicalDevice().getProperties(); auto props = g_vk_instace->GetPhysicalDevice().getProperties();
vk::SamplerCreateInfo sampler_info{ vk::SamplerCreateInfo sampler_info{
{}, vk::Filter::eNearest, {}, vk::Filter::eLinear,
vk::Filter::eNearest, vk::Filter::eLinear,
vk::SamplerMipmapMode::eNearest, vk::SamplerMipmapMode::eLinear,
vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge,
vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge,
vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge,