我正在使用 OpenGl v.1.0.1 制作一个简单的 CAD 3D 图形应用程序(是的,在所有使用 Windows 操作系统的机器上都可以使用虚拟的旧版 OpenGL)。
为了加快渲染过程,我使用了一个常见的颜色可见性测试:在渲染最终图像之前,我首先关闭所有 OpenGL 状态(照明、面部剔除等,但不是深度测试)并渲染所有颜色略有不同的对象一种纹理。
之后,我检查纹理的颜色,最后为颜色出现在纹理上的元素设置可见性标志。
这通常适用于我的桌面,默认分辨率为 1600x1200。但是,当我在默认分辨率为 1366x768 的笔记本电脑上测试我的应用程序时,我在该过程中遇到了一些不匹配的问题。结果是最终图像总是带有“疤痕”(它就像一条带,通常在台式机上通过可见性测试的颜色位在笔记本电脑上却没有通过)。
什么会导致这样的问题?
更新。两张图片来说明问题:1360x768 res(台式机)和1366x768 res(笔记本电脑)
更新。我读取位域并将颜色转换为纹理上出现的我应该渲染的元素的编号的方法的源代码:
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 - 指向为位图分配的内存开头的指针。