私は、OpenGl v.1.0.1 を使用して単純な CAD 3D グラフィックス アプリケーションを作成しています (はい、Windows OS を使用するすべてのマシンで利用可能なダミーのレガシー OpenGL です)。
レンダリング プロセスを高速化するために、一般的な色の可視性テストを使用しています。最終的な画像をレンダリングする前に、最初にすべての OpenGL の状態 (ライティング、フェース カリングなど。深度テストはオフ) をオフにし、すべてのオブジェクトをわずかに異なる色でレンダリングします。テクスチャ。
その後、テクスチャの色をチェックし、最後に、その色がテクスチャに表示される要素に可視性フラグを設定します。
これは通常、デフォルトの解像度が 1600x1200 のデスクトップで機能します。しかし、デフォルトの解像度が 1366x768 のラップトップでアプリケーションをテストすると、そのプロセスでいくつかの不一致が発生します。その結果、最終的な画像は常に「傷」で描画されます (通常、デスクトップでは可視性テストに合格するカラー ビットが、ラップトップでは合格しないストリップのようなものです)。
何がそのような問題を引き起こす可能性がありますか?
更新しました。問題を説明する 2 つの画像:解像度 1360x768 (デスクトップ)と解像度 1366x768 (ラップトップ)
更新しました。ビットフィールドを読み取り、テクスチャに表示される色をレンダリングする必要がある要素の数に変換するメソッドのソース コード:
for (long iY = m_iColorBuffY - viewport[3]; iY < m_iColorBuffY; ++iY) {
for (long iX = 0; iX < viewport[2]; ++iX) {
long iOffset = (iY*m_iColorBuffX + iX)*iColorBytes;
long CurColor = 0;
for (long iColorByte = 0; iColorByte < iColorBytes; ++iColorByte) {
BYTE color = *((BYTE*)m_pColorBufferEntry + iOffset + iColorByte);
CurColor += (color<<(iColorBytes - 1 - iColorByte)*8);
}
if(!CurColor) continue;
long Index = CModelWorldRenderer::ConvertFictiveColorToIndex(mc,CurColor);
switch (mc) {
case MC_FE: {
IElement^ pCurElement = pModel->getElement(Index);
if (pCurElement) pCurElement->setFlag(IElement::e_ElFlag::EEF_Visible);
m_pObjectsVisibilityMap->put_ObjectIndex(
false,
Index,
iX,
viewport[3] - (iY - viewport[1] + 1));
}
break;
case MC_NODE: {
if (Index < ndSize) m_NodesVisibilityFlags[Index] |= NRF_VISIBLE;
}
break;
}
}
*m_pColorBufferEntry - ビットマップに割り当てられたメモリの先頭へのポインタ。