让 p a 为(0.5, y )和 p b < / em> at(5.5, y )。如果我们从 p a 到 p b 绘制一个线段,我们在上得到一个5像素的段x 轴。问题是这些像素究竟在哪里?
根据OpenGL ES 2.0 specification 3.4.1:
当 p a 和 p b 位于片段中心时,片段的这种表征简化为Bresenham的算法通过一个修改:本说明书中生成的行是“半开”,意味着不绘制最终片段(对应于 p b )。
如果我们从 p a 到 p b 绘制一个片段,我们得到像素1到5(< em> x 坐标)。 p a 位于第一个像素的中心, p b 位于第6个像素的中心。如果我们从 p b 绘制到 p a ,我们得到2到6.这就是我的结果上iPhone 4s。但在Android(Nexus 7 和模拟器)上,结果总是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文件with the following code的内容并运行 hello-gl2 ndk示例项目。
答案 0 :(得分:2)
指定您链接的规范:
因为钻石退出规则的初始和最终条件可能 很难实现,其他线段光栅化算法 允许,但须遵守以下规则:
- 算法产生的片段坐标在x或y窗口坐标中的偏差不得超过一个单位 钻石退出规则产生的相应碎片。
醇>
因此,遗憾的是,它似乎是一种法律偏差。
对于变通方法,我自己尝试使用0.25或0.75而不是0.5的坐标,如果它们可能在两个光栅化器上产生相同的结果。
或者在开头栅格化一行并查看光栅化器使用的规则,然后稍后调整所有坐标。