mirror of
https://github.com/godotengine/godot.git
synced 2024-11-27 09:16:35 +08:00
d3b49c416a
-Used a more consistent set of keywords for the shader -Remove all harcoded entry points -Re-wrote the GLSL shader parser, new system is more flexible. Allows any entry point organization. -Entry point for sky shaders is now sky(). -Entry point for particle shaders is now process().
109 lines
2.3 KiB
GLSL
109 lines
2.3 KiB
GLSL
#[versions]
|
|
|
|
lines = "#define MODE_LINES";
|
|
triangles = "#define MODE_TRIANGLES";
|
|
|
|
#[vertex]
|
|
|
|
#version 450
|
|
|
|
#VERSION_DEFINES
|
|
|
|
#include "lm_common_inc.glsl"
|
|
|
|
layout(push_constant, binding = 0, std430) uniform Params {
|
|
uint base_index;
|
|
uint slice;
|
|
vec2 uv_offset;
|
|
bool debug;
|
|
float blend;
|
|
uint pad[2];
|
|
}
|
|
params;
|
|
|
|
layout(location = 0) out vec3 uv_interp;
|
|
|
|
void main() {
|
|
#ifdef MODE_TRIANGLES
|
|
uint triangle_idx = params.base_index + gl_VertexIndex / 3;
|
|
uint triangle_subidx = gl_VertexIndex % 3;
|
|
|
|
vec2 uv;
|
|
if (triangle_subidx == 0) {
|
|
uv = vertices.data[triangles.data[triangle_idx].indices.x].uv;
|
|
} else if (triangle_subidx == 1) {
|
|
uv = vertices.data[triangles.data[triangle_idx].indices.y].uv;
|
|
} else {
|
|
uv = vertices.data[triangles.data[triangle_idx].indices.z].uv;
|
|
}
|
|
|
|
uv_interp = vec3(uv, float(params.slice));
|
|
gl_Position = vec4((uv + params.uv_offset) * 2.0 - 1.0, 0.0001, 1.0);
|
|
#endif
|
|
|
|
#ifdef MODE_LINES
|
|
uint seam_idx = params.base_index + gl_VertexIndex / 4;
|
|
uint seam_subidx = gl_VertexIndex % 4;
|
|
|
|
uint src_idx;
|
|
uint dst_idx;
|
|
|
|
if (seam_subidx == 0) {
|
|
src_idx = seams.data[seam_idx].b.x;
|
|
dst_idx = seams.data[seam_idx].a.x;
|
|
} else if (seam_subidx == 1) {
|
|
src_idx = seams.data[seam_idx].b.y;
|
|
dst_idx = seams.data[seam_idx].a.y;
|
|
} else if (seam_subidx == 2) {
|
|
src_idx = seams.data[seam_idx].a.x;
|
|
dst_idx = seams.data[seam_idx].b.x;
|
|
} else if (seam_subidx == 3) {
|
|
src_idx = seams.data[seam_idx].a.y;
|
|
dst_idx = seams.data[seam_idx].b.y;
|
|
}
|
|
|
|
vec2 src_uv = vertices.data[src_idx].uv;
|
|
vec2 dst_uv = vertices.data[dst_idx].uv + params.uv_offset;
|
|
|
|
uv_interp = vec3(src_uv, float(params.slice));
|
|
gl_Position = vec4(dst_uv * 2.0 - 1.0, 0.0001, 1.0);
|
|
#endif
|
|
}
|
|
|
|
#[fragment]
|
|
|
|
#version 450
|
|
|
|
#VERSION_DEFINES
|
|
|
|
#include "lm_common_inc.glsl"
|
|
|
|
layout(push_constant, binding = 0, std430) uniform Params {
|
|
uint base_index;
|
|
uint slice;
|
|
vec2 uv_offset;
|
|
bool debug;
|
|
float blend;
|
|
uint pad[2];
|
|
}
|
|
params;
|
|
|
|
layout(location = 0) in vec3 uv_interp;
|
|
|
|
layout(location = 0) out vec4 dst_color;
|
|
|
|
layout(set = 1, binding = 0) uniform texture2DArray src_color_tex;
|
|
|
|
void main() {
|
|
if (params.debug) {
|
|
#ifdef MODE_TRIANGLES
|
|
dst_color = vec4(1, 0, 1, 1);
|
|
#else
|
|
dst_color = vec4(1, 1, 0, 1);
|
|
#endif
|
|
} else {
|
|
vec4 src_color = textureLod(sampler2DArray(src_color_tex, linear_sampler), uv_interp, 0.0);
|
|
dst_color = vec4(src_color.rgb, params.blend); //mix
|
|
}
|
|
}
|