2

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

根据OpenGL ES 2.0 规范 3.4.1

p ap b位于片段中心时,片段的这种表征通过一个修改简化为 Bresenham 算法:在此描述中产生的线是“半开的”,这意味着最终片段(对应于p b)未绘制。

如果我们从p ap b画一段,我们得到像素 1 到 5(x坐标)。p a位于第一个像素的中心,p b位于第 6 个像素的中心。如果我们从p bp 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 截屏后,很明显模拟器产生了预期的结果:模拟器

但设备正在产生以下结果:关系_7

要重现此问题,请将 gl_code.cpp 文件的内容替换为以下代码并运行hello-gl2 ndk 示例项目。

4

1 回答 1

2

Quoth 您链接到的规范:

由于菱形退出规则的初始和最终条件可能难以实现,因此允许使用其他线段光栅化算法,但须遵守以下规则:

  1. 该算法生成的片段的坐标在 x 或 y 窗口坐标中与菱形退出规则生成的相应片段的偏差不得超过一个单位。

因此,不幸的是,这似乎是一种法律偏差。

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

或者在开始时对单行进行栅格化,然后查看您的栅格器使用的是哪个规则,然后再调整所有坐标。

于 2012-12-09T14:39:12.267 回答