Commit d03baf78 authored by Adam Štěpánek's avatar Adam Štěpánek
Browse files

Split ubershader into texturedObject and normalMappedObject

parent b3decb36
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -6,12 +6,16 @@ layout(binding = 0, std140) uniform Camera {
	vec3 position;
} camera;

layout (binding = 1, std140) uniform Light {
struct Light {
	vec4 position;
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
} light;
};

layout(binding = 1, std430) buffer Lights {
	Light lights[];
};

layout(binding = 2, std140) uniform Material {
	vec4 ambientColor;
@@ -20,12 +24,11 @@ layout(binding = 2, std140) uniform Material {
} material;

layout(binding = 0) uniform sampler2D diffuseTexture;
layout(binding = 3) uniform sampler2D specularTexture;
layout(binding = 3) uniform sampler2D normalTexture;

layout(location = 0) uniform mat4 modelMatrix;

layout(location = 0) in vec3 fs_Position;
layout(location = 1) in vec3 fs_Normal;
layout(location = 2) in vec2 fs_TextureCoord;
layout(location = 3) in vec3 fs_CameraPosition;
layout(location = 4) in vec3 fs_LightPosition;
@@ -34,20 +37,20 @@ layout(location = 0) out vec4 finalColor;

void main()
{
	vec3 lightVector = fs_LightPosition.xyz - fs_Position * light.position.w;
	vec3 lightVector = fs_LightPosition - fs_Position * lights[0].position.w;
	vec3 L = normalize(lightVector);
	vec3 N = normalize(fs_Normal);
	vec3 E = normalize(fs_CameraPosition - fs_Position);
	vec3 H = normalize(L + E);

	vec3 N = texture(normalTexture, fs_TextureCoord).rgb;
	N = normalize(N * 2.0 - 1.0);
	float NdotL = max(dot(N, L), 0.0);
	float NdotH = max(dot(N, H), 0.0);

	float distance2 = light.position.w == 1.0 ? pow(length(lightVector), 2) : 1.0;
	float distance2 = lights[0].position.w == 1.0 ? pow(length(lightVector), 2) : 1.0;

	vec3 ambient = material.ambientColor.rgb * light.ambientColor.rgb;
	vec3 diffuse = texture(diffuseTexture, fs_TextureCoord).rgb * material.diffuseColor.rgb * light.diffuseColor.rgb;
	vec3 specular = material.specularColor.rgb * light.specularColor.rgb;
	vec3 ambient = material.ambientColor.rgb * lights[0].ambientColor.rgb;
	vec3 diffuse = texture(diffuseTexture, fs_TextureCoord).rgb * material.diffuseColor.rgb * lights[0].diffuseColor.rgb;
	vec3 specular = material.specularColor.rgb * lights[0].specularColor.rgb;

	vec3 color = ambient.rgb
		+ NdotL * diffuse.rgb
+7 −5
Original line number Diff line number Diff line
@@ -6,12 +6,16 @@ layout(binding = 0, std140) uniform Camera {
	vec3 position;
} camera;

layout (binding = 1, std140) uniform Light {
struct Light {
	vec4 position;
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
} light;
};

layout(binding = 1, std430) buffer Lights {
	Light lights[];
};

layout(binding = 2, std140) uniform Material {
	vec4 ambientColor;
@@ -27,7 +31,6 @@ layout(location = 2) in vec2 textureCoord;
layout(location = 3) in vec3 tangent;

layout(location = 0) out vec3 fs_Position;
layout(location = 1) out vec3 fs_Normal;
layout(location = 2) out vec2 fs_TextureCoord;
layout(location = 3) out vec3 fs_CameraPosition;
layout(location = 4) out vec3 fs_LightPosition;
@@ -41,9 +44,8 @@ void main()
	mat3 TBN = transpose(mat3(T,B,N));

	fs_CameraPosition = TBN * camera.position;
	fs_LightPosition = TBN * light.position.xyz;
	fs_LightPosition = TBN * lights[0].position.xyz;
	fs_Position = TBN * vec3(modelMatrix * vec4(position, 1.0));
	fs_Normal = normalMatrix * normal;
	fs_TextureCoord = textureCoord;

	gl_Position = camera.projection * camera.view * modelMatrix * vec4(position, 1.0);
+66 −0
Original line number Diff line number Diff line
#version 450

layout(binding = 0, std140) uniform Camera {
	mat4 projection;
	mat4 view;
	vec3 position;
} camera;

struct Light {
	vec4 position;
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
};

layout(binding = 1, std430) buffer Lights {
	Light lights[];
};

layout(binding = 2, std140) uniform Material {
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
} material;

layout(location = 0) uniform mat4 modelMatrix;

layout(binding = 0) uniform sampler2D diffuseTexture;

layout(location = 0) in vec3 fs_Position;
layout(location = 1) in vec3 fs_Normal;
layout(location = 2) in vec2 fs_TextureCoord;

layout(location = 0) out vec4 finalColor;

void main()
{
	vec3 lightsSum = vec3(0.0);
	for(int i = 0; i < lights.length(); i++) {
		Light light = lights[i];

		vec3 lightVector = light.position.xyz - fs_Position * light.position.w;
		vec3 L = normalize(lightVector);
		vec3 N = normalize(fs_Normal);
		vec3 E = normalize(camera.position - fs_Position); 
		vec3 H = normalize(L + E);

		float NdotL = max(dot(N, L), 0.0);
		float NdotH = max(dot(N, H), 0.0);

		float distance2 = light.position.w == 1.0 ? pow(length(lightVector), 2) : 1.0;

		vec3 ambient = material.ambientColor.rgb * light.ambientColor.rgb;
		vec3 diffuse = texture(diffuseTexture, fs_TextureCoord).rgb * material.diffuseColor.rgb * light.diffuseColor.rgb;
		vec3 specular = material.specularColor.rgb * light.specularColor.rgb;

		vec3 color = ambient.rgb
			+ NdotL * diffuse.rgb
			+ pow(NdotH, material.specularColor.w) * specular;
		color /= distance2;

		lightsSum += color;
	}

	finalColor = vec4(lightsSum, 1.0);
}
+43 −0
Original line number Diff line number Diff line
#version 450

layout(binding = 0, std140) uniform Camera {
	mat4 projection;
	mat4 view;
	vec3 position;
} camera;

struct Light {
	vec4 position;
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
};

layout(binding = 1, std430) buffer Lights {
	Light lights[];
};

layout(binding = 2, std140) uniform Material {
	vec4 ambientColor;
	vec4 diffuseColor;
	vec4 specularColor;
} material;

layout(location = 0) uniform mat4 modelMatrix;

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 textureCoord;

layout(location = 0) out vec3 fs_Position;
layout(location = 1) out vec3 fs_Normal;
layout(location = 2) out vec2 fs_TextureCoord;

void main()
{
	fs_Position = vec3(modelMatrix * vec4(position, 1.0));
	fs_Normal = transpose(inverse(mat3(modelMatrix))) * normal;
	fs_TextureCoord = textureCoord;

	gl_Position = camera.projection * camera.view * modelMatrix * vec4(position, 1.0);
}