@@ -18,7 +18,8 @@ UberShader::UberShader(RenderPass* renderPass) {
1818# elif defined(NANOGUI_USE_GLES)
1919 std::string preamble =
2020 R"( #version 100
21- precision highp float;)" ;
21+ precision highp float;
22+ precision highp sampler2D;)" ;
2223# endif
2324 auto vertexShader = preamble +
2425 R"glsl(
@@ -51,6 +52,7 @@ UberShader::UberShader(RenderPass* renderPass) {
5152 #define GAMMA 1
5253 #define FALSE_COLOR 2
5354 #define POS_NEG 3
55+ #define HASH 4
5456
5557 #define ERROR 0
5658 #define ABSOLUTE_ERROR 1
@@ -117,6 +119,13 @@ UberShader::UberShader(RenderPass* renderPass) {
117119 }
118120 }
119121
122+ vec3 hash(vec3 co){
123+ co *= mix(vec3(1.0), vec3(1.0 / 1024.0), step(1024.0, abs(co)));
124+ co *= mix(vec3(1.0), vec3(1.0 / 1024.0), step(1024.0, abs(co)));
125+ co *= mix(vec3(1.0), vec3(1.0 / 1024.0), step(1024.0, abs(co)));
126+ return 2.0 * abs(fract(abs(fract(dot(co, vec3(115.191742, 64.0546951, 124.512291))) - 0.5) * vec3(1368.46143, 1523.2019, 1034.50476)) - 0.5);
127+ }
128+
120129 vec3 applyTonemap(vec3 col, vec4 background) {
121130 if (tonemap == SRGB) {
122131 col = col +
@@ -129,6 +138,8 @@ UberShader::UberShader(RenderPass* renderPass) {
129138 return falseColor(log2(average(col)+0.03125) / 10.0 + 0.5) + (background.rgb - falseColor(0.0)) * background.a;
130139 } else if (tonemap == POS_NEG) {
131140 return vec3(-average(min(col, vec3(0.0))) * 2.0, average(max(col, vec3(0.0))) * 2.0, 0.0) + background.rgb * background.a;
141+ } else if (tonemap == HASH) {
142+ return hash(col) + (background.rgb - hash(vec3(offset))) * background.a;
132143 }
133144 return vec3(0.0);
134145 }
@@ -230,6 +241,7 @@ UberShader::UberShader(RenderPass* renderPass) {
230241 #define GAMMA 1
231242 #define FALSE_COLOR 2
232243 #define POS_NEG 3
244+ #define HASH 4
233245
234246 #define ERROR 0
235247 #define ABSOLUTE_ERROR 1
@@ -272,6 +284,13 @@ UberShader::UberShader(RenderPass* renderPass) {
272284 }
273285 }
274286
287+ float3 hash(float3 co){
288+ co *= mix(float3(1.0f), float3(1.0f / 1024.0f), step(1024.0f, abs(co)));
289+ co *= mix(float3(1.0f), float3(1.0f / 1024.0f), step(1024.0f, abs(co)));
290+ co *= mix(float3(1.0f), float3(1.0f / 1024.0f), step(1024.0f, abs(co)));
291+ return 2.0f * abs(fract(abs(fract(dot(co.xyz, float3(115.191742f, 64.0546951f, 124.512291f))) - 0.5f) * float3(1368.46143f, 1523.2019f, 1034.50476f)) - 0.5f);
292+ }
293+
275294 float3 applyTonemap(float3 col, float4 background, int tonemap, float offset, float gamma, texture2d<float, access::sample> colormap, sampler colormapSampler) {
276295 switch (tonemap) {
277296 case SRGB:
@@ -286,6 +305,8 @@ UberShader::UberShader(RenderPass* renderPass) {
286305 return falseColor(log2(average(col)+0.03125f) / 10.0f + 0.5f, colormap, colormapSampler) + (background.rgb - falseColor(0.0f, colormap, colormapSampler)) * background.a;
287306 case POS_NEG:
288307 return float3(-average(min(col, float3(0.0f))) * 2.0f, average(max(col, float3(0.0f))) * 2.0f, 0.0f) + background.rgb * background.a;
308+ case HASH:
309+ return hash(col) + (background.rgb - hash(float3(offset))) * background.a;
289310 }
290311 return float3(0.0f);
291312 }
0 commit comments