Added CI/CD.
BIN
resources/audio/One True God - Careless (ft. Vania).wav
Normal file
BIN
resources/audio/Paddle.wav
Normal file
BIN
resources/audio/Score.wav
Normal file
BIN
resources/audio/Wall.wav
Normal file
BIN
resources/audio/sample.wav
Normal file
BIN
resources/fonts/Arial_24.ehf
Normal file
BIN
resources/fonts/Arial_48.ehf
Normal file
BIN
resources/fonts/Hack-Bold_12.ehf
Normal file
BIN
resources/fonts/Hack-Bold_48.ehf
Normal file
BIN
resources/fonts/Hack-Regular_24.ehf
Normal file
BIN
resources/fonts/Hack-Regular_48.ehf
Normal file
BIN
resources/models/Cube.ehm
Normal file
BIN
resources/models/Cube_P.ehm
Normal file
BIN
resources/models/PointLight.ehm
Normal file
BIN
resources/models/Rifle.ehm
Normal file
BIN
resources/models/Sphere.ehm
Normal file
BIN
resources/models/Test.ehm
Normal file
BIN
resources/models/Test2.ehm
Normal file
BIN
resources/models/Vampire.ehm
Normal file
BIN
resources/models/untitled.ehm
Normal file
31
resources/shaders/Billboard.frag
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 fUv;
|
||||||
|
layout(location = 1) in flat uint fChannels;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
vec4 multiplier;
|
||||||
|
bool preMultiply;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = opt.multiplier;
|
||||||
|
if (fChannels == 1)
|
||||||
|
result *= vec4(texture(render, fUv).rrr, 1.0f);
|
||||||
|
else if (fChannels == 2)
|
||||||
|
result *= vec4(texture(render, fUv).rrr, texture(render, fUv).g);
|
||||||
|
else if (fChannels == 3)
|
||||||
|
result *= vec4(texture(render, fUv).rgb, 1.0f);
|
||||||
|
else if (fChannels == 4)
|
||||||
|
result *= texture(render, fUv).rgba;
|
||||||
|
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
53
resources/shaders/Billboard.vert
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
layout(location = 1) out uint fChannels;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
vec3 pos;
|
||||||
|
uint channels;
|
||||||
|
vec2 size;
|
||||||
|
} trans;
|
||||||
|
|
||||||
|
mat4 RemoveRotation(mat4 inMat)
|
||||||
|
{
|
||||||
|
inMat[0][0] = 1.0;
|
||||||
|
inMat[0][1] = 0.0;
|
||||||
|
inMat[0][2] = 0.0;
|
||||||
|
inMat[1][0] = 0.0;
|
||||||
|
inMat[1][1] = 1.0;
|
||||||
|
inMat[1][2] = 0.0;
|
||||||
|
inMat[2][0] = 0.0;
|
||||||
|
inMat[2][1] = 0.0;
|
||||||
|
inMat[2][2] = 1.0;
|
||||||
|
|
||||||
|
return inMat;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// The vec4 we will use to set gl_Position
|
||||||
|
vec4 pos = vec4(trans.pos, 1.0f);
|
||||||
|
|
||||||
|
// Adjust the position based on the camera view
|
||||||
|
// Extract the right and up vectors from the view matrix
|
||||||
|
vec3 right = vec3(trans.viewProj[0][0], trans.viewProj[1][0], trans.viewProj[2][0]);
|
||||||
|
vec3 up = vec3(trans.viewProj[0][1], trans.viewProj[1][1], trans.viewProj[2][1]);
|
||||||
|
|
||||||
|
// Adjust the quad vertices to face the camera
|
||||||
|
// The inPosition.xy should be in NDC space, from -1 to 1
|
||||||
|
pos.xyz += (right * vPos.x * trans.size.x) + (up * vPos.y * trans.size.y);
|
||||||
|
|
||||||
|
// Output position
|
||||||
|
gl_Position = trans.viewProj * pos;
|
||||||
|
|
||||||
|
// Pass through the texture coordinates
|
||||||
|
fUv = vUv;
|
||||||
|
fChannels = trans.channels;
|
||||||
|
}
|
BIN
resources/shaders/Billboard_Frag.spv
Normal file
BIN
resources/shaders/Billboard_Vert.spv
Normal file
25
resources/shaders/Compile.sh
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for file in ./*.vert; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
filename=$(basename -- "$file")
|
||||||
|
|
||||||
|
echo "Compiling vertex shader, ${filename}"
|
||||||
|
|
||||||
|
filename="${filename%.*}"
|
||||||
|
|
||||||
|
glslangValidator -V "${file}" -o "./${filename}_Vert.spv"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in ./*.frag; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
filename=$(basename -- "$file")
|
||||||
|
|
||||||
|
echo "Compiling vertex shader, ${filename}"
|
||||||
|
|
||||||
|
filename="${filename%.*}"
|
||||||
|
|
||||||
|
glslangValidator -V "${file}" -o "./${filename}_Frag.spv"
|
||||||
|
fi
|
||||||
|
done
|
22
resources/shaders/FA_Preview.frag
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 fUv;
|
||||||
|
layout(location = 1) in flat uint fChannels;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
vec4 multiplier;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if (fChannels != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
result = vec4(texture(render, fUv).rrrr) * opt.multiplier;
|
||||||
|
}
|
24
resources/shaders/FA_Preview.vert
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
layout(location = 1) out flat uint fChannels;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 proj;
|
||||||
|
mat4 view;
|
||||||
|
mat4 model;
|
||||||
|
int channels;
|
||||||
|
} trans;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = trans.proj * trans.view * trans.model * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
fUv = vUv;
|
||||||
|
fChannels = trans.channels;
|
||||||
|
}
|
BIN
resources/shaders/FA_Preview_Frag.spv
Normal file
BIN
resources/shaders/FA_Preview_Vert.spv
Normal file
12
resources/shaders/FBO.frag
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColor = texture(render, vUv);
|
||||||
|
}
|
17
resources/shaders/FBO.vert
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform UniformBufferObject {
|
||||||
|
mat4 mvp;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = ubo.mvp * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
fUv = vUv;
|
||||||
|
}
|
BIN
resources/shaders/FBO_Frag.spv
Normal file
BIN
resources/shaders/FBO_Vert.spv
Normal file
21
resources/shaders/Label.frag
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 glyphUV;
|
||||||
|
layout(location = 1) in vec4 glyphColor;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(std140, binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
bool preMultiply;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D atlas;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = vec4(glyphColor.r, glyphColor.g, glyphColor.b, glyphColor.a * texture(atlas, glyphUV).r);
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
23
resources/shaders/Label.vert
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 glyphUV;
|
||||||
|
layout(location = 1) out vec4 glyphColor;
|
||||||
|
|
||||||
|
layout(std140, binding = 0) uniform Data
|
||||||
|
{
|
||||||
|
mat4 proj;
|
||||||
|
mat4 view;
|
||||||
|
mat4 model;
|
||||||
|
vec4 color;
|
||||||
|
} data;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = data.proj * data.view * data.model * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
glyphUV = vUv;
|
||||||
|
glyphColor = data.color;
|
||||||
|
}
|
BIN
resources/shaders/Label_Frag.spv
Normal file
BIN
resources/shaders/Label_Vert.spv
Normal file
21
resources/shaders/Light.frag
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 fUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Material
|
||||||
|
{
|
||||||
|
vec3 lightColor;
|
||||||
|
} material;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec4 result = texture(render, fUv);
|
||||||
|
if (result.rgb == vec3(1.0f, 1.0f, 1.0f))
|
||||||
|
result = vec4(material.lightColor, 1.0f);
|
||||||
|
|
||||||
|
outColor = vec4(result.rgb, 1.0f);
|
||||||
|
}
|
17
resources/shaders/Light.vert
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform {
|
||||||
|
mat4 mvp;
|
||||||
|
} transform;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = transform.mvp * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
fUv = vUv;
|
||||||
|
}
|
26
resources/shaders/LightBillboard.frag
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 fUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
bool preMultiply;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = texture(render, fUv).rgba;
|
||||||
|
|
||||||
|
if (result.rgb == vec3(1.0f, 1.0f, 1.0f))
|
||||||
|
result *= vec4(opt.color, 1.0f);
|
||||||
|
|
||||||
|
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
50
resources/shaders/LightBillboard.vert
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
vec3 pos;
|
||||||
|
vec2 size;
|
||||||
|
} trans;
|
||||||
|
|
||||||
|
mat4 RemoveRotation(mat4 inMat)
|
||||||
|
{
|
||||||
|
inMat[0][0] = 1.0;
|
||||||
|
inMat[0][1] = 0.0;
|
||||||
|
inMat[0][2] = 0.0;
|
||||||
|
inMat[1][0] = 0.0;
|
||||||
|
inMat[1][1] = 1.0;
|
||||||
|
inMat[1][2] = 0.0;
|
||||||
|
inMat[2][0] = 0.0;
|
||||||
|
inMat[2][1] = 0.0;
|
||||||
|
inMat[2][2] = 1.0;
|
||||||
|
|
||||||
|
return inMat;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// The vec4 we will use to set gl_Position
|
||||||
|
vec4 pos = vec4(trans.pos, 1.0f);
|
||||||
|
|
||||||
|
// Adjust the position based on the camera view
|
||||||
|
// Extract the right and up vectors from the view matrix
|
||||||
|
vec3 right = vec3(trans.viewProj[0][0], trans.viewProj[1][0], trans.viewProj[2][0]);
|
||||||
|
vec3 up = vec3(trans.viewProj[0][1], trans.viewProj[1][1], trans.viewProj[2][1]);
|
||||||
|
|
||||||
|
// Adjust the quad vertices to face the camera
|
||||||
|
// The inPosition.xy should be in NDC space, from -1 to 1
|
||||||
|
pos.xyz += (right * vPos.x * trans.size.x) + (up * vPos.y * trans.size.y);
|
||||||
|
|
||||||
|
// Output position
|
||||||
|
gl_Position = trans.viewProj * pos;
|
||||||
|
|
||||||
|
// Pass through the texture coordinates
|
||||||
|
fUv = vUv;
|
||||||
|
}
|
BIN
resources/shaders/LightBillboard_Frag.spv
Normal file
BIN
resources/shaders/LightBillboard_Vert.spv
Normal file
BIN
resources/shaders/Light_Frag.spv
Normal file
BIN
resources/shaders/Light_Vert.spv
Normal file
128
resources/shaders/Phong.frag
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
#define MAX_LIGHTS 4
|
||||||
|
|
||||||
|
struct AmbientPointLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
vec3 pos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PointLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
float constant;
|
||||||
|
vec3 pos;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SpotLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
float innerCutOff;
|
||||||
|
vec3 pos;
|
||||||
|
float outerCutOff;
|
||||||
|
vec3 dir;
|
||||||
|
float constant;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(std140, binding = 2) uniform Data
|
||||||
|
{
|
||||||
|
vec3 ambient;
|
||||||
|
bool preMultiply;
|
||||||
|
vec4 multiplier;
|
||||||
|
uint ambientPointLightCount;
|
||||||
|
uint pointLightCount;
|
||||||
|
uint spotLightCount;
|
||||||
|
AmbientPointLight ambientLights[MAX_LIGHTS];
|
||||||
|
PointLight pointLights[MAX_LIGHTS];
|
||||||
|
SpotLight spotLights[MAX_LIGHTS];
|
||||||
|
} data;
|
||||||
|
|
||||||
|
layout(binding = 3) uniform sampler2D colorMap;
|
||||||
|
layout(binding = 4) uniform sampler2D normalMap;
|
||||||
|
layout(binding = 5) uniform sampler2D specularMap;
|
||||||
|
|
||||||
|
layout(location = 0) in vec4 fVertPos;
|
||||||
|
layout(location = 1) in vec3 fTanPos;
|
||||||
|
layout(location = 2) in vec2 fUV;
|
||||||
|
layout(location = 3) in vec3 fViewPos;
|
||||||
|
layout(location = 4) in mat3 fTBN;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
vec3 CalcAmbientPointLight(vec3 normal, vec3 vertexPos, vec3 viewDir, AmbientPointLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), texture(specularMap, fUV).r);
|
||||||
|
|
||||||
|
return diffuse + specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 CalcPointLight(vec3 normal, vec3 vertexPos, vec3 viewDir, PointLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float dist = length(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float attenuation = 1.0f / (light.constant + light.linear * dist + light.quadratic * (dist * dist));
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), texture(specularMap, fUV).r);
|
||||||
|
|
||||||
|
return (diffuse + specular) * attenuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 CalcSpotLight(vec3 normal, vec3 vertexPos, vec3 viewDir, SpotLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float dist = length(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float attenuation = 1.0f / (light.constant + light.linear * dist + light.quadratic * (dist * dist));
|
||||||
|
|
||||||
|
float theta = dot(lightDir, normalize(-light.dir));
|
||||||
|
float epsilon = light.innerCutOff - light.outerCutOff;
|
||||||
|
float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), texture(specularMap, fUV).r);
|
||||||
|
|
||||||
|
return (diffuse + specular) * intensity * attenuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec3 viewDir = normalize(fViewPos - fTanPos);
|
||||||
|
vec3 nNorm = normalize(texture(normalMap, fUV).rgb * 2.0f - 1.0f);
|
||||||
|
|
||||||
|
vec3 final = data.ambient;
|
||||||
|
|
||||||
|
//Ambient Point Lights
|
||||||
|
for (uint i = 0; i < data.ambientPointLightCount; ++i)
|
||||||
|
final += CalcAmbientPointLight(nNorm, fVertPos.xyz, viewDir, data.ambientLights[i]);
|
||||||
|
|
||||||
|
//Point Lights
|
||||||
|
for (uint i = 0; i < data.pointLightCount; ++i)
|
||||||
|
final += CalcPointLight(nNorm, fVertPos.xyz, viewDir, data.pointLights[i]);
|
||||||
|
|
||||||
|
//Spot Lights
|
||||||
|
for (uint i = 0; i < data.spotLightCount; ++i)
|
||||||
|
final += CalcSpotLight(nNorm, fVertPos.xyz, viewDir, data.spotLights[i]);
|
||||||
|
|
||||||
|
vec4 tColor = texture(colorMap, fUV);
|
||||||
|
|
||||||
|
result = vec4(tColor.rgb * final * data.multiplier.rgb, tColor.a * data.multiplier.a);
|
||||||
|
|
||||||
|
if (data.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
62
resources/shaders/Phong.vert
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
struct Bone
|
||||||
|
{
|
||||||
|
mat4 trans;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(std140, binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
mat4 model;
|
||||||
|
vec3 viewPos;
|
||||||
|
} transform;
|
||||||
|
|
||||||
|
layout(std140, binding = 1) uniform Skin
|
||||||
|
{
|
||||||
|
Bone skeleton[255];
|
||||||
|
} skin;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec3 vNorm;
|
||||||
|
layout(location = 2) in vec2 vUV;
|
||||||
|
layout(location = 3) in vec3 vTan;
|
||||||
|
layout(location = 4) in vec3 vBiTan;
|
||||||
|
layout(location = 5) in uvec4 bones;
|
||||||
|
layout(location = 6) in vec4 weights;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 fVertPos;
|
||||||
|
layout(location = 1) out vec3 fTanPos;
|
||||||
|
layout(location = 2) out vec2 fUV;
|
||||||
|
layout(location = 3) out vec3 fViewPos;
|
||||||
|
layout(location = 4) out mat3 fTBN;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 totalPos = vec4(0.0f);
|
||||||
|
|
||||||
|
for (uint i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (weights[i] == 0.0f)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
totalPos += skin.skeleton[bones[i]].trans * vec4(vPos, 1.0f) * weights[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
fVertPos = transform.model * totalPos;
|
||||||
|
fUV = vUV;
|
||||||
|
|
||||||
|
vec3 T = normalize(vec3(transform.model * vec4(vTan, 0.0f)));
|
||||||
|
vec3 B = normalize(vec3(transform.model * vec4(vBiTan, 0.0f)));
|
||||||
|
vec3 N = normalize(vec3(transform.model * vec4(vNorm, 0.0f)));
|
||||||
|
|
||||||
|
T = normalize(T - dot(T, N) * N);
|
||||||
|
|
||||||
|
fTBN = transpose(mat3(T, B, N));
|
||||||
|
|
||||||
|
fTanPos = fTBN * fVertPos.xyz;
|
||||||
|
fViewPos = fTBN * transform.viewPos;
|
||||||
|
|
||||||
|
gl_Position = transform.viewProj * transform.model * totalPos;
|
||||||
|
}
|
BIN
resources/shaders/Phong_Frag.spv
Normal file
BIN
resources/shaders/Phong_Vert.spv
Normal file
31
resources/shaders/Portrait.frag
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 fUv;
|
||||||
|
layout(location = 1) in flat uint fChannels;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
bool preMultiply;
|
||||||
|
vec4 multiplier;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = opt.multiplier;
|
||||||
|
if (fChannels == 1)
|
||||||
|
result *= vec4(texture(render, fUv).rrr, 1.0f);
|
||||||
|
else if (fChannels == 2)
|
||||||
|
result *= vec4(texture(render, fUv).rrr, texture(render, fUv).g);
|
||||||
|
else if (fChannels == 3)
|
||||||
|
result *= vec4(texture(render, fUv).rgb, 1.0f);
|
||||||
|
else if (fChannels == 4)
|
||||||
|
result *= texture(render, fUv).rgba;
|
||||||
|
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
24
resources/shaders/Portrait.vert
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
layout(location = 1) out flat uint fChannels;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 proj;
|
||||||
|
mat4 view;
|
||||||
|
mat4 model;
|
||||||
|
int channels;
|
||||||
|
} trans;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = trans.proj * trans.view * trans.model * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
fUv = vUv;
|
||||||
|
fChannels = trans.channels;
|
||||||
|
}
|
BIN
resources/shaders/Portrait_Frag.spv
Normal file
BIN
resources/shaders/Portrait_Vert.spv
Normal file
14
resources/shaders/RigidBodyDebug.frag
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(std140, binding = 1) uniform Data
|
||||||
|
{
|
||||||
|
vec4 color;
|
||||||
|
} data;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = data.color;
|
||||||
|
}
|
15
resources/shaders/RigidBodyDebug.vert
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(std140, binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
mat4 model;
|
||||||
|
} transform;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = transform.viewProj * transform.model * vec4(vPos, 1.0f);
|
||||||
|
}
|
BIN
resources/shaders/RigidBodyDebug_Frag.spv
Normal file
BIN
resources/shaders/RigidBodyDebug_Vert.spv
Normal file
20
resources/shaders/Skybox.frag
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 skyboxUV;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(std140, binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
bool preMultiply;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform samplerCube skybox;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = texture(skybox, skyboxUV);
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
20
resources/shaders/Skybox.vert
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
|
||||||
|
layout(location = 0) out vec3 skyboxUV;
|
||||||
|
|
||||||
|
layout(std140, binding = 0) uniform Data
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
} data;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
skyboxUV = vPos;
|
||||||
|
|
||||||
|
vec4 pos = data.viewProj * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
gl_Position = pos.xyww;
|
||||||
|
}
|
BIN
resources/shaders/Skybox_Frag.spv
Normal file
BIN
resources/shaders/Skybox_Vert.spv
Normal file
137
resources/shaders/SolidColor.frag
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
#define MAX_LIGHTS 4
|
||||||
|
|
||||||
|
struct Material
|
||||||
|
{
|
||||||
|
vec4 color;
|
||||||
|
bool diffused;
|
||||||
|
float specular;
|
||||||
|
float shininess;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AmbientPointLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
vec3 pos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PointLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
float constant;
|
||||||
|
vec3 pos;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SpotLight
|
||||||
|
{
|
||||||
|
vec3 color;
|
||||||
|
float innerCutOff;
|
||||||
|
vec3 pos;
|
||||||
|
float outerCutOff;
|
||||||
|
vec3 dir;
|
||||||
|
float constant;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(std140, binding = 1) uniform Data
|
||||||
|
{
|
||||||
|
vec3 ambient;
|
||||||
|
bool preMultiply;
|
||||||
|
vec3 camPos;
|
||||||
|
Material material;
|
||||||
|
uint ambientPointLightCount;
|
||||||
|
uint pointLightCount;
|
||||||
|
uint spotLightCount;
|
||||||
|
AmbientPointLight ambientLights[MAX_LIGHTS];
|
||||||
|
PointLight pointLights[MAX_LIGHTS];
|
||||||
|
SpotLight spotLights[MAX_LIGHTS];
|
||||||
|
} data;
|
||||||
|
|
||||||
|
layout(location = 1) in vec3 fNorm;
|
||||||
|
layout(location = 0) in vec4 fWorldPos;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
vec3 CalcAmbientPointLight(vec3 normal, vec3 vertexPos, vec3 viewDir, Material material, AmbientPointLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), material.shininess);
|
||||||
|
|
||||||
|
return diffuse + specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 CalcPointLight(vec3 normal, vec3 vertexPos, vec3 viewDir, Material material, PointLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float dist = length(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float attenuation = 1.0f / (light.constant + light.linear * dist + light.quadratic * (dist * dist));
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), material.shininess);
|
||||||
|
|
||||||
|
return (diffuse + specular) * attenuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 CalcSpotLight(vec3 normal, vec3 vertexPos, vec3 viewDir, Material material, SpotLight light)
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float dist = length(light.pos - vertexPos);
|
||||||
|
|
||||||
|
float attenuation = 1.0f / (light.constant + light.linear * dist + light.quadratic * (dist * dist));
|
||||||
|
|
||||||
|
float theta = dot(lightDir, normalize(-light.dir));
|
||||||
|
float epsilon = light.innerCutOff - light.outerCutOff;
|
||||||
|
float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
vec3 diffuse = light.color * max(dot(normal, lightDir), 0.0f);
|
||||||
|
|
||||||
|
vec3 specular = light.color * pow(max(dot(normal, normalize(lightDir + viewDir)), 0.0), material.shininess);
|
||||||
|
|
||||||
|
return (diffuse + specular) * intensity * attenuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if (data.material.diffused == true)
|
||||||
|
{
|
||||||
|
vec3 viewDir = normalize(data.camPos - fWorldPos.xyz);
|
||||||
|
vec3 nNorm = normalize(fNorm);
|
||||||
|
|
||||||
|
vec3 final = data.ambient;
|
||||||
|
|
||||||
|
//Ambient Point Lights
|
||||||
|
for (uint i = 0; i < data.ambientPointLightCount; ++i)
|
||||||
|
final += CalcAmbientPointLight(nNorm, fWorldPos.xyz, viewDir, data.material, data.ambientLights[i]);
|
||||||
|
|
||||||
|
//Point Lights
|
||||||
|
for (uint i = 0; i < data.pointLightCount; ++i)
|
||||||
|
final += CalcPointLight(nNorm, fWorldPos.xyz, viewDir, data.material, data.pointLights[i]);
|
||||||
|
|
||||||
|
//Spot Lights
|
||||||
|
for (uint i = 0; i < data.spotLightCount; ++i)
|
||||||
|
final += CalcSpotLight(nNorm, fWorldPos.xyz, viewDir, data.material, data.spotLights[i]);
|
||||||
|
|
||||||
|
//outColor = vec4(data.spotLights[0].quadratic, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
result = vec4(data.material.color.rgb * final, data.material.color.a);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = data.material.color;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
22
resources/shaders/SolidColor.vert
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(std140, binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
mat4 model;
|
||||||
|
} transform;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec3 vNorm;
|
||||||
|
|
||||||
|
layout(location = 1) out vec3 fNorm;
|
||||||
|
layout(location = 0) out vec4 fWorldPos;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fNorm = (transform.model * vec4(vNorm, 0.0f)).xyz;
|
||||||
|
fWorldPos = transform.model * vec4(vPos, 1.0f);
|
||||||
|
|
||||||
|
gl_Position = transform.viewProj * fWorldPos;
|
||||||
|
}
|
20
resources/shaders/SolidColor2D.frag
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Shading
|
||||||
|
{
|
||||||
|
vec4 color;
|
||||||
|
bool preMultiply;
|
||||||
|
} shading;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
outColor = shading.color;
|
||||||
|
|
||||||
|
if (shading.preMultiply)
|
||||||
|
outColor = vec4(outColor.rgb * outColor.a, outColor.a);
|
||||||
|
}
|
15
resources/shaders/SolidColor2D.vert
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform UniformBufferObject
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
mat4 model;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = ubo.viewProj * ubo.model * vec4(vPos, 1.0);
|
||||||
|
}
|
BIN
resources/shaders/SolidColor2D_Frag.spv
Normal file
BIN
resources/shaders/SolidColor2D_Vert.spv
Normal file
38
resources/shaders/SolidColorAnimated.vert
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#extension GL_EXT_scalar_block_layout : enable
|
||||||
|
|
||||||
|
#define MAX_WEIGHTS 3
|
||||||
|
#define MAX_BONES 50
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 viewProj;
|
||||||
|
mat4 model;
|
||||||
|
mat4 bones[MAX_BONES];
|
||||||
|
} transform;
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vNorm;
|
||||||
|
layout(location = 1) in vec3 vPos;
|
||||||
|
layout(location = 2) in uvec3 vBoneIndices;
|
||||||
|
layout(location = 3) in vec3 vWeights;
|
||||||
|
|
||||||
|
layout(location = 0) out vec3 fNorm;
|
||||||
|
layout(location = 1) out vec4 fWorldPos;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 totalLocalPos = vec4(0.0f);
|
||||||
|
vec4 totalNormal = vec4(0.0f);
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_WEIGHTS; ++i)
|
||||||
|
{
|
||||||
|
totalLocalPos += transform.bones[vBoneIndices[i]] * vec4(vPos, 1.0f) * vWeights[i];
|
||||||
|
totalNormal += transform.bones[vBoneIndices[i]] * vec4(vNorm, 0.0f) * vWeights[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
fNorm = (transform.model * totalNormal).xyz;
|
||||||
|
fWorldPos = transform.model * totalLocalPos;
|
||||||
|
|
||||||
|
gl_Position = transform.viewProj * fWorldPos;
|
||||||
|
}
|
BIN
resources/shaders/SolidColorAnimated_Vert.spv
Normal file
BIN
resources/shaders/SolidColor_Frag.spv
Normal file
BIN
resources/shaders/SolidColor_Vert.spv
Normal file
21
resources/shaders/Viewport.frag
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 result;
|
||||||
|
|
||||||
|
layout(binding = 1) uniform Opt
|
||||||
|
{
|
||||||
|
bool preMultiply;
|
||||||
|
vec4 multiplier;
|
||||||
|
} opt;
|
||||||
|
|
||||||
|
layout(binding = 2) uniform sampler2D render;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
result = opt.multiplier * texture(render, vUv);
|
||||||
|
if (opt.preMultiply)
|
||||||
|
result = vec4(result.rgb * result.a, result.a);
|
||||||
|
}
|
21
resources/shaders/Viewport.vert
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_separate_shader_objects : enable
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 vPos;
|
||||||
|
layout(location = 1) in vec2 vUv;
|
||||||
|
|
||||||
|
layout(location = 0) out vec2 fUv;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform Transform
|
||||||
|
{
|
||||||
|
mat4 proj;
|
||||||
|
mat4 view;
|
||||||
|
mat4 model;
|
||||||
|
} trans;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = trans.proj * trans.view * trans.model * vec4(vPos, 1.0);
|
||||||
|
|
||||||
|
fUv = vUv;
|
||||||
|
}
|
BIN
resources/shaders/Viewport_Frag.spv
Normal file
BIN
resources/shaders/Viewport_Vert.spv
Normal file
BIN
resources/textures/AmbientPointLight.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/textures/Character_Diffuse.png
Normal file
After Width: | Height: | Size: 481 KiB |
BIN
resources/textures/Character_Normal.png
Normal file
After Width: | Height: | Size: 558 KiB |
BIN
resources/textures/Character_Specular.png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
resources/textures/Circle.qoi
Normal file
BIN
resources/textures/Cube_Diffuse.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
resources/textures/Cube_Normal.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
resources/textures/Cube_Specular.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
resources/textures/DownArrow.png
Normal file
After Width: | Height: | Size: 127 B |
BIN
resources/textures/LeftArrow.png
Normal file
After Width: | Height: | Size: 134 B |
BIN
resources/textures/LightBulb.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
resources/textures/LightBulb_Lit.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
resources/textures/PointLight.png
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
resources/textures/RightArrow.png
Normal file
After Width: | Height: | Size: 143 B |
BIN
resources/textures/SpotLight.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
resources/textures/Untitled.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
resources/textures/UpArrow.png
Normal file
After Width: | Height: | Size: 131 B |
BIN
resources/textures/Vampire_Diffuse.png
Normal file
After Width: | Height: | Size: 605 KiB |
BIN
resources/textures/Vampire_Emission.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
resources/textures/Vampire_Normal.png
Normal file
After Width: | Height: | Size: 3.8 MiB |
BIN
resources/textures/Vampire_Specular.png
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
resources/textures/brickwall.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
resources/textures/brickwall_normal.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
resources/textures/brickwall_specular.png
Normal file
After Width: | Height: | Size: 634 KiB |