设p a为 (0.5, y ) 处的点,p b为 (5.5, y ) 处的点。如果我们画一条从p a到p b的线段,我们会在x轴上得到一个 5 像素的线段。问题是这些像素到底在哪里?
当p a和p b位于片段中心时,片段的这种表征通过一个修改简化为 Bresenham 算法:在此描述中产生的线是“半开的”,这意味着最终片段(对应于p b)未绘制。
如果我们从p a到p b画一段,我们得到像素 1 到 5(x坐标)。p a位于第一个像素的中心,p b位于第 6 个像素的中心。如果我们从p b到p a我们得到 2 到 6。这就是我在 iPhone 4s 上得到的结果。但在 Android(Nexus 7和 emulator)上,结果始终是 1 到 5(方向无关紧要)。绘图代码完全相同(使用NDK)。
所以问题是哪种行为是正确的?我应该使用什么解决方法在两个系统上获得相同的结果?
编辑
在 Mac OS 上,如果您运行以下代码(使用简单的NSOpenGLView
子类):
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.85f, 0.35f);
float pa = 0.5;
float pb = 5.5;
float y = 5.5;
glOrtho(-50, 50, -50, 50, -1, 1);
glBegin(GL_LINES);
{
//pa to pb - lower line
glVertex3f(pa, y, 0.0);
glVertex3f(pb, y, 0.0);
++y;
//pb to pa - upper line
glVertex3f(pb, y, 0.0);
glVertex3f(pa, y, 0.0);
}
glEnd();
glFlush();
你得到这个结果:
所以这是预期的结果。似乎 Nexus 7 对规范有不同的解释,或者我可能需要启用一些特殊设置。
编辑2:
我的模拟器不适合屏幕,它正在重新调整屏幕输出,它产生了一种假象,即模拟器与设备有同样的问题。通过 DDMS 截屏后,很明显模拟器产生了预期的结果:
但设备正在产生以下结果:
要重现此问题,请将 gl_code.cpp 文件的内容替换为以下代码并运行hello-gl2 ndk 示例项目。