我一直在努力尋找如何做到這一點:在OpenGL中定義區域之外進行裁剪。OpenGL - 3D空間裁剪
我不想使用視口或剪刀順便剪輯。我一直在尋找像瘋了一樣,所有我找到的是如何使用視口/剪刀。
我想定義類似於「如果此像素具有低於10個單位的x不繪製它」。例如,「如果x在10-20之間,y在10-20之間,z在10-20之間,則可以繪製,否則不要渲染像素」。
腳註:吮吸stackoverflow需要註冊才能提出問題。當網站開放並且帳戶創建是可選的時候,情況會更好。
我一直在努力尋找如何做到這一點:在OpenGL中定義區域之外進行裁剪。OpenGL - 3D空間裁剪
我不想使用視口或剪刀順便剪輯。我一直在尋找像瘋了一樣,所有我找到的是如何使用視口/剪刀。
我想定義類似於「如果此像素具有低於10個單位的x不繪製它」。例如,「如果x在10-20之間,y在10-20之間,z在10-20之間,則可以繪製,否則不要渲染像素」。
腳註:吮吸stackoverflow需要註冊才能提出問題。當網站開放並且帳戶創建是可選的時候,情況會更好。
在稍微查找一段時間後找出結果,通常我只是在此網站上提出問題。
Java代碼(我使用LWJGL):
DoubleBuffer eqn1 = BufferUtils.createDoubleBuffer(8).put(new double[] {-1, 0, 0, 100});
eqn1.flip();
GL11.glClipPlane(GL11.GL_CLIP_PLANE0, eqn1);
GL11.glEnable(GL11.GL_CLIP_PLANE0);
像往常一樣,OpenGL是嚴重(如在較差,不容易掌握)證明,我不得不四處尋找,直到最後,我發現了一些解釋這在一些論壇上(並且顯示必須翻轉緩衝區):前三個雙打是剪切平面的法線,最後(100)距離該平面的世界原點(0,0,0)有多遠。因此,如果攝像機直視(0,0,0),則上面的示例代碼將在右側創建一個平面,使OpenGL不會在其右側顯示內容。該飛機位於x = 100且面向左側(-1)。
我希望這將是尋找未來答案的人的搜索結果。
固定功能有用戶定義的剪切平面,詳情請參閱glClipPlane()
。你可以定義6個這些飛機來達到你所說的效果。
基於現代着色器的GL提供了gl_ClipDistance[]
輸出變量數組來實現這樣的事情。
您描述的測試似乎是每個片段,因此您也可以在片段着色器中執行此操作,方法是丟棄區域外的所有片段。但是這樣做效率很低(並且不能使用早期的Z測試),所以你應該小心。這可能會與模板測試結合起來限制x和y,並且只對着色器中的z進行測試。
感謝您的回答,儘管前一分鐘已經算出來了。但我會研究一下gl_clipDistance的東西。 – user2445741
順便說一句,我讀過一些人只能在他的gfx卡上有一個剪輯平面。你知道這是常見的嗎?如果我甚至無法制作六張可在大多數gfx卡上工作的剪輯平面,那感覺就像是一個糟糕的解決方案。有另一種方法嗎?是否可以使用圓圈剪輯(值得問,也許你知道)?比如說,相機處於球體的中間,球體外面的東西沒有被繪製出來? – user2445741
@ user2445741:例如,OpenGL規範保證至少6個用戶可定義的裁剪平面。根據GLSL3.3規範,'gl_ClipDistance []'數組的最小尺寸至少爲8。 – derhass