所以我正在瀏覽橙皮書(第3版),並且在第9章中我遇到了關於不變限定符的一段。它說:關於OpenGL不變限定符的困惑
的不變預選賽指示編譯器和鏈接忽略的表達和功能沒有直接關係到輸出的計算。
這段話來自後兩個代碼相似的片段:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
和
uniform mat4 MVPmatrix;
// ...
invariant gl_Position;
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
這本書,然後繼續說:
第一種情況可能會或不管用什麼不相關的函數,都不能以完全相同的方式計算變換後的位置或表達式鏈接到着色器。如果使用多遍算法多次渲染相同的幾何圖形,這可能會導致渲染問題。
哪個讓我困惑。如果a()
決不會影響計算變換位置所涉及的變量,那麼計算如何變化? (以及invariant
有什麼幫助?)。並且提到第一句話時,他們說「忽略不相關的功能」究竟意味着什麼?他們只是沒有被執行?
我不認爲這回答了原點兩個問題。並且報價塊既不是 – suitianshi
@suitianshi:OP想要理解不變量,並繼續剖析橙皮書對此有何評論。橙皮書的內容基本上可以被認爲是錯誤的。所以我選擇從原始來源,GLSL規範回答。原始問題試圖理解錯誤的陳述。你想要什麼正確的答案? – Bahbar
我發現了一個描述爲什麼我們有時需要「不變」的頁面。它表示多通道問題可能是由cpu指令重新排序引起的(還有一些其他的問題,對不起,我不記得它清楚又找不到內容)。例如,如果我使用相同的着色器程序渲染兩次三角形,但在兩次傳遞過程中我得到了一次睡眠或購物,那麼產生的兩個三角形可能不會重疊(當然,偏移量可能非常小)。其實我已經閱讀了GLSL規範,但仍然感到困惑。 – suitianshi