Android上的OpenGL线段栅格化

时间:2012-12-06 14:02:17

标签: android opengl-es android-ndk tegra

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();

你得到这个结果: enter image description here

screen shot

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

编辑2:

我的模拟器不适应屏幕并且它正在重新调整屏幕输出,并且它产生了一种幻觉,即模拟器与设备具有相同的问题。通过DDMS截取屏幕截图后,很明显仿真器会产生预期的结果:emulator

但是设备产生以下结果:nexus_7

要重现此项,请替换gl_code.cpp文件with the following code的内容并运行 hello-gl2 ndk示例项目。

1 个答案:

答案 0 :(得分:2)

指定您链接的规范:

  

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

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

因此,遗憾的是,它似乎是一种法律偏差。

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

或者在开头栅格化一行并查看光栅化器使用的规则,然后稍后调整所有坐标。