【发布时间】:2012-12-06 14:02:16
【问题描述】:
设 pa 为 (0.5, y) 处的一个点,pb 在 (5.5, y)。如果我们从 pa 到 pb 画一条线段,我们会在 上得到一个 5 像素的线段x 轴。问题是这些像素到底在哪里?
根据OpenGL ES 2.0 specification 3.4.1:
当 pa 和 pb 位于片段中心时,片段的这种表征简化为 Bresenham 算法有一个修改:在这个描述中产生的线是“半开的”,这意味着最终的片段(对应于pb)没有被绘制。
如果我们从 pa 到 pb 画一条线段,我们会得到 1 到 5 像素(x 坐标)。 pa 位于第一个像素的中心,pb 位于第 6 个像素的中心。如果我们从 pb 到 pa 我们得到 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