android - 在 opengl 中,如何获得像素与 gl.gltranslatef(floatx,y,z) 之间的关系?

标签 android opengl-es

我正在尝试在 Android 上学习 opengl 的东西。在 gl.gltranslatef(x,y,z) 调用中,我将我的纹理在 +ve x 方向上移动了一些单位。但是我找不到1个单位的x属于多少个像素?

这是我正在做的: 我调用 gl.glviewport(0,0,width,height);//这会将我的矩形设置为 0,0 作为左下角,然后扩展它以适应宽度和高度。

然后 我调用 gl.glfrustrum(-5,5,-7,7,3,7);//我有点困惑这个调用是如何使用我在 gl.glviewport 中设置的尺寸的。

如何将上述调用中从左到右的 -5 到 5 个单位转换为 android 屏幕上的像素?

我的意思是如果 width = 320 和 height = 533 像素,那么由于 gl.glfrustrum 调用在屏幕上占用的像素数是多少?

我通过将 xshift 指定为 5.0 在 gl.gltranslatef 调用中进行试验,但它不会转换屏幕右角或左角的位图,当我将它增加到 6 时,它的一部分仍然可见屏幕。

谢谢 西德赫什

简而言之,我正在搜索代表我的 Android 手机屏幕极端角落的最大单位数(以 X 为单位)。

最佳答案

glViewpoint 告诉它应该在哪个矩形(以像素为单位)中显示 OpenGL 输出。

glFrustum 告诉它应该将“世界”单位中的哪些坐标映射到该视口(viewport)。

重要的一点:您的 glFrustum 调用不仅包括高度和宽度,还包括深度。由于您指定的是视锥体,而不是立方体,这意味着除了视锥体最前面之外的任何具有 Z 坐标的任何东西都将根据其与观察者的距离适当缩小。

因此,当您访问 glTranslatef 时,特定对象移动的距离(以像素为单位)将取决于它与观察者的距离。它离观察者越远,特定的横向或向上/向下将转化为越少的像素。

根据您正在做的其他事情,处理此问题的一种简单方法可能是使用 glOrtho 而不是 glFrustumglOrtho 提供正交模式,这意味着不进行透视缩放,因此给定的 X 或 Y 距离将转换为相同数量的像素,无论与观察者的距离如何。

关于android - 在 opengl 中,如何获得像素与 gl.gltranslatef(floatx,y,z) 之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794281/

相关文章:

java - 向位图添加虚线边框

java - 将整数转换为整数数组或二进制

java - 使用对象动画制作器对按钮进行动画处理

opengl-es - opengl-es如何绘制纹理圆?

android - Android 设备上的 OpenGL ES 2.0 扩展

android - 如何在opengl android中绘制图像

iphone - 性能 : Quartz2D vs OpenGL ES (GLKit)

android - java.lang.SecurityException - 不允许启动 Activity Intent { flg=0x4000000 cmp=[MY_ACTIVITY] (has extras) }

android - 在运行时构建一个 9 patch drawable

android - 在 Android NDK 中使用 GL_EXT_color_buffer_half_float