Improve Pass:fill;

It can now fill an array texture to a multiview pass, copying to
the corresponding layers.
This commit is contained in:
bjorn 2022-08-26 09:56:33 -07:00
parent d655daf213
commit 5a2fe54c04
7 changed files with 35 additions and 10 deletions

View File

@ -1,11 +1,12 @@
#include "shaders/unlit.vert.h"
#include "shaders/unlit.frag.h"
#include "shaders/font.frag.h"
#include "shaders/fill.vert.h"
#include "shaders/cubemap.vert.h"
#include "shaders/cubemap.frag.h"
#include "shaders/equirect.frag.h"
#include "shaders/stereoblit.frag.h"
#include "shaders/fill.vert.h"
#include "shaders/fill_array.frag.h"
#include "shaders/fill_stereo.frag.h"
#include "shaders/animator.comp.h"
#include "shaders/timewizard.comp.h"

View File

@ -0,0 +1,11 @@
#version 460
#extension GL_EXT_multiview : require
#extension GL_GOOGLE_include_directive : require
#include "lovr.glsl"
layout(set = 1, binding = 1) uniform texture2DArray ArrayTexture;
vec4 lovrmain() {
return Color * getPixel(ArrayTexture, UV, ViewIndex);
}

View File

@ -157,7 +157,6 @@ layout(location = 14) in vec3 Tangent;
vec4 getPixel(texture2D t, vec2 uv) { return texture(sampler2D(t, Sampler), uv); }
vec4 getPixel(texture3D t, vec3 uvw) { return texture(sampler3D(t, Sampler), uvw); }
vec4 getPixel(textureCube t, vec3 dir) { return texture(samplerCube(t, Sampler), dir); }
vec4 getPixel(texture2DArray t, vec2 uv, uint layer) { return texture(sampler2DArray(t, Sampler), vec3(uv, layer)); }
vec4 getPixel(texture2DArray t, vec2 uv, float layer) { return texture(sampler2DArray(t, Sampler), vec3(uv, layer)); }
#endif

View File

@ -58,7 +58,6 @@ StringEntry lovrDefaultShader[] = {
[SHADER_CUBEMAP] = ENTRY("cubemap"),
[SHADER_EQUIRECT] = ENTRY("equirect"),
[SHADER_FILL] = ENTRY("fill"),
[SHADER_STEREOBLIT] = ENTRY("stereoblit"),
{ 0 }
};

View File

@ -1618,9 +1618,13 @@ ShaderSource lovrGraphicsGetDefaultShaderSource(DefaultShader type, ShaderStage
{ lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) },
{ lovr_shader_unlit_frag, sizeof(lovr_shader_unlit_frag) }
},
[SHADER_STEREOBLIT] = {
[SHADER_FILL_ARRAY] = {
{ lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) },
{ lovr_shader_stereoblit_frag, sizeof(lovr_shader_stereoblit_frag) }
{ lovr_shader_fill_array_frag, sizeof(lovr_shader_fill_array_frag) }
},
[SHADER_FILL_STEREO] = {
{ lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert) },
{ lovr_shader_fill_stereo_frag, sizeof(lovr_shader_fill_stereo_frag) }
}
};
@ -4989,10 +4993,20 @@ void lovrPassSkybox(Pass* pass, Texture* texture) {
}
void lovrPassFill(Pass* pass, Texture* texture) {
DefaultShader shader = SHADER_FILL;
if (texture && texture->info.layers == 2) {
shader = SHADER_STEREOBLIT;
DefaultShader shader;
if (!texture || texture->info.layers == 1) {
shader = SHADER_FILL;
} else if (pass->viewCount > 1 && texture->info.layers > 1) {
lovrCheck(texture->info.layers == pass->viewCount, "Texture layer counts must match to fill between them");
shader = SHADER_FILL_ARRAY;
} else if (pass->viewCount == 1 && texture->info.layers > 1) {
lovrCheck(texture->info.layers == 2, "To draw an array texture to a mono texture, it must have 2 layers");
shader = SHADER_FILL_STEREO;
} else {
lovrUnreachable();
}
lovrPassDraw(pass, &(Draw) {
.mode = MESH_TRIANGLES,
.shader = shader,

View File

@ -273,7 +273,8 @@ typedef enum {
SHADER_CUBEMAP,
SHADER_EQUIRECT,
SHADER_FILL,
SHADER_STEREOBLIT,
SHADER_FILL_ARRAY,
SHADER_FILL_STEREO,
DEFAULT_SHADER_COUNT
} DefaultShader;