From 72aa38a5fab82eddf428f8d9f6bb88ccbe78b199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 26 Mar 2014 22:01:22 -0700 Subject: [PATCH] Added 19-oit example. --- README.md | 6 + examples/19-oit/fs_oit.sc | 15 + examples/19-oit/fs_oit_wb.sc | 22 + examples/19-oit/fs_oit_wb_blit.sc | 18 + examples/19-oit/fs_oit_wb_separate.sc | 21 + examples/19-oit/fs_oit_wb_separate_blit.sc | 19 + examples/19-oit/makefile | 17 + examples/19-oit/oit.cpp | 499 ++++++++++++++++++ examples/19-oit/screenshot.png | Bin 0 -> 59309 bytes examples/19-oit/varying.def.sc | 5 + examples/19-oit/vs_oit.sc | 18 + examples/19-oit/vs_oit_blit.sc | 15 + examples/common/imgui/imgui.cpp | 5 + examples/runtime/shaders/dx11/fs_oit.bin | Bin 0 -> 1044 bytes examples/runtime/shaders/dx11/fs_oit_wb.bin | Bin 0 -> 1452 bytes .../runtime/shaders/dx11/fs_oit_wb_blit.bin | Bin 0 -> 922 bytes .../shaders/dx11/fs_oit_wb_separate.bin | Bin 0 -> 1392 bytes .../shaders/dx11/fs_oit_wb_separate_blit.bin | Bin 0 -> 922 bytes examples/runtime/shaders/dx11/vs_oit.bin | Bin 0 -> 1526 bytes examples/runtime/shaders/dx11/vs_oit_blit.bin | Bin 0 -> 1240 bytes examples/runtime/shaders/dx9/fs_oit.bin | Bin 0 -> 183 bytes examples/runtime/shaders/dx9/fs_oit_wb.bin | Bin 0 -> 459 bytes .../runtime/shaders/dx9/fs_oit_wb_blit.bin | Bin 0 -> 393 bytes .../shaders/dx9/fs_oit_wb_separate.bin | Bin 0 -> 431 bytes .../shaders/dx9/fs_oit_wb_separate_blit.bin | Bin 0 -> 393 bytes examples/runtime/shaders/dx9/vs_oit.bin | Bin 0 -> 553 bytes examples/runtime/shaders/dx9/vs_oit_blit.bin | Bin 0 -> 319 bytes examples/runtime/shaders/gles/fs_oit.bin | Bin 0 -> 75 bytes examples/runtime/shaders/gles/fs_oit_wb.bin | Bin 0 -> 335 bytes .../runtime/shaders/gles/fs_oit_wb_blit.bin | Bin 0 -> 363 bytes .../shaders/gles/fs_oit_wb_separate.bin | Bin 0 -> 282 bytes .../shaders/gles/fs_oit_wb_separate_blit.bin | Bin 0 -> 363 bytes examples/runtime/shaders/gles/vs_oit.bin | Bin 0 -> 549 bytes examples/runtime/shaders/gles/vs_oit_blit.bin | Bin 0 -> 279 bytes examples/runtime/shaders/glsl/fs_oit.bin | Bin 0 -> 75 bytes examples/runtime/shaders/glsl/fs_oit_wb.bin | Bin 0 -> 335 bytes .../runtime/shaders/glsl/fs_oit_wb_blit.bin | Bin 0 -> 353 bytes .../shaders/glsl/fs_oit_wb_separate.bin | Bin 0 -> 282 bytes .../shaders/glsl/fs_oit_wb_separate_blit.bin | Bin 0 -> 353 bytes examples/runtime/shaders/glsl/vs_oit.bin | Bin 0 -> 543 bytes examples/runtime/shaders/glsl/vs_oit_blit.bin | Bin 0 -> 279 bytes premake/premake4.lua | 1 + 42 files changed, 661 insertions(+) create mode 100644 examples/19-oit/fs_oit.sc create mode 100644 examples/19-oit/fs_oit_wb.sc create mode 100644 examples/19-oit/fs_oit_wb_blit.sc create mode 100644 examples/19-oit/fs_oit_wb_separate.sc create mode 100644 examples/19-oit/fs_oit_wb_separate_blit.sc create mode 100644 examples/19-oit/makefile create mode 100644 examples/19-oit/oit.cpp create mode 100644 examples/19-oit/screenshot.png create mode 100644 examples/19-oit/varying.def.sc create mode 100644 examples/19-oit/vs_oit.sc create mode 100644 examples/19-oit/vs_oit_blit.sc create mode 100644 examples/runtime/shaders/dx11/fs_oit.bin create mode 100644 examples/runtime/shaders/dx11/fs_oit_wb.bin create mode 100644 examples/runtime/shaders/dx11/fs_oit_wb_blit.bin create mode 100644 examples/runtime/shaders/dx11/fs_oit_wb_separate.bin create mode 100644 examples/runtime/shaders/dx11/fs_oit_wb_separate_blit.bin create mode 100644 examples/runtime/shaders/dx11/vs_oit.bin create mode 100644 examples/runtime/shaders/dx11/vs_oit_blit.bin create mode 100644 examples/runtime/shaders/dx9/fs_oit.bin create mode 100644 examples/runtime/shaders/dx9/fs_oit_wb.bin create mode 100644 examples/runtime/shaders/dx9/fs_oit_wb_blit.bin create mode 100644 examples/runtime/shaders/dx9/fs_oit_wb_separate.bin create mode 100644 examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin create mode 100644 examples/runtime/shaders/dx9/vs_oit.bin create mode 100644 examples/runtime/shaders/dx9/vs_oit_blit.bin create mode 100644 examples/runtime/shaders/gles/fs_oit.bin create mode 100644 examples/runtime/shaders/gles/fs_oit_wb.bin create mode 100644 examples/runtime/shaders/gles/fs_oit_wb_blit.bin create mode 100644 examples/runtime/shaders/gles/fs_oit_wb_separate.bin create mode 100644 examples/runtime/shaders/gles/fs_oit_wb_separate_blit.bin create mode 100644 examples/runtime/shaders/gles/vs_oit.bin create mode 100644 examples/runtime/shaders/gles/vs_oit_blit.bin create mode 100644 examples/runtime/shaders/glsl/fs_oit.bin create mode 100644 examples/runtime/shaders/glsl/fs_oit_wb.bin create mode 100644 examples/runtime/shaders/glsl/fs_oit_wb_blit.bin create mode 100644 examples/runtime/shaders/glsl/fs_oit_wb_separate.bin create mode 100644 examples/runtime/shaders/glsl/fs_oit_wb_separate_blit.bin create mode 100644 examples/runtime/shaders/glsl/vs_oit.bin create mode 100644 examples/runtime/shaders/glsl/vs_oit_blit.bin diff --git a/README.md b/README.md index 56335ff7..bb061e6f 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,12 @@ Image based lighting. ![example-18-ibl](https://github.com/bkaradzic/bgfx/raw/master/examples/18-ibl/screenshot.png) +### [19-oit](https://github.com/bkaradzic/bgfx/tree/master/examples/19-oit) + +Weighted, Blended Order-Independent Transparency + +![example-19-oit](https://github.com/bkaradzic/bgfx/raw/master/examples/19-oit/screenshot.png) + Dependencies ------------ diff --git a/examples/19-oit/fs_oit.sc b/examples/19-oit/fs_oit.sc new file mode 100644 index 00000000..15a22deb --- /dev/null +++ b/examples/19-oit/fs_oit.sc @@ -0,0 +1,15 @@ +$input v_pos + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_color; + +void main() +{ + gl_FragColor = u_color; +} diff --git a/examples/19-oit/fs_oit_wb.sc b/examples/19-oit/fs_oit_wb.sc new file mode 100644 index 00000000..1689103f --- /dev/null +++ b/examples/19-oit/fs_oit_wb.sc @@ -0,0 +1,22 @@ +$input v_pos + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_color; + +void main() +{ + vec4 color = u_color; + + float depth = v_pos.z/v_pos.w; + + color.xyz *= color.w; + float weight = color.w * clamp(0.03 / (1e-5 + pow(depth / 200.0, 5.0) ), 0.01, 3000.0); + gl_FragData[0] = color * weight; + gl_FragData[1] = color.wwww; +} diff --git a/examples/19-oit/fs_oit_wb_blit.sc b/examples/19-oit/fs_oit_wb_blit.sc new file mode 100644 index 00000000..5306975b --- /dev/null +++ b/examples/19-oit/fs_oit_wb_blit.sc @@ -0,0 +1,18 @@ +$input v_texcoord0 + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +SAMPLER2D(u_texColor0, 0); +SAMPLER2D(u_texColor1, 1); + +void main() +{ + vec4 accum = texture2D(u_texColor0, v_texcoord0); + float opacity = texture2D(u_texColor1, v_texcoord0).x; + gl_FragColor = vec4(accum.xyz / clamp(accum.w, 1e-4, 5e4), opacity); +} diff --git a/examples/19-oit/fs_oit_wb_separate.sc b/examples/19-oit/fs_oit_wb_separate.sc new file mode 100644 index 00000000..bad95335 --- /dev/null +++ b/examples/19-oit/fs_oit_wb_separate.sc @@ -0,0 +1,21 @@ +$input v_pos + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_color; + +void main() +{ + vec4 color = u_color; + + float depth = v_pos.z/v_pos.w; + + float weight = color.w * clamp(0.03 / (1e-5 + pow(depth / 200.0, 5.0) ), 0.01, 3000.0); + gl_FragData[0] = color * weight; + gl_FragData[1] = vec4_splat(weight); +} diff --git a/examples/19-oit/fs_oit_wb_separate_blit.sc b/examples/19-oit/fs_oit_wb_separate_blit.sc new file mode 100644 index 00000000..1d50cb3a --- /dev/null +++ b/examples/19-oit/fs_oit_wb_separate_blit.sc @@ -0,0 +1,19 @@ +$input v_texcoord0 + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +SAMPLER2D(u_texColor0, 0); +SAMPLER2D(u_texColor1, 1); + +void main() +{ + vec4 accum = texture2D(u_texColor0, v_texcoord0); + float opacity = accum.w; + float weight = texture2D(u_texColor1, v_texcoord0).x; + gl_FragColor = vec4(accum.xyz / clamp(weight, 1e-4, 5e4), opacity); +} diff --git a/examples/19-oit/makefile b/examples/19-oit/makefile new file mode 100644 index 00000000..90c11e95 --- /dev/null +++ b/examples/19-oit/makefile @@ -0,0 +1,17 @@ +# +# Copyright 2011-2014 Branimir Karadzic. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +BGFX_DIR=../.. +RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build + +include $(BGFX_DIR)/premake/shader.mk + +rebuild: + @make -s --no-print-directory TARGET=0 clean all + @make -s --no-print-directory TARGET=1 clean all + @make -s --no-print-directory TARGET=2 clean all + @make -s --no-print-directory TARGET=3 clean all + @make -s --no-print-directory TARGET=4 clean all diff --git a/examples/19-oit/oit.cpp b/examples/19-oit/oit.cpp new file mode 100644 index 00000000..df9f3aa4 --- /dev/null +++ b/examples/19-oit/oit.cpp @@ -0,0 +1,499 @@ +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.h" + +#include +#include +#include "fpumath.h" +#include "imgui/imgui.h" + +#include +#include + +struct PosColorVertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_abgr; + + static void init() + { + ms_decl.begin(); + ms_decl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + ms_decl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true); + ms_decl.end(); + } + + static bgfx::VertexDecl ms_decl; +}; + +bgfx::VertexDecl PosColorVertex::ms_decl; + +struct PosColorTexCoord0Vertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_rgba; + float m_u; + float m_v; + + static void init() + { + ms_decl.begin(); + ms_decl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + ms_decl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true); + ms_decl.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float); + ms_decl.end(); + } + + static bgfx::VertexDecl ms_decl; +}; + +bgfx::VertexDecl PosColorTexCoord0Vertex::ms_decl; + +static PosColorVertex s_cubeVertices[8] = +{ + {-1.0f, 1.0f, 1.0f, 0xff000000 }, + { 1.0f, 1.0f, 1.0f, 0xff0000ff }, + {-1.0f, -1.0f, 1.0f, 0xff00ff00 }, + { 1.0f, -1.0f, 1.0f, 0xff00ffff }, + {-1.0f, 1.0f, -1.0f, 0xffff0000 }, + { 1.0f, 1.0f, -1.0f, 0xffff00ff }, + {-1.0f, -1.0f, -1.0f, 0xffffff00 }, + { 1.0f, -1.0f, -1.0f, 0xffffffff }, +}; + +static const uint16_t s_cubeIndices[36] = +{ + 0, 1, 2, // 0 + 1, 3, 2, + 4, 6, 5, // 2 + 5, 6, 7, + 0, 2, 4, // 4 + 4, 2, 6, + 1, 5, 3, // 6 + 5, 7, 3, + 0, 4, 1, // 8 + 4, 5, 1, + 2, 3, 6, // 10 + 6, 3, 7, +}; + +static const char* s_shaderPath = NULL; + +static void shaderFilePath(char* _out, const char* _name) +{ + strcpy(_out, s_shaderPath); + strcat(_out, _name); + strcat(_out, ".bin"); +} + +long int fsize(FILE* _file) +{ + long int pos = ftell(_file); + fseek(_file, 0L, SEEK_END); + long int size = ftell(_file); + fseek(_file, pos, SEEK_SET); + return size; +} + +static const bgfx::Memory* load(const char* _filePath) +{ + FILE* file = fopen(_filePath, "rb"); + if (NULL != file) + { + uint32_t size = (uint32_t)fsize(file); + const bgfx::Memory* mem = bgfx::alloc(size+1); + size_t ignore = fread(mem->data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + mem->data[mem->size-1] = '\0'; + return mem; + } + + return NULL; +} + +static const bgfx::Memory* loadShader(const char* _name) +{ + char filePath[512]; + shaderFilePath(filePath, _name); + return load(filePath); +} + +static bgfx::ProgramHandle loadProgram(const char* _vshName, const char* _fshName) +{ + const bgfx::Memory* mem; + + mem = loadShader(_vshName); + bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + + mem = loadShader(_fshName); + bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem); + + return bgfx::createProgram(vsh, fsh, true); +} + +static float s_texelHalf = 0.0f; +static bool s_flipV = false; + +void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBottomLeft = false, float _width = 1.0f, float _height = 1.0f) +{ + if (bgfx::checkAvailTransientVertexBuffer(3, PosColorTexCoord0Vertex::ms_decl) ) + { + bgfx::TransientVertexBuffer vb; + bgfx::allocTransientVertexBuffer(&vb, 3, PosColorTexCoord0Vertex::ms_decl); + PosColorTexCoord0Vertex* vertex = (PosColorTexCoord0Vertex*)vb.data; + + const float zz = 0.0f; + + const float minx = -_width; + const float maxx = _width; + const float miny = 0.0f; + const float maxy = _height*2.0f; + + const float texelHalfW = s_texelHalf/_textureWidth; + const float texelHalfH = s_texelHalf/_textureHeight; + const float minu = -1.0f + texelHalfW; + const float maxu = 1.0f + texelHalfW; + + float minv = texelHalfH; + float maxv = 2.0f + texelHalfH; + + if (_originBottomLeft) + { + float tmp = minv; + minv = maxv; + maxv = tmp; + + minv -= 1.0f; + maxv -= 1.0f; + } + + vertex[0].m_x = minx; + vertex[0].m_y = miny; + vertex[0].m_z = zz; + vertex[0].m_rgba = 0xffffffff; + vertex[0].m_u = minu; + vertex[0].m_v = minv; + + vertex[1].m_x = maxx; + vertex[1].m_y = miny; + vertex[1].m_z = zz; + vertex[1].m_rgba = 0xffffffff; + vertex[1].m_u = maxu; + vertex[1].m_v = minv; + + vertex[2].m_x = maxx; + vertex[2].m_y = maxy; + vertex[2].m_z = zz; + vertex[2].m_rgba = 0xffffffff; + vertex[2].m_u = maxu; + vertex[2].m_v = maxv; + + bgfx::setVertexBuffer(&vb); + } +} + +int _main_(int /*_argc*/, char** /*_argv*/) +{ + // Create vertex stream declaration. + PosColorVertex::init(); + PosColorTexCoord0Vertex::init(); + + uint32_t width = 1280; + uint32_t height = 720; + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_VSYNC; + + bgfx::init(); + bgfx::reset(width, height, reset); + + // Enable debug text. + bgfx::setDebug(debug); + + // Get renderer capabilities info. + const bgfx::Caps* caps = bgfx::getCaps(); + + // Setup root path for binary shaders. Shader binaries are different + // for each renderer. + switch (caps->rendererType) + { + default: + case bgfx::RendererType::Direct3D9: + s_shaderPath = "shaders/dx9/"; + s_texelHalf = 0.5f; + break; + + case bgfx::RendererType::Direct3D11: + s_shaderPath = "shaders/dx11/"; + break; + + case bgfx::RendererType::OpenGL: + s_shaderPath = "shaders/glsl/"; + s_flipV = true; + break; + + case bgfx::RendererType::OpenGLES2: + case bgfx::RendererType::OpenGLES3: + s_shaderPath = "shaders/gles/"; + s_flipV = true; + break; + } + + // Imgui. + FILE* file = fopen("font/droidsans.ttf", "rb"); + uint32_t size = (uint32_t)fsize(file); + void* data = malloc(size); + size_t ignore = fread(data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + imguiCreate(data, size); + + const bgfx::Memory* mem; + + // Create static vertex buffer. + mem = bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ); + bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer(mem, PosColorVertex::ms_decl); + + // Create static index buffer. + mem = bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ); + bgfx::IndexBufferHandle ibh = bgfx::createIndexBuffer(mem); + + // Create texture sampler uniforms. + bgfx::UniformHandle u_texColor0 = bgfx::createUniform("u_texColor0", bgfx::UniformType::Uniform1iv); + bgfx::UniformHandle u_texColor1 = bgfx::createUniform("u_texColor1", bgfx::UniformType::Uniform1iv); + bgfx::UniformHandle u_color = bgfx::createUniform("u_color", bgfx::UniformType::Uniform4fv); + + bgfx::ProgramHandle blend = loadProgram("vs_oit", "fs_oit" ); + bgfx::ProgramHandle wbSeparatePass = loadProgram("vs_oit", "fs_oit_wb_separate" ); + bgfx::ProgramHandle wbSeparateBlit = loadProgram("vs_oit_blit", "fs_oit_wb_separate_blit" ); + bgfx::ProgramHandle wbPass = loadProgram("vs_oit", "fs_oit_wb" ); + bgfx::ProgramHandle wbBlit = loadProgram("vs_oit_blit", "fs_oit_wb_blit" ); + + bgfx::TextureHandle fbtextures[] = + { + bgfx::createTexture2D(width, height, 1, bgfx::TextureFormat::RGBA16F, BGFX_TEXTURE_RT), + bgfx::createTexture2D(width, height, 1, bgfx::TextureFormat::R16F, BGFX_TEXTURE_RT), + bgfx::createTexture2D(width, height, 1, bgfx::TextureFormat::D16, BGFX_TEXTURE_RT_BUFFER_ONLY), + }; + bgfx::FrameBufferHandle fbh = bgfx::createFrameBuffer(BX_COUNTOF(fbtextures), fbtextures, true); + + int64_t timeOffset = bx::getHPCounter(); + + uint32_t mode = 1; + int32_t scrollArea = 0; + bool frontToBack = true; + bool fadeInOut = false; + + entry::MouseState mouseState; + while (!entry::processEvents(width, height, debug, reset, &mouseState) ) + { + imguiBeginFrame(mouseState.m_mx + , mouseState.m_my + , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) + | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) + , 0 + , width + , height + ); + + imguiBeginScrollArea("Settings", width - width / 4 - 10, 10, width / 4, height / 3, &scrollArea); + imguiSeparatorLine(); + + imguiLabel("Blend mode:"); + + mode = imguiChoose(mode + , "None" + , "Separate" + , "MRT Independent" + ); + + imguiSeparatorLine(); + + if (imguiCheck("Front to back", frontToBack) ) + { + frontToBack ^= true; + } + + if (imguiCheck("Fade in/out", fadeInOut) ) + { + fadeInOut ^= true; + } + + imguiEndScrollArea(); + imguiEndFrame(); + + // Set view 0 default viewport. + bgfx::setViewRectMask(0x3, 0, 0, width, height); + + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + const double toMs = 1000.0/freq; + + float time = (float)( (now-timeOffset)/freq); + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + // Reference: + // Weighted, Blended Order-Independent Transparency + // http://jcgt.org/published/0002/02/09/ + // http://casual-effects.blogspot.com/2014/03/weighted-blended-order-independent.html + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/19-oit"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Weighted, Blended Order Independent Transparency."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); + + float at[3] = { 0.0f, 0.0f, 0.0f }; + float eye[3] = { 0.0f, 0.0f, -7.0f }; + + float view[16]; + float proj[16]; + + // Set view and projection matrix for view 0. + mtxLookAt(view, eye, at); + mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f); + + bgfx::setViewTransform(0, view, proj); + + bgfx::setViewClearMask(0x3 + , BGFX_CLEAR_COLOR_BIT|BGFX_CLEAR_DEPTH_BIT + , 0x00000000 + , 1.0f + , 0 + ); + + bgfx::FrameBufferHandle invalid = BGFX_INVALID_HANDLE; + bgfx::setViewFrameBuffer(0, 0 == mode ? invalid : fbh); + + // Set view and projection matrix for view 1. + mtxIdentity(view); + mtxOrtho(proj, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); + bgfx::setViewTransform(1, view, proj); + + for (uint32_t depth = 0; depth < 3; ++depth) + { + uint32_t zz = frontToBack ? 2-depth : depth; + + for (uint32_t yy = 0; yy < 3; ++yy) + { + for (uint32_t xx = 0; xx < 3; ++xx) + { + float color[4] = { xx*1.0f/3.0f, zz*1.0f/3.0f, yy*1.0f/3.0f, 0.5f }; + + if (fadeInOut + && zz == 1) + { + color[3] = sinf(time*3.0f)*0.49f+0.5f; + } + + bgfx::setUniform(u_color, color); + + BX_UNUSED(time); + float mtx[16]; + mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f); + //mtxIdentity(mtx); + mtx[12] = -2.5f + float(xx)*2.5f; + mtx[13] = -2.5f + float(yy)*2.5f; + mtx[14] = -2.5f + float(zz)*2.5f; //0.0f; // sinf(time + ( (xx+1)*(yy+1)/9.0f)*float(M_PI) )*50.0f+50.0f; //90.0f - (xx+1)*(yy+1)*10.0f; + + // Set transform for draw call. + bgfx::setTransform(mtx); + + // Set vertex and index buffer. + bgfx::setVertexBuffer(vbh); + bgfx::setIndexBuffer(ibh); + + const uint64_t state = 0 + | BGFX_STATE_CULL_CW + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_MSAA + ; + + switch (mode) + { + case 0: + // Set vertex and fragment shaders. + bgfx::setProgram(blend); + + // Set render states. + bgfx::setState(state + | BGFX_STATE_BLEND_ALPHA + ); + break; + + case 1: + // Set vertex and fragment shaders. + bgfx::setProgram(wbSeparatePass); + + // Set render states. + bgfx::setState(state + | BGFX_STATE_BLEND_FUNC_SEPARATE(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ZERO, BGFX_STATE_BLEND_INV_SRC_ALPHA) + ); + break; + + default: + // Set vertex and fragment shaders. + bgfx::setProgram(wbPass); + + // Set render states. + bgfx::setState(state + | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_ONE) + | BGFX_STATE_BLEND_INDEPENDENT + , 0 + | BGFX_STATE_BLEND_FUNC_RT_1(BGFX_STATE_BLEND_ZERO, BGFX_STATE_BLEND_SRC_COLOR) + ); + break; + } + + // Submit primitive for rendering to view 0. + bgfx::submit(0); + } + } + } + + if (0 != mode) + { + bgfx::setTexture(0, u_texColor0, fbtextures[0]); + bgfx::setTexture(1, u_texColor1, fbtextures[1]); + bgfx::setProgram(1 == mode ? wbSeparateBlit : wbBlit); + bgfx::setState(0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_INV_SRC_ALPHA, BGFX_STATE_BLEND_SRC_ALPHA) + ); + screenSpaceQuad( (float)width, (float)height, s_flipV); + bgfx::submit(1); + } + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + } + + // Cleanup. + bgfx::destroyFrameBuffer(fbh); + bgfx::destroyIndexBuffer(ibh); + bgfx::destroyVertexBuffer(vbh); + bgfx::destroyProgram(blend); + bgfx::destroyProgram(wbSeparatePass); + bgfx::destroyProgram(wbSeparateBlit); + bgfx::destroyProgram(wbPass); + bgfx::destroyProgram(wbBlit); + bgfx::destroyUniform(u_texColor0); + bgfx::destroyUniform(u_texColor1); + bgfx::destroyUniform(u_color); + + // Shutdown bgfx. + bgfx::shutdown(); + + return 0; +} diff --git a/examples/19-oit/screenshot.png b/examples/19-oit/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..69cc25fa2269f76df02c8a5353b5954e570f0d67 GIT binary patch literal 59309 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

U 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


Gg+|W`4Ap_UCj-MW-jY#X%@Db+qj4< zRZXx@WqOy#1c=$?5etB0AKtj{P9xdfW3V;!L?l;Bsp6T>4|BLnC}S^x?oXT`h zGJu}E@V4vnxVX7;&MoU9LD5HnsjE$y3P7bqS;4uM1KBA#<9-~cgs_Qbh@-?;*whQs0Wa`Tisjn)B*ZkHeCfL&;eR!R|Rb6-&D8 z+A*r;W$XzR!HiEOz?jV3WA}CHu{__mfv%U-s3X$!Uk%n^up~<5@beRGlUgqq{|w)9 zod}(oCquQll6t;yDSRF3@oaa#V2-5dbu|yo4`Z6q32ey9&n~LxkD`hbr=T?(8h(_E zm}~uBRE=*;{#_NoVXf3;H5rk&qxS`TOI(tlm&>}Jkm*!2qZQnx6u|WS_F!l2u@ex= WF8QG`wm1p|{2tsjyi=uxi1>dVS%Z22 literal 0 HcmV?d00001 diff --git a/examples/19-oit/varying.def.sc b/examples/19-oit/varying.def.sc new file mode 100644 index 00000000..476147e7 --- /dev/null +++ b/examples/19-oit/varying.def.sc @@ -0,0 +1,5 @@ +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_pos : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); + +vec3 a_position : POSITION; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/examples/19-oit/vs_oit.sc b/examples/19-oit/vs_oit.sc new file mode 100644 index 00000000..fd454d57 --- /dev/null +++ b/examples/19-oit/vs_oit.sc @@ -0,0 +1,18 @@ +$input a_position +$output v_pos + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + vec3 wpos = mul(u_model[0], vec4(a_position, 1.0) ).xyz; + gl_Position = mul(u_viewProj, vec4(wpos, 1.0) ); + v_pos = gl_Position; + vec4 temp = mul(u_view, vec4(wpos, 1.0) ); + v_pos.x = temp.z; +} diff --git a/examples/19-oit/vs_oit_blit.sc b/examples/19-oit/vs_oit_blit.sc new file mode 100644 index 00000000..4d9b67df --- /dev/null +++ b/examples/19-oit/vs_oit_blit.sc @@ -0,0 +1,15 @@ +$input a_position, a_texcoord0 +$output v_texcoord0 + +/* + * Copyright 2011-2014 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_texcoord0 = a_texcoord0; +} diff --git a/examples/common/imgui/imgui.cpp b/examples/common/imgui/imgui.cpp index 1b921a25..491d0619 100644 --- a/examples/common/imgui/imgui.cpp +++ b/examples/common/imgui/imgui.cpp @@ -66,6 +66,9 @@ static void imguiFree(void* _ptr, void* /*_userptr*/) #define STB_TRUETYPE_IMPLEMENTATION #include +namespace +{ + struct PosColorVertex { float m_x; @@ -107,6 +110,8 @@ struct PosColorUvVertex bgfx::VertexDecl PosColorUvVertex::ms_decl; +} // namespace + struct Imgui { Imgui() diff --git a/examples/runtime/shaders/dx11/fs_oit.bin b/examples/runtime/shaders/dx11/fs_oit.bin new file mode 100644 index 0000000000000000000000000000000000000000..84a88100e2f2e878b4373c551729eaaec557cd0d GIT binary patch literal 1044 zcma)4O-mb56uo2OM-Z$VcP`$-g@Od4wlq{qG?On#oiH;<3WX$%BS{$=LbnzC0seq)3f&a4=%TpmYI?4|*Mu~M9ys&vJ@>r(KIWyZtafW3yrK>Q zgc{vNhIdL;&-EG;bQ9629ny=-$seOZs`b5o9OTEoZk-=pYw)&1M1vR?z}5iKPjCvF z3z~W={SG<%vLKI>Accc~&WNT_TjabC*vpv8xZeAUyG_3Dvv(9MgLe^pBx=$;F7u|$ z4>7XVtDiy_&=Vk|CH)^UmXRkwhSEPlzhYs8KSZCU|DJVdiAS~L{{sD6AH5A-VBfv| zU(m~a^uYo2haQ&w$B{Dx#vAB-E|%1JcS^f;XU}x1P4YDg;l9;OqNkee>^rWE$q&I3 z{>xKncpqTd@YZ1c;}KYgAq%Tms5|bS#5K-~av>F0+|63Wbk@;@_l84D$frhc>eYs~ z?X5S(v^gWPc`GlhT4l{?h@`i%S$7e{qjT|S{P|pTJ{F7do5)$2l>++kJ@D^&DSL8v zJi$ji!&e8@ZLrRD)~(f2!LV|6&R8KkRZJR&sdHZgeP^YQ`wCE@yD#S3OJ*izW0IBC z%>+zL{x@&2WcoxPBDw?}Z0SL8h3Ey*kcyS(0{Uxg&9ay5CSpF5Lg%)gl-^wV{x$x$ F|2K`wkM#fm literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_oit_wb.bin b/examples/runtime/shaders/dx11/fs_oit_wb.bin new file mode 100644 index 0000000000000000000000000000000000000000..d1019948e442c1a5af3121e60882f1ef393916c1 GIT binary patch literal 1452 zcmb7EO=uHA6n<%vrirBuf*|5yQNijVkkr34K~nP%wF$dRX;DbhbW0*zHl(R~GZxRb z-U50MycFW0;#DCOJSg7v=+UDHih7CPOJXB|-Lz zc}>h8ATl6)mVoL_l83Y6Hkq< zmy1ox3y^LE|^Lgy`bI1$F{{>S*6{*(O%*T<~p literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_oit_wb_blit.bin b/examples/runtime/shaders/dx11/fs_oit_wb_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..17d7260b1898f53dea5a0dd4a72d7c8c5f3ae785 GIT binary patch literal 922 zcmZ`%J4nM&6n(XdA5aSlI*4RckYeixD^fp6(-zc}yeLHwtr}6Zq{a#zM8w6}-Nm_s zZZ6{B=;q+y?x3rKYdtr4PfLmy4(Go6Irrw}={ys129q<)x0+z0)3BCbP(R-uvqxvM z&+C`x50!(Po{*PetOYy{tY{gY!kHQj}rE9U7HZ{JKdZDy4Z*8Ldm zTN^`#TK>_EV#Rgb`U%?hE2R0f!nGvbn~B{06?z+=thHi~^j8YFnvV!Sx&YrAA^HK2 zdx$=Hi3}~3Uc{VvSvbd2aPqd>^pt3dxjY|Y%w;>1aonY{vrf%sletIXC3wq^hp?(3 z2gST0<_{4W8^oUgSAi$sY+Hi=8nJ|V0?sD!cfemTFvbs}_k#bKabSrKy3hX#{M!)x zJ8%_s5AuHlFAc$cBhUwqR(33iIh%^O4V>SLA^E-=#alJ|wqaKq)KtiWe#@0a-JE6L zu^lm{rUxAFUz~j1y$Q;yy9{cNqhcR6kyyY+{p0>coa1>xY$V5JXRTT`>=meRZFp&6 z;;Pa0TBYu;yDJTK$~dQH=gc|Ptd^JUx|(!X*J=(1(NH8Bie8L_ro-Vd--(==na@Lq z`@qLDBQ#kZ*RW#&JTxRape~>Ty1bu! zlb$Xx=vuQzCS^g)%xVVT#RTv&{02%%KUOg!dJbO-l4mCv?C98#-&MOeR*qS}ic&aE z5RD!eH~PF-b45hd(#wqtj*=i6|MD`%xzhrZIT`zNCk02w2$5gzC;2kR+HXFdz1&|D zW1Bla$7(Jmy+vV{_o_`ryS*qOY*X2RUD4BezYMii9^V}uCBg^TWm z(v|-pi-?=-{Rb}k14_H-rW^YM((laNONRt|;NzTozVCeZF;fw>n3pcDQy4>;IekhP z&RhNK@7vE`j{0e5uK45p&-XzrV2GX|F98l3H^5IO5=53!t}JjZBZ<7gb#geQE23X0 zuK`HMg2xzrV3b!J=Q|({@EO>Dh(HQvpCNw(MtL>Q{8_8xc6IOA^Rr_6qdIbQFiD3MR4f-}1C zc+f)a0X_wP3wTdGP}r+TUF9Ow^M34u|7l`IYNln5m5AmC_p6JKaMaYR%9}l+-dK{l z%X7^8n%qAg?)Oygv4UUeQgUnPu}=}tE$j`ugL(qsJ8*DTZ^>)cJ{D>w%KuLv)zM$h C*L4&C literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_oit.bin b/examples/runtime/shaders/dx11/vs_oit.bin new file mode 100644 index 0000000000000000000000000000000000000000..4c5861cdd1545b97e42f43c61af7d4f7743d63d1 GIT binary patch literal 1526 zcmb7EO>0w85S=vN(biIMQ(RoM3oQ~%{J_v6u}RYeY7_Dvp@NXa_SHmQNJ&%8LNK^< zBZ>C=xDlYs1{sK|KrJI7_%6jI#xoM06ap?5jIdkURx%Un!8ClO;^Woef z{b63(4+pl(_v+UDFe&m;#0?6q=G`z=00g(ojpn*#ht&>sY0sZtT}XX1$A6reODsHZ zyn6BO(}NElXzuxm@JE;6oiW64pO@$Yz+!qaGmn^gSvY@B!O8dQke(5RkelatgfW+G zX31{euG(AF>-Cr$fmh)BVf+&-2zgTCTN2y&GB%8NfGglhI9i~t@SoyaL7apS;xB>k z0HctLzZU)*#(^a{2h%$5fqx!>e*~`3chX@W@xK7CjKIIMK5(D#ePV>wW;SJ zFM0Y5oinYDWebmbUT}PWarmu4abEd|qnsUB$4QhhA%p9|BF=HVDjVr_)!wXCi`E8| zxHoAU(T)0AtGU(OXsffub1J)REGwf{UAI~))og6mZ7dSecp{p(9FJa%#bW&CIb&(% zJZf15S4s-54P)k5Fi2F$8#yzVU*VcOY6{5k8*x`VMuTv9EHE zCDGx&PfHKe@}2D}DDVWjeNPSHeE*T58t!|T$MZ2OJk19bno{mrHKzCD-@T_35GU=81yYdn(as z*lW>7Ibv^*s(f26-Gw|jZ{43W7j-!m_2V$1(#(mt5&1U(|%kJ_@1#|fv`S|CcQt-@T znV2A2kRUAMylM(g)ppBX*XPJbWv6l?Pn&*hzT4P+< z$hA!87w847eiQaKuCBDB#|55aY@nsyRPq|xH{kP{>);*g3C^+4ImGOD&?Z~#TRRjl zxppDp%GytnH}ExNUgA5z&xrL(=aV_(c)Q@ez9?!69w1HjBx=ltA)%p4%YQqRaz&(hRL&)Cq=5Tu`pfrGz+f#J!5|Nnso0RV}} BCcyvz literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_oit_wb.bin b/examples/runtime/shaders/dx9/fs_oit_wb.bin new file mode 100644 index 0000000000000000000000000000000000000000..b34f4bac6afd24f24313c6286955c600a0f2e3bc GIT binary patch literal 459 zcmY*W%}T>S7@SQLEmi2rn_$F)dI|kOG_)5jN)8p#H0L5!u~11#_1yId>?16AD;|6S zFM`j|7w9W^b)8L8iwi@(neWTYx5-%;h>y;=A+Y+??ZtyQ*${xhyFfwfAH9uM=lEn3 zzy)D6wqZD)fq;(+VG%|@BFxFHs1*o1?HPSI>ejmzocDW4Jc{og-My=QH)w}#H@v^T zxlP^M^WaHHMFU}TM za$rkfeX^3SCs^x=!y9l@)*z<;IQLgs-^%-tOCC{+qzzu?@BK&$L~7~3n9uwLrfQ9O xBA*w~s+8w5OY)nk%s-pwektdlV3txpRWOlxw9m)n8yHQS<-+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin b/examples/runtime/shaders/dx9/fs_oit_wb_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdb73ac40c8822fb6d5684da757d1de19e70d196 GIT binary patch literal 393 zcmZWk!AiqG5Ph3y4JhR3MKnjfgr-F_AcBoZ4;89W@D@cY79v~H3Lbih_yhffy$Ryo zFA&fEL%zfHO{-9F;qAH3nptyR^v@d%vu0MuasRr|Lw!36Hcz*L zb|>uw>D|>$uLu%-Kj`O7;;<2i@pdC@Mp1+lU=i@m>igF&y2Sg53=x_0~myYK@B+!cSp zjo>%*2l@+c9nU1G#eu`zbMBpU@14^y5FgzqUtsw$?j?gHT^E4Bt3XNXAH9Wk_vm;7 zz&T+wreQdqfq++)un40c66O?E)JlY%<%~WY#f`X%vwkm4M#=4iyL-9k2A#0uhId!j zH>ulB?uY#WgQiz+dd>a1*QnKMxB$um73ECd{P(Y&gO|_mmNVUM8Qr1|>7N+?`Pt-1 zW!Mr}8!u(!3C4O{<_4UUF^I`O&iPfIw~9REf=ARMX@krBy^o|oq!#}3`rKb&qE^{Y k6!ijHIYoc=lKeB3`&Wv7I_E2fYhtEYXNio@q}Bj_0kZQ<>i_@% literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin b/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..8f89a8f0b36128f919bca9ae5c47822f9b2cbc70 GIT binary patch literal 393 zcmZWk!AiqG5Ph3yT~Nr;i)fB|2~CS=Km?m2JyfVh!CMrqScq&%D|qk_@dxq=dlQOx zzd$_u5BUz)w<(I?!Z7pRn|ZTynDm5N-`@is1zcmkOn~_GptAb?S z83GOl%=TR{TrvU;WR~E&Pp89&SY;}2VgW0)D(2E3E&QjACuuuv;%Ic0tBJaq`kN

