Close shader authoring usepass regressions

This commit is contained in:
2026-04-07 18:37:11 +08:00
parent 5a3232c099
commit 2f9b1696cd
12 changed files with 1908 additions and 547 deletions

View File

@@ -32,6 +32,7 @@ constexpr const char* kBuiltinUnlitShaderPath = "builtin://shaders/unlit";
constexpr const char* kBuiltinDepthOnlyShaderPath = "builtin://shaders/depth-only";
constexpr const char* kBuiltinShadowCasterShaderPath = "builtin://shaders/shadow-caster";
constexpr const char* kBuiltinObjectIdShaderPath = "builtin://shaders/object-id";
constexpr const char* kBuiltinObjectIdOutlineShaderPath = "builtin://shaders/object-id-outline";
constexpr const char* kBuiltinSkyboxShaderPath = "builtin://shaders/skybox";
constexpr const char* kBuiltinColorScalePostProcessShaderPath =
"builtin://shaders/color-scale-post-process";
@@ -46,22 +47,24 @@ struct MeshBuffers {
size_t CalculateBuiltinShaderMemorySize(const Shader& shader);
constexpr const char* kBuiltinForwardLitShaderManifestRelativePath =
"engine/assets/builtin/shaders/forward-lit/forward-lit.shader";
constexpr const char* kBuiltinUnlitShaderManifestRelativePath =
"engine/assets/builtin/shaders/unlit/unlit.shader";
constexpr const char* kBuiltinDepthOnlyShaderManifestRelativePath =
"engine/assets/builtin/shaders/depth-only/depth-only.shader";
constexpr const char* kBuiltinShadowCasterShaderManifestRelativePath =
"engine/assets/builtin/shaders/shadow-caster/shadow-caster.shader";
constexpr const char* kBuiltinObjectIdShaderManifestRelativePath =
"engine/assets/builtin/shaders/object-id/object-id.shader";
constexpr const char* kBuiltinSkyboxShaderManifestRelativePath =
"engine/assets/builtin/shaders/skybox/skybox.shader";
constexpr const char* kBuiltinColorScalePostProcessShaderManifestRelativePath =
"engine/assets/builtin/shaders/color-scale-post-process/color-scale-post-process.shader";
constexpr const char* kBuiltinFinalColorShaderManifestRelativePath =
"engine/assets/builtin/shaders/final-color/final-color.shader";
constexpr const char* kBuiltinForwardLitShaderAssetRelativePath =
"engine/assets/builtin/shaders/forward-lit.shader";
constexpr const char* kBuiltinUnlitShaderAssetRelativePath =
"engine/assets/builtin/shaders/unlit.shader";
constexpr const char* kBuiltinDepthOnlyShaderAssetRelativePath =
"engine/assets/builtin/shaders/depth-only.shader";
constexpr const char* kBuiltinShadowCasterShaderAssetRelativePath =
"engine/assets/builtin/shaders/shadow-caster.shader";
constexpr const char* kBuiltinObjectIdShaderAssetRelativePath =
"engine/assets/builtin/shaders/object-id.shader";
constexpr const char* kBuiltinObjectIdOutlineShaderAssetRelativePath =
"engine/assets/builtin/shaders/object-id-outline.shader";
constexpr const char* kBuiltinSkyboxShaderAssetRelativePath =
"engine/assets/builtin/shaders/skybox.shader";
constexpr const char* kBuiltinColorScalePostProcessShaderAssetRelativePath =
"engine/assets/builtin/shaders/color-scale-post-process.shader";
constexpr const char* kBuiltinFinalColorShaderAssetRelativePath =
"engine/assets/builtin/shaders/final-color.shader";
Containers::String NormalizeBuiltinAssetPath(const std::filesystem::path& path) {
return Containers::String(path.lexically_normal().generic_string().c_str());
@@ -98,7 +101,7 @@ bool TryResolveBuiltinAssetPathFromAnchor(
return false;
}
bool TryResolveBuiltinShaderManifestPath(
bool TryResolveBuiltinShaderAssetPath(
const std::filesystem::path& relativePath,
Containers::String& outPath) {
std::filesystem::path resolvedPath;
@@ -124,51 +127,54 @@ bool TryResolveBuiltinShaderManifestPath(
return false;
}
const char* GetBuiltinShaderManifestRelativePath(const Containers::String& builtinShaderPath) {
const char* GetBuiltinShaderAssetRelativePath(const Containers::String& builtinShaderPath) {
if (builtinShaderPath == Containers::String(kBuiltinForwardLitShaderPath)) {
return kBuiltinForwardLitShaderManifestRelativePath;
return kBuiltinForwardLitShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinUnlitShaderPath)) {
return kBuiltinUnlitShaderManifestRelativePath;
return kBuiltinUnlitShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinDepthOnlyShaderPath)) {
return kBuiltinDepthOnlyShaderManifestRelativePath;
return kBuiltinDepthOnlyShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinShadowCasterShaderPath)) {
return kBuiltinShadowCasterShaderManifestRelativePath;
return kBuiltinShadowCasterShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinObjectIdShaderPath)) {
return kBuiltinObjectIdShaderManifestRelativePath;
return kBuiltinObjectIdShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinObjectIdOutlineShaderPath)) {
return kBuiltinObjectIdOutlineShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinSkyboxShaderPath)) {
return kBuiltinSkyboxShaderManifestRelativePath;
return kBuiltinSkyboxShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinColorScalePostProcessShaderPath)) {
return kBuiltinColorScalePostProcessShaderManifestRelativePath;
return kBuiltinColorScalePostProcessShaderAssetRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinFinalColorShaderPath)) {
return kBuiltinFinalColorShaderManifestRelativePath;
return kBuiltinFinalColorShaderAssetRelativePath;
}
return nullptr;
}
bool TryResolveBuiltinShaderManifestPath(
bool TryResolveBuiltinShaderAssetPath(
const Containers::String& builtinShaderPath,
Containers::String& outPath) {
const char* relativePath = GetBuiltinShaderManifestRelativePath(builtinShaderPath);
const char* relativePath = GetBuiltinShaderAssetRelativePath(builtinShaderPath);
if (relativePath == nullptr) {
return false;
}
return TryResolveBuiltinShaderManifestPath(std::filesystem::path(relativePath), outPath);
return TryResolveBuiltinShaderAssetPath(std::filesystem::path(relativePath), outPath);
}
Shader* LoadBuiltinShaderFromManifest(
Shader* LoadBuiltinShaderFromAsset(
const Containers::String& builtinPath,
const Containers::String& manifestPath) {
const Containers::String& assetPath) {
ShaderLoader shaderLoader;
LoadResult result = shaderLoader.Load(manifestPath);
LoadResult result = shaderLoader.Load(assetPath);
if (!result || result.resource == nullptr) {
return nullptr;
}
@@ -180,13 +186,13 @@ Shader* LoadBuiltinShaderFromManifest(
return shader;
}
Shader* TryLoadBuiltinShaderFromManifest(const Containers::String& builtinPath) {
Containers::String manifestPath;
if (!TryResolveBuiltinShaderManifestPath(builtinPath, manifestPath)) {
Shader* TryLoadBuiltinShaderFromAsset(const Containers::String& builtinPath) {
Containers::String assetPath;
if (!TryResolveBuiltinShaderAssetPath(builtinPath, assetPath)) {
return nullptr;
}
return LoadBuiltinShaderFromManifest(builtinPath, manifestPath);
return LoadBuiltinShaderFromAsset(builtinPath, assetPath);
}
Math::Bounds ComputeBounds(const std::vector<StaticMeshVertex>& vertices) {
@@ -675,35 +681,39 @@ size_t CalculateBuiltinShaderMemorySize(const Shader& shader) {
}
Shader* BuildBuiltinForwardLitShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinUnlitShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinDepthOnlyShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinShadowCasterShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinObjectIdShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinObjectIdOutlineShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinSkyboxShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinColorScalePostProcessShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Shader* BuildBuiltinFinalColorShader(const Containers::String& path) {
return TryLoadBuiltinShaderFromManifest(path);
return TryLoadBuiltinShaderFromAsset(path);
}
Material* BuildDefaultPrimitiveMaterial(const Containers::String& path) {
@@ -776,6 +786,50 @@ bool IsBuiltinTexturePath(const Containers::String& path) {
return path.StartsWith(kBuiltinTexturePrefix);
}
bool TryGetBuiltinShaderPathByShaderName(
const Containers::String& shaderName,
Containers::String& outPath) {
if (shaderName == "Builtin Forward Lit") {
outPath = GetBuiltinForwardLitShaderPath();
return true;
}
if (shaderName == "Builtin Unlit") {
outPath = GetBuiltinUnlitShaderPath();
return true;
}
if (shaderName == "Builtin Depth Only") {
outPath = GetBuiltinDepthOnlyShaderPath();
return true;
}
if (shaderName == "Builtin Shadow Caster") {
outPath = GetBuiltinShadowCasterShaderPath();
return true;
}
if (shaderName == "Builtin Object Id") {
outPath = GetBuiltinObjectIdShaderPath();
return true;
}
if (shaderName == "Builtin Object Id Outline") {
outPath = GetBuiltinObjectIdOutlineShaderPath();
return true;
}
if (shaderName == "Builtin Skybox") {
outPath = GetBuiltinSkyboxShaderPath();
return true;
}
if (shaderName == "Builtin Color Scale Post Process") {
outPath = GetBuiltinColorScalePostProcessShaderPath();
return true;
}
if (shaderName == "Builtin Final Color") {
outPath = GetBuiltinFinalColorShaderPath();
return true;
}
outPath.Clear();
return false;
}
const char* GetBuiltinPrimitiveDisplayName(BuiltinPrimitiveType primitiveType) {
switch (primitiveType) {
case BuiltinPrimitiveType::Cube: return "Cube";
@@ -824,6 +878,10 @@ Containers::String GetBuiltinObjectIdShaderPath() {
return Containers::String(kBuiltinObjectIdShaderPath);
}
Containers::String GetBuiltinObjectIdOutlineShaderPath() {
return Containers::String(kBuiltinObjectIdOutlineShaderPath);
}
Containers::String GetBuiltinSkyboxShaderPath() {
return Containers::String(kBuiltinSkyboxShaderPath);
}
@@ -934,6 +992,8 @@ LoadResult CreateBuiltinShaderResource(const Containers::String& path) {
shader = BuildBuiltinShadowCasterShader(path);
} else if (path == GetBuiltinObjectIdShaderPath()) {
shader = BuildBuiltinObjectIdShader(path);
} else if (path == GetBuiltinObjectIdOutlineShaderPath()) {
shader = BuildBuiltinObjectIdOutlineShader(path);
} else if (path == GetBuiltinSkyboxShaderPath()) {
shader = BuildBuiltinSkyboxShader(path);
} else if (path == GetBuiltinColorScalePostProcessShaderPath()) {