第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在OpenGL中對半透明三角形進行排序?

如何在OpenGL中對半透明三角形進行排序?

Qyouu 2021-05-12 17:14:31
我正在使用OpenGL編寫3D游戲。渲染半透明三角形時出現(xiàn)排序問題。我知道需要對它們進行排序,但是如何?我不想使用BSP樹(如果要更改對象的位置,則需要重建樹。)和OIT算法(性能昂貴)。我想按“覆蓋率”對它們進行排序。我有兩個半透明的三角形,并且使用透視相機將它們投影到屏幕上。視口:0、0、1280、720例如[正確排序]黑色三角形覆蓋綠色三角形。[錯誤排序]綠色三角形覆蓋黑色三角形。圖像中的三角形是不透明的,以便清楚地看到分類偽像。我對這個問題的解決方案將這些三角形的頂點轉(zhuǎn)換為屏幕空間坐標,并通過對z坐標進行插值進行比較,但在我的圖像上,您可以看到黑色三角形的一個坐標在視口之外,因此該坐標很奇怪(類似于:-2896; 1423 ; 1.169),并且無法在黑色三角形上插值z坐標。我如何轉(zhuǎn)換為屏幕空間坐標通過MVP矩陣變換三角形頂點執(zhí)行透視劃分轉(zhuǎn)換為屏幕空間通過MVP矩陣進行轉(zhuǎn)換public Vector4f transform(Vector4f vector) {    float x = m00 * vector.x + m10 * vector.y + m20 * vector.z + m30 * vector.w;    float y = m01 * vector.x + m11 * vector.y + m21 * vector.z + m31 * vector.w;    float z = m02 * vector.x + m12 * vector.y + m22 * vector.z + m32 * vector.w;    float w = m03 * vector.x + m13 * vector.y + m23 * vector.z + m33 * vector.w;    return new Vector4f(x, y, z, w);}透視鴻溝public Vector3f perspectiveDivide() {    float wInverse = 1.0f / w;    return new Vector3f(x * wInverse, y * wInverse, z * wInverse);}轉(zhuǎn)換為屏幕空間public void toScreenCoords(int width, int height) {    x = (x * 0.5f + 0.5f) * width;    y = (y * 0.5f + 0.5f) * height;    z = (z + 1.0f) * 0.5f;}我如何執(zhí)行Vector4f clipspace = mvp.transform(triangle_vertex);Vector3f ndc = clipspace.perspectiveDivide();Vector3f screenspace = ndc.toScreenCoords(1280, 720);我做錯了什么?為什么在視口外協(xié)調(diào)該操作很奇怪?如何獲得視口外的正確坐標?- - 編輯 - -我發(fā)現(xiàn),如果三角形在視口外的坐標為一個,則該三角形必須分為兩個。但是如何使用裁剪空間坐標和裁剪平面將三角形分成兩個部分呢?
查看完整描述

1 回答

?
翻過高山走不出你

TA貢獻1875條經(jīng)驗 獲得超3個贊

快速簡便地正確排序(半透明)三角形的解決方案

我稱之為“假投影排序”。如果可以假設(shè)三角形不相交,則只需檢查三角形(黑色或綠色)是否與四面體相交即可(綠色三角形的黑色坐標與相機位置的坐標)。


一個例子

第一個三角形坐標:


0.0, 0.0, 5.0

0.0, 5.0, 5.0

5.0, 5.0, 5.0

第二個三角形坐標:


0.0, 0.0, 5.0

5.0, 0.0, 5.0

5.0, 0.0, 5.0

相機位置


1.15, 5.8, 5.5

然后,四面體坐標將是來自三角形(例如,第一個)和相機位置的坐標。


0.0,  0.0, 5.0  // First coordinate from the first triangle

0.0,  5.0, 5.0  // Second coordinate from the first triangle

5.0,  5.0, 5.0  // Third coordinate from the first triangle

1.15, 5.8, 5.5  // Camera position

您需要做的最后一件事是檢查第二個三角形是否與四面體相交。如果第二個三角形相交,則它覆蓋第一個三角形。如果使用第二個三角形的坐標來創(chuàng)建四面體,則需要檢查第一個三角形的交點,而不是第二個。


筆記

不要使用Java的TreeSet或TreeMap使用“假投影排序”來比較三角形,否則會產(chǎn)生不正確的排序。


查看完整回答
反對 回復(fù) 2021-05-26
  • 1 回答
  • 0 關(guān)注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號