Skip to content
Snippets Groups Projects
Commit 0e617e8b authored by Alexander Rose's avatar Alexander Rose
Browse files

renderable sorting improvements and fixes

parent b6bb956d
Branches
Tags
No related merge requests found
...@@ -22,6 +22,7 @@ export type RenderableState = { ...@@ -22,6 +22,7 @@ export type RenderableState = {
export interface Renderable<T extends RenderableValues> { export interface Renderable<T extends RenderableValues> {
readonly id: number readonly id: number
readonly materialId: number
readonly values: T readonly values: T
readonly state: RenderableState readonly state: RenderableState
...@@ -34,6 +35,7 @@ export interface Renderable<T extends RenderableValues> { ...@@ -34,6 +35,7 @@ export interface Renderable<T extends RenderableValues> {
export function createRenderable<T extends Values<RenderableSchema>>(renderItem: RenderItem, values: T, state: RenderableState): Renderable<T> { export function createRenderable<T extends Values<RenderableSchema>>(renderItem: RenderItem, values: T, state: RenderableState): Renderable<T> {
return { return {
id: getNextRenderableId(), id: getNextRenderableId(),
materialId: renderItem.materialId,
values, values,
state, state,
......
...@@ -38,15 +38,19 @@ function calculateBoundingSphere(renderables: Renderable<RenderableValues & Base ...@@ -38,15 +38,19 @@ function calculateBoundingSphere(renderables: Renderable<RenderableValues & Base
function renderableSort(a: Renderable<RenderableValues & BaseValues>, b: Renderable<RenderableValues & BaseValues>) { function renderableSort(a: Renderable<RenderableValues & BaseValues>, b: Renderable<RenderableValues & BaseValues>) {
const drawProgramIdA = a.getProgram('draw').id const drawProgramIdA = a.getProgram('draw').id
const drawProgramIdB = b.getProgram('draw').id const drawProgramIdB = b.getProgram('draw').id
const materialIdA = a.materialId
const materialIdB = b.materialId
const zA = a.values.boundingSphere.ref.value.center[2] const zA = a.values.boundingSphere.ref.value.center[2]
const zB = a.values.boundingSphere.ref.value.center[2] const zB = b.values.boundingSphere.ref.value.center[2]
if (drawProgramIdA !== drawProgramIdB) { if (drawProgramIdA !== drawProgramIdB) {
return drawProgramIdA - drawProgramIdB; // sort by program id to minimize gl state changes return drawProgramIdA - drawProgramIdB // sort by program id to minimize gl state changes
} else if (materialIdA !== materialIdB) {
return materialIdA - materialIdB // sort by material id to minimize gl state changes
} else if (zA !== zB) { } else if (zA !== zB) {
return a.state.opaque return a.state.opaque
? zA - zB // when opaque draw closer elements first to minimize overdraw ? zA - zB // when opaque, draw closer elements first to minimize overdraw
: zB - zA // when transparent draw elements last to maximize partial visibility : zB - zA // when transparent, draw elements last to maximize partial visibility
} else { } else {
return a.id - b.id; return a.id - b.id;
} }
......
...@@ -35,6 +35,7 @@ export function getDrawMode(ctx: WebGLContext, drawMode: DrawMode) { ...@@ -35,6 +35,7 @@ export function getDrawMode(ctx: WebGLContext, drawMode: DrawMode) {
export interface RenderItem { export interface RenderItem {
readonly id: number readonly id: number
readonly materialId: number
getProgram: (variant: RenderVariant) => Program getProgram: (variant: RenderVariant) => Program
render: (variant: RenderVariant) => void render: (variant: RenderVariant) => void
...@@ -133,6 +134,7 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo ...@@ -133,6 +134,7 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo
return { return {
id, id,
materialId,
getProgram: (variant: RenderVariant) => programs[variant].value, getProgram: (variant: RenderVariant) => programs[variant].value,
render: (variant: RenderVariant) => { render: (variant: RenderVariant) => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment