really bad shader

This commit is contained in:
4sval 2022-08-28 00:04:28 +02:00
parent 4edfdabcd0
commit dde7688f2e
5 changed files with 102 additions and 37 deletions

@ -1 +1 @@
Subproject commit c3db95ebc3800207eb3fc7dc66470178c037ff51 Subproject commit 5725d3c30ec311870e5832e6869af73ea40aab79

View File

@ -444,24 +444,8 @@ public class ModelViewerViewModel : ViewModel
if (parameters.Specular is UTexture2D specular) if (parameters.Specular is UTexture2D specular)
{ {
var mip = specular.GetFirstMip(); var mip = specular.GetFirstMip();
byte[] data; var platform = UserSettings.Default.OverridedPlatform;
SKColorType colorType; TextureDecoder.DecodeTexture(mip, specular.Format, specular.isNormalMap, platform, out var data, out var colorType);
switch (UserSettings.Default.OverridedPlatform)
{
case ETexturePlatform.Playstation:
PlaystationDecoder.DecodeTexturePlaystation(mip, specular.Format, specular.isNormalMap,
out data, out colorType);
break;
case ETexturePlatform.NintendoSwitch:
NintendoSwitchDecoder.DecodeTextureNSW(mip, specular.Format, specular.isNormalMap,
out data, out colorType);
break;
default:
TextureDecoder.DecodeTexture(mip, specular.Format, specular.isNormalMap,
out data, out colorType);
break;
}
switch (_game) switch (_game)
{ {

View File

@ -15,7 +15,7 @@ public class Model : IDisposable
private BufferObject<float> _vbo; private BufferObject<float> _vbo;
private VertexArrayObject<float, uint> _vao; private VertexArrayObject<float, uint> _vao;
private const int _vertexSize = 8; // Position + Normals + UV private const int _vertexSize = 8; // Position + Normal + UV
private const uint _faceSize = 3; // just so we don't have to do .Length private const uint _faceSize = 3; // just so we don't have to do .Length
private readonly uint[] _facesIndex = { 1, 0, 2 }; private readonly uint[] _facesIndex = { 1, 0, 2 };
@ -73,7 +73,7 @@ public class Model : IDisposable
_vao = new VertexArrayObject<float, uint>(_gl, _vbo, _ebo); _vao = new VertexArrayObject<float, uint>(_gl, _vbo, _ebo);
_vao.VertexAttributePointer(0, 3, VertexAttribPointerType.Float, _vertexSize, 0); // position _vao.VertexAttributePointer(0, 3, VertexAttribPointerType.Float, _vertexSize, 0); // position
_vao.VertexAttributePointer(1, 3, VertexAttribPointerType.Float, _vertexSize, 3); // normals _vao.VertexAttributePointer(1, 3, VertexAttribPointerType.Float, _vertexSize, 3); // normal
_vao.VertexAttributePointer(2, 2, VertexAttribPointerType.Float, _vertexSize, 6); // uv _vao.VertexAttributePointer(2, 2, VertexAttribPointerType.Float, _vertexSize, 6); // uv
for (int section = 0; section < Sections.Length; section++) for (int section = 0; section < Sections.Length; section++)
@ -91,11 +91,27 @@ public class Model : IDisposable
_shader.SetUniform("uModel", Matrix4x4.Identity); _shader.SetUniform("uModel", Matrix4x4.Identity);
_shader.SetUniform("uView", camera.GetViewMatrix()); _shader.SetUniform("uView", camera.GetViewMatrix());
_shader.SetUniform("uProjection", camera.GetProjectionMatrix()); _shader.SetUniform("uProjection", camera.GetProjectionMatrix());
// _shader.SetUniform("viewPos", camera.Position); _shader.SetUniform("viewPos", camera.Position);
_shader.SetUniform("material.diffuse", 0);
_shader.SetUniform("material.normal", 1);
_shader.SetUniform("material.specular", 2);
// _shader.SetUniform("material.metallic", 3);
// _shader.SetUniform("material.emission", 4);
_shader.SetUniform("material.shininess", 32f);
var lightColor = Vector3.One;
var diffuseColor = lightColor * new Vector3(0.5f);
var ambientColor = diffuseColor * new Vector3(0.2f);
_shader.SetUniform("light.ambient", ambientColor);
_shader.SetUniform("light.diffuse", diffuseColor); // darkened
_shader.SetUniform("light.specular", Vector3.One);
_shader.SetUniform("light.position", camera.Position);
for (int section = 0; section < Sections.Length; section++) for (int section = 0; section < Sections.Length; section++)
{ {
Sections[section].Bind(_shader); Sections[section].Bind();
_gl.DrawArrays(PrimitiveType.Triangles, Sections[section].FirstFaceIndex, Sections[section].FacesCount); _gl.DrawArrays(PrimitiveType.Triangles, Sections[section].FirstFaceIndex, Sections[section].FacesCount);
} }

View File

@ -3,6 +3,7 @@ using CUE4Parse.UE4.Assets.Exports.Material;
using CUE4Parse.UE4.Assets.Exports.Texture; using CUE4Parse.UE4.Assets.Exports.Texture;
using CUE4Parse_Conversion.Meshes.PSK; using CUE4Parse_Conversion.Meshes.PSK;
using CUE4Parse_Conversion.Textures; using CUE4Parse_Conversion.Textures;
using FModel.Settings;
using Silk.NET.OpenGL; using Silk.NET.OpenGL;
namespace FModel.Views.Snooper; namespace FModel.Views.Snooper;
@ -12,8 +13,11 @@ public class Section : IDisposable
private uint _handle; private uint _handle;
private GL _gl; private GL _gl;
private Texture _albedoMap; private Texture _diffuseMap;
// private Texture _normalMap; private Texture _normalMap;
private Texture _specularMap;
// private Texture _metallicMap;
private Texture _emissionMap;
public uint FacesCount; public uint FacesCount;
public int FirstFaceIndex; public int FirstFaceIndex;
@ -36,25 +40,55 @@ public class Section : IDisposable
_handle = _gl.CreateProgram(); _handle = _gl.CreateProgram();
if (Parameters.Diffuse is UTexture2D { IsVirtual: false } diffuse && diffuse.GetFirstMip() is { } mip) var platform = UserSettings.Default.OverridedPlatform;
if (Parameters.Diffuse is UTexture2D { IsVirtual: false } diffuse)
{ {
TextureDecoder.DecodeTexture(mip, diffuse.Format, diffuse.isNormalMap, out var data, out _); var mip = diffuse.GetFirstMip();
_albedoMap = new Texture(_gl, data, (uint) mip.SizeX, (uint) mip.SizeY); TextureDecoder.DecodeTexture(mip, diffuse.Format, diffuse.isNormalMap, platform, out var data, out _);
_diffuseMap = new Texture(_gl, data, (uint) mip.SizeX, (uint) mip.SizeY);
}
if (Parameters.Normal is UTexture2D { IsVirtual: false } normal)
{
var mip = normal.GetFirstMip();
TextureDecoder.DecodeTexture(mip, normal.Format, normal.isNormalMap, platform, out var data, out _);
_normalMap = new Texture(_gl, data, (uint) mip.SizeX, (uint) mip.SizeY);
}
if (Parameters.Specular is UTexture2D { IsVirtual: false } specular)
{
var mip = specular.GetFirstMip();
TextureDecoder.DecodeTexture(mip, specular.Format, specular.isNormalMap, platform, out var data, out _);
_specularMap = new Texture(_gl, data, (uint) mip.SizeX, (uint) mip.SizeY);
}
if (Parameters.HasTopEmissiveTexture &&
Parameters.EmissiveColor is { A: > 0 } emissiveColor &&
Parameters.Emissive is UTexture2D { IsVirtual: false } emissive)
{
var mip = emissive.GetFirstMip();
TextureDecoder.DecodeTexture(mip, emissive.Format, emissive.isNormalMap, platform, out var data, out _);
_emissionMap = new Texture(_gl, data, (uint) mip.SizeX, (uint) mip.SizeY);
} }
} }
public void Bind(Shader shader) public void Bind()
{ {
if (Parameters.IsNull) if (Parameters.IsNull)
return; return;
shader.SetUniform("material.albedo", 0); _diffuseMap?.Bind(TextureUnit.Texture0);
_albedoMap?.Bind(TextureUnit.Texture0); _normalMap?.Bind(TextureUnit.Texture1);
_specularMap?.Bind(TextureUnit.Texture2);
_emissionMap?.Bind(TextureUnit.Texture4);
} }
public void Dispose() public void Dispose()
{ {
_albedoMap?.Dispose(); _diffuseMap?.Dispose();
_normalMap?.Dispose();
_specularMap?.Dispose();
_emissionMap?.Dispose();
_gl.DeleteProgram(_handle); _gl.DeleteProgram(_handle);
} }
} }

