sprite ssbo batch render
This commit is contained in:
parent
d4b057dc6f
commit
9d51858266
|
@ -149,6 +149,7 @@ sprite.inputs.kp1 = function() { this.setanchor("ul"); }
|
||||||
component.sprite = function(obj) {
|
component.sprite = function(obj) {
|
||||||
var sp = Object.create(sprite);
|
var sp = Object.create(sprite);
|
||||||
sp.gameobject = obj;
|
sp.gameobject = obj;
|
||||||
|
sp.transform = obj.transform;
|
||||||
sp.guid = prosperon.guid();
|
sp.guid = prosperon.guid();
|
||||||
allsprites[sp.guid] = sp;
|
allsprites[sp.guid] = sp;
|
||||||
return sp;
|
return sp;
|
||||||
|
|
|
@ -358,6 +358,7 @@ function process() {
|
||||||
}
|
}
|
||||||
var st = profile.now();
|
var st = profile.now();
|
||||||
prosperon.window_render(window.size);
|
prosperon.window_render(window.size);
|
||||||
|
profile.addreport(null, "window render", st);
|
||||||
prosperon.render();
|
prosperon.render();
|
||||||
profile.addreport(profcache, "render frame", st);
|
profile.addreport(profcache, "render frame", st);
|
||||||
frames.push(profile.secs(profile.now() - startframe));
|
frames.push(profile.secs(profile.now() - startframe));
|
||||||
|
|
|
@ -24,6 +24,7 @@ function unique_name(list, name = "new_object") {
|
||||||
};
|
};
|
||||||
|
|
||||||
var entity = {
|
var entity = {
|
||||||
|
drawlayer: -1,
|
||||||
get_comp_by_name(name) {
|
get_comp_by_name(name) {
|
||||||
var comps = [];
|
var comps = [];
|
||||||
for (var c of Object.values(this.components))
|
for (var c of Object.values(this.components))
|
||||||
|
|
|
@ -13,14 +13,13 @@ emitter.draw = function()
|
||||||
if (amt === 0) return;
|
if (amt === 0) return;
|
||||||
render.use_shader(this.shader);
|
render.use_shader(this.shader);
|
||||||
render.use_mat(this);
|
render.use_mat(this);
|
||||||
var ts = [];
|
render.make_particle_ssbo(Object.values(this.particles), this.ssbo);
|
||||||
for (var p of Object.values(this.particles)) ts.push([p.transform,p.color]);
|
|
||||||
render.make_particle_ssbo(ts, this.ssbo);
|
|
||||||
render.draw(this.shape, this.ssbo, amt);
|
render.draw(this.shape, this.ssbo, amt);
|
||||||
}
|
}
|
||||||
|
|
||||||
var std_spawn = function(par)
|
var std_spawn = function(par)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var std_step = function(p)
|
var std_step = function(p)
|
||||||
|
|
|
@ -8,6 +8,8 @@ var cur = {};
|
||||||
|
|
||||||
render.use_shader = function(shader)
|
render.use_shader = function(shader)
|
||||||
{
|
{
|
||||||
|
if (typeof shader === 'string')
|
||||||
|
shader = render.make_shader(shader);
|
||||||
if (cur.shader === shader) return;
|
if (cur.shader === shader) return;
|
||||||
cur.shader = shader;
|
cur.shader = shader;
|
||||||
cur.globals = {};
|
cur.globals = {};
|
||||||
|
@ -435,10 +437,12 @@ var circleshader;
|
||||||
var polyshader;
|
var polyshader;
|
||||||
var slice9shader;
|
var slice9shader;
|
||||||
var parshader;
|
var parshader;
|
||||||
|
var spritessboshader;
|
||||||
|
|
||||||
render.init = function() {
|
render.init = function() {
|
||||||
textshader = render.make_shader("shaders/text_base.cg");
|
textshader = render.make_shader("shaders/text_base.cg");
|
||||||
render.spriteshader = render.make_shader("shaders/sprite.cg");
|
render.spriteshader = render.make_shader("shaders/sprite.cg");
|
||||||
|
spritessboshader = render.make_shader("shaders/sprite_ssbo.cg");
|
||||||
render.postshader = render.make_shader("shaders/simplepost.cg");
|
render.postshader = render.make_shader("shaders/simplepost.cg");
|
||||||
slice9shader = render.make_shader("shaders/9slice.cg");
|
slice9shader = render.make_shader("shaders/9slice.cg");
|
||||||
circleshader = render.make_shader("shaders/circle.cg");
|
circleshader = render.make_shader("shaders/circle.cg");
|
||||||
|
|
60
shaders/sprite_ssbo.cg
Normal file
60
shaders/sprite_ssbo.cg
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#blend mix
|
||||||
|
#depth off
|
||||||
|
#primitive triangle
|
||||||
|
#cull none
|
||||||
|
|
||||||
|
@vs vs
|
||||||
|
in vec3 a_pos;
|
||||||
|
in vec2 a_uv;
|
||||||
|
out vec2 uv;
|
||||||
|
|
||||||
|
vec3 pos;
|
||||||
|
|
||||||
|
struct sprite {
|
||||||
|
mat4 model;
|
||||||
|
vec4 rect;
|
||||||
|
};
|
||||||
|
|
||||||
|
readonly buffer ssbo {
|
||||||
|
sprite sprites[];
|
||||||
|
};
|
||||||
|
|
||||||
|
uniform mat4 projection;
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 vp;
|
||||||
|
uniform vec2 diffuse_size;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
sprite s = sprites[gl_InstanceIndex];
|
||||||
|
pos = a_pos;
|
||||||
|
uv = a_uv;
|
||||||
|
pos *= vec3(diffuse_size * s.rect.zw,1);
|
||||||
|
uv = (uv*s.rect.zw)+s.rect.xy;
|
||||||
|
gl_Position = vp * s.model * vec4(pos, 1.0);
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@fs fs
|
||||||
|
|
||||||
|
in vec2 uv;
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
texture2D diffuse;
|
||||||
|
sampler smp;
|
||||||
|
|
||||||
|
uniform vec4 shade;
|
||||||
|
void frag()
|
||||||
|
{
|
||||||
|
color = texture(sampler2D(diffuse,smp), uv);
|
||||||
|
color *= shade;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
frag();
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@program sprite vs fs
|
|
@ -963,15 +963,49 @@ JSC_CCALL(render_make_particle_ssbo,
|
||||||
|
|
||||||
for (int i = 0; i < js_arrlen(array); i++) {
|
for (int i = 0; i < js_arrlen(array); i++) {
|
||||||
JSValue sub = js_getpropidx(array,i);
|
JSValue sub = js_getpropidx(array,i);
|
||||||
ms[i].model = transform2mat(*js2transform(js_getpropidx(sub, 0)));
|
ms[i].model = transform2mat(*js2transform(js_getpropstr(sub, "transform")));
|
||||||
ms[i].color = js2vec4(js_getpropidx(sub,1));
|
ms[i].color = js2vec4(js_getpropstr(sub,"color"));
|
||||||
}
|
}
|
||||||
|
|
||||||
sg_append_buffer(*b, (&(sg_range){
|
sg_append_buffer(*b, (&(sg_range){
|
||||||
.ptr = ms,
|
.ptr = ms,
|
||||||
.size = size
|
.size = size
|
||||||
}));
|
}));
|
||||||
|
)
|
||||||
|
|
||||||
|
typedef struct sprite_ss {
|
||||||
|
HMM_Mat4 model;
|
||||||
|
HMM_Vec4 rect;
|
||||||
|
} sprite_ss;
|
||||||
|
|
||||||
|
JSC_CCALL(render_make_sprite_ssbo,
|
||||||
|
JSValue array = argv[0];
|
||||||
|
size_t size = js_arrlen(array)*(sizeof(sprite_ss));
|
||||||
|
sg_buffer *b = js2sg_buffer(argv[1]);
|
||||||
|
if (!b) return JS_UNDEFINED;
|
||||||
|
|
||||||
|
sprite_ss ms[js_arrlen(array)];
|
||||||
|
|
||||||
|
if (sg_query_buffer_will_overflow(*b, size)) {
|
||||||
|
sg_destroy_buffer(*b);
|
||||||
|
*b = sg_make_buffer(&(sg_buffer_desc){
|
||||||
|
.type = SG_BUFFERTYPE_STORAGEBUFFER,
|
||||||
|
.size = size,
|
||||||
|
.usage = SG_USAGE_STREAM,
|
||||||
|
.label = "transform buffer"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < js_arrlen(array); i++) {
|
||||||
|
JSValue sub = js_getpropidx(array,i);
|
||||||
|
ms[i].model = transform2mat(*js2transform(js_getpropstr(sub, "transform")));
|
||||||
|
ms[i].rect = js2vec4(js_getpropstr(sub,"rect"));
|
||||||
|
}
|
||||||
|
|
||||||
|
sg_append_buffer(*b, (&(sg_range){
|
||||||
|
.ptr = ms,
|
||||||
|
.size = size
|
||||||
|
}));
|
||||||
)
|
)
|
||||||
|
|
||||||
JSC_CCALL(render_make_t_ssbo,
|
JSC_CCALL(render_make_t_ssbo,
|
||||||
|
@ -1051,7 +1085,8 @@ static const JSCFunctionListEntry js_render_funcs[] = {
|
||||||
MIST_FUNC_DEF(render, imgui_end, 0),
|
MIST_FUNC_DEF(render, imgui_end, 0),
|
||||||
MIST_FUNC_DEF(render, imgui_init, 0),
|
MIST_FUNC_DEF(render, imgui_init, 0),
|
||||||
MIST_FUNC_DEF(render, make_t_ssbo, 2),
|
MIST_FUNC_DEF(render, make_t_ssbo, 2),
|
||||||
MIST_FUNC_DEF(render, make_particle_ssbo, 2)
|
MIST_FUNC_DEF(render, make_particle_ssbo, 2),
|
||||||
|
MIST_FUNC_DEF(render, make_sprite_ssbo, 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
JSC_CCALL(gui_scissor, sg_apply_scissor_rect(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), 0))
|
JSC_CCALL(gui_scissor, sg_apply_scissor_rect(js2number(argv[0]), js2number(argv[1]), js2number(argv[2]), js2number(argv[3]), 0))
|
||||||
|
|
Loading…
Reference in a new issue