Android上的OpenGL线段光栅化

Android上的OpenGL线段光栅化,android,opengl-es,android-ndk,tegra,Android,Opengl Es,Android Ndk,Tegra,设pa为(0.5,y)处的点,pb为(5.5,y)处的点。如果我们画一条从pa到pb的线段,我们在x轴上得到一个5像素的线段。问题是这些像素到底在哪里 根据报告: 当pa和pb位于碎片中心时,碎片的这种表征简化为Bresenham的算法,只需一个修改:在该描述中产生的线是“半开放的”,这意味着最终碎片(对应于pb)没有绘制 如果我们从pa到pb画一段,我们得到像素1到5(x坐标)。pa位于第一个像素的中心,pb位于第六个像素的中心。如果我们从pb到pa,我们得到2到6。这就是我使用iPhone4

设pa为(0.5,y)处的点,pb为(5.5,y)处的点。如果我们画一条从pa到pb的线段,我们在x轴上得到一个5像素的线段。问题是这些像素到底在哪里

根据报告:

当pa和pb位于碎片中心时,碎片的这种表征简化为Bresenham的算法,只需一个修改:在该描述中产生的线是“半开放的”,这意味着最终碎片(对应于pb)没有绘制

如果我们从pa到pb画一段,我们得到像素1到5(x坐标)。pa位于第一个像素的中心,pb位于第六个像素的中心。如果我们从pb到pa,我们得到2到6。这就是我使用iPhone4S的结果。但在Android(Nexus7和emulator)上,结果总是1比5(方向不重要)。图形代码完全相同(使用NDK)

所以问题是哪种行为是正确的?我应该使用什么变通方法才能在两个系统上获得相同的结果

编辑

在Mac OS上,如果您运行以下代码(使用simple
NSOpenGLView
子类):

您将得到以下结果:

所以这是预期的结果。似乎Nexus7对规范有不同的解释,或者我可能需要启用一些特殊设置

编辑2:

我的仿真器不适合屏幕,它正在重新缩放屏幕输出,这造成了一种错觉,即仿真器与设备存在相同的问题。通过DDMS截图后,很明显emulator产生了预期的结果:

但该装置正在产生以下结果:


要复制此文件,请替换gl_code.cpp文件的内容并运行hello-gl2 ndk示例项目。

引用您链接到的规范:

因为钻石退出规则的初始和最终条件可能 难以实现其他线段光栅化算法 根据以下规则允许:

  • 在x或y窗口坐标中,算法生成的碎片坐标不得偏离超过一个单位 钻石退出规则产生的相应碎片
  • 因此,不幸的是,这似乎是一种法律偏差

    对于解决方法,我自己会尝试使用坐标,例如0.25或0.75,而不是0.5,如果它们可能在两个光栅器上产生相同的结果


    或者在开始处光栅化一行,然后查看光栅化器使用的规则,并在以后调整所有坐标以适应该规则。

    光栅化取决于最终渲染目标的大小。你能确认你在两个目标上渲染的渲染大小都是100x100吗?还有,当我在做的时候。。。你能粘贴一张你在android模拟器上得到的图片吗?@Bahbar,请查看更新的问题。这也有要在本地运行和测试的示例代码。但您尚未确认您正在实际设备上渲染到100x100渲染目标。我这样问是因为这不是一个标准的设备分辨率。@Bahabar,唯一的mac示例是100x100,移动应用程序有-w/2,w/2,-h/2,h/2正交投影。我害怕这样的答案:)所以你的建议是改变特定设备的几何体?是的,或者尝试找到一个几何体,它们可以产生相同的答案(例如,偏移量可能是0.25,而不是0.5)。您可以在运行时进行测试,这样您就不必使用所有可能的设备进行测试……我使用了不同的偏移量,但运气不好。我正在尝试绘制矩形轮廓,但我总是在拐角处缺少一个像素。通过渲染纹理,您将如何在运行时进行测试?
    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();