View File

@ -19,13 +19,14 @@ uniform mat4 uModel;
uniform mat4 uView; uniform mat4 uView;
uniform mat4 uProjection; uniform mat4 uProjection;
out vec3 fNormal;
out vec3 fPos; out vec3 fPos;
out vec3 fNormal;
out vec2 fTexCoords; out vec2 fTexCoords;
void main() void main()
{ {
gl_Position = uProjection * uView * uModel * vec4(vPos, 1.0); gl_Position = uProjection * uView * uModel * vec4(vPos, 1.0);
fPos = vec3(uModel * vec4(vPos, 1.0)); fPos = vec3(uModel * vec4(vPos, 1.0));
fNormal = mat3(transpose(inverse(uModel))) * vNormal; fNormal = mat3(transpose(inverse(uModel))) * vNormal;
fTexCoords = vTexCoords; fTexCoords = vTexCoords;
@ -35,25 +36,55 @@ void main()
private readonly string FragmentShaderSource = @" private readonly string FragmentShaderSource = @"
#version 330 core #version 330 core
in vec3 fNormal;
in vec3 fPos; in vec3 fPos;
in vec3 fNormal;
in vec2 fTexCoords; in vec2 fTexCoords;
struct Material { struct Material {
sampler2D albedo; sampler2D diffuse;
sampler2D normal; sampler2D normal;
sampler2D specular; sampler2D specular;
sampler2D metallic; sampler2D metallic;
sampler2D emissive; sampler2D emission;
float shininess;
};
struct Light {
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
}; };
uniform Material material; uniform Material material;
uniform Light light;
uniform vec3 viewPos;
out vec4 FragColor; out vec4 FragColor;
void main() void main()
{ {
FragColor = texture(material.albedo, fTexCoords); // ambient
vec3 ambient = light.ambient * vec3(texture(material.diffuse, fTexCoords));
// diffuse
vec3 norm = texture(material.normal, fTexCoords).rgb;
norm = normalize(norm * 2.0 - 1.0);
vec3 lightDir = normalize(light.position - fPos);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuseMap = vec3(texture(material.diffuse, fTexCoords));
vec3 diffuse = light.diffuse * diff * diffuseMap;
// specular
vec3 viewDir = normalize(viewPos - fPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0f), material.shininess);
vec3 specularMap = vec3(texture(material.specular, fTexCoords));
vec3 specular = light.specular * spec * specularMap;
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0);
} }
"; ";