Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - hak/AndroidPhysicallyBasedRendering: Physically based renderer demo in Android · GitHub
Skip to content

Repository files navigation

AndroidPhysicallyBasedRendering

Physically Based Rendering is a new rendering method which most of console/desktop game developers (and the movie industry as well) are moving on. Instead of a traditional material based rendering pipeline (e.g. base, specular power & normal map etc), PBR pipeline has physically correct (or nearly correct) lighting model and artists tweak physically model parameters in a consistent way. (usually Albedo, Specular, Roughness & Normal).

In Mobile gaming space, PBR is not popular yet due to limited HW performance/features, however high-end devices such as TegraK1, Adreno330 are capable of PBR in terms of feature set (, still not fully ready in performance though). As they are getting more popular, Mobile games will also adopt PBR in near future.

##PBR in a nutshell

  • Energy conserving Input light energy >= Output energy. In pictures below, note that a specular intensity increases as a specular power increase

alt text

alt text

  • Fresnel for everything (including non-conductor)

alt text

  • Metalic material == Specular only Pictures below: They are all specular but with different 'roughness' value

alt text

alt text

##Demo

  • Demo uses 1 irradiance environment map (fetched both diffuse,specular), 1 direction light.
  • Lambart diffuse, Phong specular + Schlick fresnel
  • All images above are rendered in single PBR shader.
  • Requires OpenGL ES3.0 (details below)

##Implementation details

  • Requires OpenGLES3.0 Most of existing PBR implementations require CubeMapLod (EXT_shader_texture_lod), but many of Android devices don't support the feature unfortunately. In OpenGLES3.0, cubemap LOD is required by spec, so basically in Android, PBR requires OpenGLES3.0. Good news is that these devices are quite likely high-end device that are capable of PBR in performance-wise so that they are overlapping.

  • Linear space lighting and sRGB conversion In PBR (or even in modern-traditional rendering pipeline as well), rendering pipeline performs lighting in linear space and performs sRGB conversion when read (from image textures) and write (to RT). In Android, sRGB render target (KHR_gl_colorspace) is not supported in most devices, so linear space lighting does not work in straightforward manner. Possible workaround would be,

    • Need to convert in shader,
    • Render to sRGB FBO and copy In demo, manual conversion significantly dropped performance, so it's not doing conversion at all.
  • Performance PBR shader I wrote takes 74 instructions in VS, and 125 insts in FS (with 2 tex fetch). They run in a decent performance in N5 @~230 FPS with 1080p,

##Cubemap images

About

Physically based renderer demo in Android

Resources

Stars

43 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages