[英]Handling per-primitive normals when there are less vertices than primitives in OpenGL4.5
我在OpenGL 4.5 中想出了一個解決方案,將正確的法線傳遞給片段着色器,以便每個三角形圖元能夠在進行索引三角形渲染時使用每個三角形法線。 (我想使用 IBO)
我目前適用於某些模型的解決方案基本上是將每個圖元的第一個頂點設置為激發頂點,並將圖元的法線計為激發頂點的法線。 (當然是在shaders的normal屬性上加上flat修飾符)
這應該適用於大多數模型,但我已經意識到,當 model 中的三角形基元多於頂點時,它就不起作用。我能想到的最簡單的例子是三角雙錐。
在OpenGL的行業中是否有典型的方法? 在工業中,模型是否大到每個頂點的法線更容易實現並且看起來更好?
正如其他人在評論中提到的那樣,“在行業中”人們經常會復制具有不連續法線的頂點。 當您的幾何體只有一部分是平坦的陰影並且部分是光滑的,或者其中有折痕時,這是不可避免的。
如果您的幾何體完全是平面着色的,您可以做的另一種方法是使用 gl_PrimitiveID 從片段着色器中的gl_PrimitiveID
獲取每個圖元的法線:
layout(std430, binding = 0) buffer NormalsBuffer {
vec4 NORMALS[];
};
void main() {
vec3 normal = NORMALS[gl_PrimitiveID].xyz;
// ...
}
您還可以使用unpackSnorm2x16
或類似函數來讀取存儲在較小數據類型中的法線,從而減少帶寬,就像頂點數組屬性一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.