在例如GLSL中編寫的着色器通常在運行時加載到圖形應用程序中。我想知道爲什麼不直接用着色器編譯應用程序,以便以後不必加載。像這樣:在圖形應用程序中,爲什麼着色器會在運行時加載到應用程序中?
#define glsl(version, glsl) "#version " #version "\n" #glsl
namespace glsl { namespace vs {
//VERTEX SHADERS
//=========================
// simple VS
//=========================
constexpr GLchar * const simple = glsl(450 core,
layout(location = 0) in vec3 position;
void main() {
gl_Position = vec4(position, 1.0f);
}
);
} namespace fs {
//FRAGMENT SHADERS
//=========================
// simple FS
//=========================
constexpr GLchar * const simple = glsl(450 core,
out vec4 color;
void main() {
color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
);
} }
我不認爲這會導致exe文件太大,它會加快加載時間;除非我誤解了有多少着色器用於典型的圖形應用程序。我意識到你可能想要在編譯時更新着色器,但這確實發生了嗎?
有什麼理由不應該這樣做?
這個問題可能更適合https://softwareengineering.stackexchange.com/,因爲它可能會產生大量的自以爲是或主觀的答案。 – Xirema
我不這樣做的主要原因是因爲每當着色器被改變時你都必須重新編譯你的應用程序。在我目前的項目建設中,應用程序可能需要幾分鐘的時間,所以我們儘量避免這種情況。 – BDL
你從哪裏得到這個想法? Shader編譯是一個代價高昂的過程(在同一臺機器上反覆執行並獲得相同的結果是毫無意義的)。建議使用預編譯(或至少緩存)着色器。例如看[QUALCOMM dev網絡文章](https://developer.qualcomm.com/blog/binary-shaders) – VTT