Android上的OpenGL线段光栅化
设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上,如果您运行以下代码(使用simpleAndroid上的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
NSOpenGLView
子类):
您将得到以下结果:
所以这是预期的结果。似乎Nexus7对规范有不同的解释,或者我可能需要启用一些特殊设置
编辑2:
我的仿真器不适合屏幕,它正在重新缩放屏幕输出,这造成了一种错觉,即仿真器与设备存在相同的问题。通过DDMS截图后,很明显emulator产生了预期的结果:
但该装置正在产生以下结果:
要复制此文件,请替换gl_code.cpp文件的内容并运行hello-gl2 ndk示例项目。引用您链接到的规范: 因为钻石退出规则的初始和最终条件可能 难以实现其他线段光栅化算法 根据以下规则允许:
或者在开始处光栅化一行,然后查看光栅化器使用的规则,并在以后调整所有坐标以适应该规则。光栅化取决于最终渲染目标的大小。你能确认你在两个目标上渲染的渲染大小都是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();