【问题标题】:OpenGL line segment rasterisation on AndroidAndroid上的OpenGL线段光栅化
【发布时间】:2012-12-06 14:02:16
【问题描述】:

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

根据OpenGL ES 2.0 specification 3.4.1

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

如果我们从 papb 画一条线段,我们会得到 1 到 5 像素(x 坐标)。 pa 位于第一个像素的中心,pb 位于第 6 个像素的中心。如果我们从 pbpa 我们得到 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 示例项目。

【问题讨论】:

  • 光栅化取决于最终的渲染目标大小。您能否确认您在两个目标上都渲染到正好为 100x100 的渲染大小?
  • 另外,当我在做的时候...你能把你在安卓模拟器上得到的图片贴上来吗?
  • @Bahbar,请查看更新后的问题。这也有在本地运行和测试的示例代码。
  • 但您尚未确认要在实际设备上渲染到 100x100 渲染目标。我问是因为这不是标准设备分辨率。
  • @Bahabar,只有 mac 样本是 100x100,移动应用有 -w/2, w/2, -h/2, h/2 正交投影。

标签: android opengl-es android-ndk tegra


【解决方案1】:

引用您链接到的规范:

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

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

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

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

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

【讨论】:

  • 我害怕这样的回答 :) 所以你的建议是改变特定设备的几何形状?
  • 是的,或者试图找到他们会产生相同答案的几何图形(例如,0.25 而不是 0.5,因为偏移量可能会起作用)。而且您可以在运行时进行测试,因此您不必使用所有可能的设备进行测试...
  • 我玩过不同的偏移量,但没有运气。我正在尝试绘制一个矩形轮廓,并且总是在角落处丢失一个像素。您将如何在运行时通过渲染纹理进行测试?
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多