Skip to content

Commit

Permalink
Gloom: Fetching material texture colors in shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Sep 1, 2019
1 parent 3f63f23 commit 4cf4d67
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 27 deletions.
8 changes: 4 additions & 4 deletions doomsday/tests/test_gloom/gloom/render/context.h
Expand Up @@ -47,10 +47,10 @@ struct Context {

de::GLUniform uCurrentTime {"uCurrentTime", de::GLUniform::Float};

de::GLUniform uDiffuseAtlas {"uDiffuseAtlas", de::GLUniform::Sampler2D};
de::GLUniform uEmissiveAtlas {"uEmissiveAtlas", de::GLUniform::Sampler2D};
de::GLUniform uSpecGlossAtlas {"uSpecGlossAtlas", de::GLUniform::Sampler2D};
de::GLUniform uNormalDisplAtlas {"uNormalDisplAtlas", de::GLUniform::Sampler2D};
de::GLUniform uDiffuseAtlas {"uTextureAtlas[0]", de::GLUniform::Sampler2D};
de::GLUniform uSpecGlossAtlas {"uTextureAtlas[1]", de::GLUniform::Sampler2D};
de::GLUniform uEmissiveAtlas {"uTextureAtlas[2]", de::GLUniform::Sampler2D};
de::GLUniform uNormalDisplAtlas {"uTextureAtlas[3]", de::GLUniform::Sampler2D};

de::GLUniform uLightMatrix {"uLightMatrix", de::GLUniform::Mat4};
de::GLUniform uLightOrigin {"uLightOrigin", de::GLUniform::Vec3};
Expand Down
@@ -0,0 +1,36 @@
#ifndef GLOOM_MATERIAL_H
#define GLOOM_MATERIAL_H

#include "defs.glsl"
#include "miplevel.glsl"

uniform sampler2D uTextureAtlas[4];
uniform sampler2D uTextureMetrics;

struct Metrics {
vec4 uvRect;
vec2 sizeInTexels;
float texelsPerMeter;
vec2 scale;
};

Metrics Gloom_TextureMetrics(uint matIndex, int texture) {
Metrics metrics;
int x = texture * 2;
metrics.uvRect = texelFetch(uTextureMetrics, ivec2(x, matIndex), 0);
vec3 texelSize = texelFetch(uTextureMetrics, ivec2(x + 1, matIndex), 0).xyz;
metrics.sizeInTexels = texelSize.xy;
metrics.texelsPerMeter = texelSize.z;
metrics.scale = vec2(metrics.texelsPerMeter) / metrics.sizeInTexels;
return metrics;
}

vec4 Gloom_FetchTexture(uint matIndex, int texture, vec2 uv) {
Metrics metrics = Gloom_TextureMetrics(matIndex, texture);
vec2 normUV = uv * metrics.scale;
vec2 atlasUV = metrics.uvRect.xy + fract(normUV) * metrics.uvRect.zw;
return textureLod(uTextureAtlas[texture], atlasUV,
mipLevel(normUV, metrics.sizeInTexels.xy) - 0.5);
}

#endif // GLOOM_MATERIAL_H
@@ -1,15 +1,14 @@
#version 330 core

#include "common/gbuffer_out.glsl"

uniform sampler2D uDiffuseAtlas;
#include "common/material.glsl"

DENG_VAR vec2 vUV;
DENG_VAR vec4 vInstanceColor;
DENG_VAR vec3 vNormal;

void main(void) {
vec4 color = texture(uDiffuseAtlas, vUV);
vec4 color = texture(uTextureAtlas[Texture_Diffuse], vUV);
if (color.a < 0.5) discard;
out_FragColor = color * vInstanceColor;
GBuffer_SetFragNormal(vNormal);
Expand Down
@@ -1,10 +1,10 @@
#version 330 core

uniform sampler2D uDiffuseAtlas;
#include "common/material.glsl"

DENG_VAR vec2 vUV;

void main(void) {
float alpha = texture(uDiffuseAtlas, vUV).a;
float alpha = texture(uTextureAtlas[Texture_Diffuse], vUV).a;
if (alpha < 0.75) discard;
}
@@ -1,6 +1,6 @@
#version 330 core

uniform sampler2D uDiffuseAtlas;
#include "common/material.glsl"

uniform vec3 uLightOrigin; // world space
uniform float uFarPlane;
Expand All @@ -9,7 +9,7 @@ in vec4 vWorldPos;
in vec2 vFaceUV;

void main(void) {
float alpha = texture(uDiffuseAtlas, vFaceUV).a;
float alpha = texture(uTextureAtlas[Texture_Diffuse], vFaceUV).a;
if (alpha < 0.75) discard;

// Normalized distance.
Expand Down
@@ -1,10 +1,7 @@
#version 330 core

#include "common/gbuffer_out.glsl"
#include "common/miplevel.glsl"

uniform sampler2D uDiffuseAtlas;
uniform sampler2D uTextureMetrics;
#include "common/material.glsl"

DENG_VAR vec2 vUV;
DENG_VAR vec3 vNormal;
Expand All @@ -14,18 +11,9 @@ flat DENG_VAR uint vFlags;
void main(void) {
uint matIndex = uint(vMaterial + 0.5);

// Albedo color.
vec4 uvRect = texelFetch(uTextureMetrics, ivec2(0, matIndex), 0);
vec3 texelSize = texelFetch(uTextureMetrics, ivec2(1, matIndex), 0).xyz;
float texelsPerMeter = texelSize.z;
vec2 texScale = vec2(texelsPerMeter) / texelSize.xy;

vec2 normUV = vUV * texScale;
vec2 uv = uvRect.xy + fract(normUV) * uvRect.zw;

vec4 color = textureLod(uDiffuseAtlas, uv, mipLevel(normUV, texelSize.xy) - 0.5);
if (color.a < 0.005)
{
// Diffuse color.
vec4 color = Gloom_FetchTexture(matIndex, Texture_Diffuse, vUV);
if (color.a < 0.005) {
discard;
}

Expand Down

0 comments on commit 4cf4d67

Please sign in to comment.