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