FJ+Zu%htgD~a`>73g5)PtHw_gZ6ILJ@JX|MZQP+(KcnyXRt zTu=_duY$cwSLrb>T4(2b0KS>RY%bE{1Nh={%d{Yhz#UU!$h4Tk-k1`fOp9cjtqsBE zBa=WrWMpoz*l>C@@$VATaaawHaM^npMdRr4B{;Y~4C;+$BWOO|cePeHOJ+ zrBMor9wl{AG?O1zcS~G6&i-dgkkD&-9o9iQcfHVX0|1GYr59)v}IUqnCK{|rOa(|(V;KS+B!#F(UIQC{7`%2 f$JhDHk71b~*_UXSocBoNQ#aupmcp*7(-goTEO~8+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_oit_blit.bin b/examples/runtime/shaders/dx9/vs_oit_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..ab2fc818dd15bfeb8077236a4718295ef10289da GIT binary patch literal 319 zcmWFw_F&AHv$J7j;4h8O%}+_q3Cm0^4=Bpd;$&oCU}2D9WMKaH|KERQ2Imk*Cm99? zhHxMTi2lV4=bRhFNbqL7=InWvzk$yLpzppc#u U?^cwU?hKMvutg}W<>F!h0L(TRMgRZ+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_oit_wb.bin b/examples/runtime/shaders/gles/fs_oit_wb.bin new file mode 100644 index 0000000000000000000000000000000000000000..02b8c819d18343049b01376d10b9600df7208643 GIT binary patch literal 335 zcmZXP%?^Sv5QO#GrsMMbrpUii23;2_GX?EtDX?Ew! zMfbUS1eGc;NgkuxMPpQ9p$`E&<;h-`S>v6;NT<3CSf!IKGL_`ug54MzT*J@{NVlVF zFh$#P%`Z4#u7voTS=sw0g^k8(I4@N^Q%ALy8=G!_rR1k*NJOd13UI0bT)NW75Zv1h zq@19SLL2Y~60Xm3uasyeBkCIIk)*0{Frimi*8v%x17Fre{4M3#r9PJ$LkHd&>%0KX C1z(~7 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_oit_wb_blit.bin b/examples/runtime/shaders/gles/fs_oit_wb_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..874d83068cf88627019db50b575b48a9e3869b62 GIT binary patch literal 363 zcmaiw%L>9U5Jh#HkC0imP-+@9(rZoaNo&yTpP`;IX88OF*g~ND7Gw%(V?n}rNPT{=v t0nm_A8U?V%18aXWf5}+b|4M`kXH9-MSbCw-#PDL;jTJs8#9((qW)FS^c258R literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_oit_wb_separate.bin b/examples/runtime/shaders/gles/fs_oit_wb_separate.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c7cf6c1901572dafe690aa7175f6c431682b02d GIT binary patch literal 282 zcmZWk%L;-(6s_%i#aYgj*_gSKb|LL+7a@bG29R&AS7a*5!3BFVAWF5WP-O+}@GX~^ z5n~7b%b6_}2vU_5;9Q#0#v0@VxD~FXbg)FBThe%6ZazpKP%8*-BxQsFho+z$K_V;z lw(J$r)yApsl`7t=N}c6pQcl(5Nq9(sx}fi&III5L%H_Jml2;BaoY7)G;^Mi;l6}e;TG8a t#qd8FwDW*b#u)b3cwp@g;L(!P)}|eopsl5+DhiEAhrfA?80=2S>;d!-c258R literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_oit.bin b/examples/runtime/shaders/gles/vs_oit.bin new file mode 100644 index 0000000000000000000000000000000000000000..6d48059a96fa90dc52898753ebf34c1eeff35bff GIT binary patch literal 549 zcmZvZv2KGf5Qdx8PjO@DU$}xwK)5ZNefR(O z{XV~Lo)_OQUrB0Ajc<*~pv~R|q^i;5hNgT*spdWVr^x8@i%J(i!_fi9=QnC6TFC8S8`@QJ<%!1UjFz8c$>tC}C4*xuQze z1_(#V_k&+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_oit.bin b/examples/runtime/shaders/glsl/fs_oit.bin new file mode 100644 index 0000000000000000000000000000000000000000..82db5941daac7948d621856b930e7aabf7a6e8c7 GIT binary patch literal 75 zcmZ<@_F&u_Qg2lV4=bRhFNbqL7=InWvzk$yLpzppc#u U?^cwU?hKMvutg}W<>F!h0L(TRMgRZ+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_oit_wb.bin b/examples/runtime/shaders/glsl/fs_oit_wb.bin new file mode 100644 index 0000000000000000000000000000000000000000..02b8c819d18343049b01376d10b9600df7208643 GIT binary patch literal 335 zcmZXP%?^Sv5QO#GrsMMbrpUii23;2_GX?EtDX?Ew! zMfbUS1eGc;NgkuxMPpQ9p$`E&<;h-`S>v6;NT<3CSf!IKGL_`ug54MzT*J@{NVlVF zFh$#P%`Z4#u7voTS=sw0g^k8(I4@N^Q%ALy8=G!_rR1k*NJOd13UI0bT)NW75Zv1h zq@19SLL2Y~60Xm3uasyeBkCIIk)*0{Frimi*8v%x17Fre{4M3#r9PJ$LkHd&>%0KX C1z(~7 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_oit_wb_blit.bin b/examples/runtime/shaders/glsl/fs_oit_wb_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec269441b214720a3b4ee588cfb96e2adfa3d6fe GIT binary patch literal 353 zcmaiw%?^Sv5QO#GhcJ7j3Bl6n3H72O-hBYlU?n7lk_rVhzPnreNiW7zx1G#4(@jsu zxnArxR+zD@3$QZhV6#>Zxz^^)64KS>MVkt)qH2^h`~aPk_gZQ5M~)L>b$NzLlr;pD z+zGgV6|_}@ff?%XonZ@zZ95||BJeUozYld5pTRu_kB0GvoZ!Qs?n}rOcK2TU5Lm<* pi$hrBfis=BZyS&LUuDqYEr&*fOD|NG8c|FeamLr@u-Jo;*%NMna*F@} literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin b/examples/runtime/shaders/glsl/fs_oit_wb_separate.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c7cf6c1901572dafe690aa7175f6c431682b02d GIT binary patch literal 282 zcmZWk%L;-(6s_%i#aYgj*_gSKb|LL+7a@bG29R&AS7a*5!3BFVAWF5WP-O+}@GX~^ z5n~7b%b6_}2vU_5;9Q#0#v0@VxD~FXbg)FBThe%6ZazpKP%8*-BxQsFho+z$K_V;z lw(J$r)yApsl`7t=N}c6pQcl(5Nq5?%Fj@WyaLZB zcLG+hf~Krdm|za?8Mc7frqvP^p5qAIKE8e8GPuLwv>$HB@m~D#zJ#>E?zsJh55MuW o4}ej|81C12;Ovji3CU?^i%$J%XYE;$#9CzIk97xV5Qf!HaU)@{NbF2e_l`)dSP-%Tq{tPCQR)N&s`_NS8+T5kxRA}h`~LiS z_3=KvfBq$@wWZ!xHiJ6b2}sq+{AjC9k+3=~8(kb|A)%&4!m2`lnKFkwwGt{->+C!_ zT$bkhWs#eGc3g{SgW5*#QA8Io3)qc8Yhv>gnyN6tL4W3Fc!Q8H{>?7U6{mh!ryzP( zdWVr^x8@i%J(i!_fi9=QnC6TFC8S8`@QJ<%!1UjFz8c$>tC}C4*xuQze z1_(#V_k&+ literal 0 HcmV?d00001 diff --git a/premake/premake4.lua b/premake/premake4.lua index 22148e42..bd22e770 100644 --- a/premake/premake4.lua +++ b/premake/premake4.lua @@ -170,6 +170,7 @@ exampleProject("15-shadowmaps-simple", "a10f22ab-e0ee-471a-b2b6-2f6cb1c63fdc") exampleProject("16-shadowmaps", "f9a91cb0-7b1b-11e3-981f-0800200c9a66") exampleProject("17-drawstress", "9aeea4c6-80dc-11e3-b3ca-4da6db0f677b") exampleProject("18-ibl", "711bcbb0-9531-11e3-a5e2-0800200c9a66") +exampleProject("19-oit", "d7eca4fc-96d7-11e3-a73b-fcafdb0f677b") dofile "makedisttex.lua" dofile "shaderc.lua"