slowly getting better

This commit is contained in:
4sval
2022-10-29 23:55:57 +02:00
parent 59dd045a42
commit c6dcd921d8
5 changed files with 55 additions and 17 deletions

View File

@@ -10,14 +10,14 @@ struct Material {
sampler2D diffuseMap[8];
sampler2D normalMap[8];
sampler2D specularMap[8];
sampler2D emissionMap;
sampler2D emissionMap[8];
bool useSpecularMap;
bool hasDiffuseColor;
vec4 diffuseColor;
vec4 emissionColor;
vec4 emissionColor[8];
float metallic_value;
float roughness_value;
@@ -49,6 +49,18 @@ vec4 getValueFromSamplerArray(sampler2D array[8]) {
}
}
vec3 getValueFromVec4Array(vec4 array[8]) {
if (fTexIndex < 1.0) {
return array[0].rgb;
} if (fTexIndex < 2.0) {
return array[1].rgb;
} if (fTexIndex < 3.0) {
return array[2].rgb;
} else {
return array[3].rgb;
}
}
vec3 getNormalFromMap()
{
vec3 tangentNormal = getValueFromSamplerArray(material.normalMap).xyz * 2.0 - 1.0;
@@ -86,11 +98,12 @@ void main()
}
else
{
vec3 result = light.ambient * vec3(getValueFromSamplerArray(material.diffuseMap));
vec4 diffuse_map = getValueFromSamplerArray(material.diffuseMap);
vec3 diffuse_no_alpha = vec3(diffuse_map);
vec3 result = light.ambient * diffuse_no_alpha;
// diffuse
vec4 diffuse_map = getValueFromSamplerArray(material.diffuseMap);
result += light.diffuse * diff * diffuse_map.rgb;
result += light.diffuse * diff * diffuse_no_alpha;
// specular
if (material.useSpecularMap)
@@ -104,8 +117,8 @@ void main()
}
// emission
vec3 emission_map = vec3(texture(material.emissionMap, fTexCoords));
result += material.emissionColor.rgb * emission_map;
vec3 emission_map = vec3(getValueFromSamplerArray(material.emissionMap));
result += getValueFromVec4Array(material.emissionColor) * emission_map;
FragColor = vec4(result, 1.0);
}

View File

@@ -100,10 +100,10 @@
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="225" Header="Package" adonisExtensions:GridViewSortExtension.PropertyName="Package">
<GridViewColumn Width="225" Header="Archive" adonisExtensions:GridViewSortExtension.PropertyName="Archive">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding Package}" />
<TextBlock HorizontalAlignment="Left" Text="{Binding Archive}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

View File

@@ -21,10 +21,10 @@ public class Material : IDisposable
public Texture[] Diffuse;
public Texture[] Normals;
public Texture[] SpecularMasks;
public Texture Emissive;
public Texture[] Emissive;
public Vector4 DiffuseColor;
public Vector4 EmissionColor;
public Vector4[] EmissionColor;
public bool HasSpecularMap;
public bool HasDiffuseColor;
@@ -33,7 +33,7 @@ public class Material : IDisposable
Parameters = new CMaterialParams2();
UvNumber = 1;
DiffuseColor = Vector4.Zero;
EmissionColor = Vector4.Zero;
EmissionColor = Array.Empty<Vector4>();
IsUsed = false;
}
@@ -98,6 +98,23 @@ public class Material : IDisposable
index++;
}
index = 0;
Emissive = new Texture[UvNumber];
EmissionColor = new Vector4[UvNumber];
foreach (var e in Parameters.GetEmissiveTextures())
{
if (index < UvNumber && e is UTexture2D original)
{
if (Parameters.TryGetLinearColor(out var color, $"Emissive{(index > 0 ? index + 1 : "")}") && color is { A: > 0})
EmissionColor[index] = new Vector4(color.R, color.G, color.B, color.A);
else EmissionColor[index] = Vector4.One;
Add(Emissive, original);
}
else if (index < UvNumber) EmissionColor[index] = Vector4.Zero;
index++;
}
// diffuse light is based on normal map, so increase ambient if no normal map
_ambientLight = new Vector3(Normals[0] == null ? 1.0f : 0.2f);
HasSpecularMap = SpecularMasks[0] != null;
@@ -126,13 +143,18 @@ public class Material : IDisposable
SpecularMasks[i]?.Bind(TextureUnit.Texture0 + unit++);
}
for (var i = 0; i < Emissive.Length; i++)
{
shader.SetUniform($"material.emissionMap[{i}]", unit);
shader.SetUniform($"material.emissionColor[{i}]", EmissionColor[i]);
Emissive[i]?.Bind(TextureUnit.Texture0 + unit++);
}
shader.SetUniform("material.useSpecularMap", HasSpecularMap);
shader.SetUniform("material.hasDiffuseColor", HasDiffuseColor);
shader.SetUniform("material.diffuseColor", DiffuseColor);
shader.SetUniform("material.emissionColor", EmissionColor);
shader.SetUniform("material.metallic_value", 1f);
shader.SetUniform("material.roughness_value", 0f);
@@ -153,7 +175,10 @@ public class Material : IDisposable
{
SpecularMasks[i]?.Dispose();
}
Emissive?.Dispose();
for (int i = 0; i < Emissive.Length; i++)
{
Emissive[i]?.Dispose();
}
GL.DeleteProgram(_handle);
}
}

View File

@@ -79,7 +79,7 @@ public class Model : IDisposable
for (int m = 0; m < Materials.Length; m++)
{
if ((materials[m]?.TryLoad(out var material) ?? false) && material is UMaterialInterface unrealMaterial)
Materials[m] = new Material(4, unrealMaterial); // lod.NumTexCoords
Materials[m] = new Material(lod.NumTexCoords, unrealMaterial); // lod.NumTexCoords
else Materials[m] = new Material();
}