草庐IT

android - 帮助我为 2D 配置 OpenGL

coder 2023-12-19 原文

我正在使用 OpenGL 为 Android 编写我的第一个 2D 应用程序。我在我的 Desire 上写它,所以我的屏幕坐标在横向模式下应该是 0,0 到 799,479。我试图让 OpenGL 在世界坐标中使用这个范围。

到目前为止,该应用程序运行良好,但我不得不调整数字以使内容出现在屏幕上,我对无法理解投影矩阵之间的关系感到沮丧,以及这方面的纹理渲染。

设置投影矩阵:

gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
float size = .01f * (float) Math.tan(Math.toRadians(45.0) / 2);             
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-size, size, -size / ratio, size / ratio, 0.01f, 100.0f);
//    GLU.gluOrtho2D(gl, 0,width, 0, height);

我想在这里了解0.01f和100.0f。我用什么来描述 0,0 -> 799,479 且 z 值为零的二维世界?

此外,我不确定什么是“最好的”——使用 glFrustumF 或 GLU.gluOrtho2D 后者具有更简单的参数——只是视口(viewport)的尺寸——但我对此一无所知。 (有些站点的高度为 0,相反的方向为 0,但这没有区别。)但这不应该是 2D 使用 OpenGL 的自然选择吗?我是否必须在某处设置一些内容以对 OpenGL 说“我在 2D 中执行此操作 - 为了速度,请无视任何地方的三维空间”?

绘制我的纹理:

我正在使用 2 个带纹理的三角形绘制东西。我的 init 的相关部分(让我知道是否需要更详细地编辑我的问题)是:

gl.glMatrixMode(GL10.GL_MODELVIEW);                             
gl.glLoadIdentity();
gl.glTranslatex(nXpos, nYpos, nZoomin);         
gl.glRotatef(nRotZ, 0, 0, 1);               
gl.glScalef((float)nScaleup,(float)nScaleup, 0.0f);
...
...
gl.glVertexPointer(2, GL10.GL_FIXED, 0, mVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);      


mVertexBuffer is an IntBuffer and contains:
int  vertices[] =  
{
    -1,   -1,
    1,  -1,
    -1, 1,
    1,  1   
};

最终,我不打算必须传递 nZoomin - 我已经这样做了,因为这是我发现实际看到任何东西所需的“神奇数字”的方式!目前我需要在那里使用 -1000,数字越小,图像越小。当投影矩阵设置正确时,我是否认为必须有某种方法使 nZoomin 的值为零?

我的纹理目前是 128x128(但最终可能会变成不同的尺寸,尽管可能总是正方形)。我无法知道它们目前何时以实际尺寸显示。我希望能够为 nScaleup 传递一个值,比如 128,以便以实际大小绘制它。这与投影矩阵有关,还是我有两个不同的问题?

最佳答案

如果您在 2D 中工作,则不需要 glFrustum,只需使用 glOrtho .像这样:

void glOrthof(0, 800, 0, 480, -1, 1);

这会将原点放在左下角。如果你想要它在左上角,使用:

void glOrthof(0, 800, 480, 0, -1, 1);

对于 480 和 800,您显然应该替换 View 的实际尺寸,这样您的应用将适用于不同的屏幕尺寸和配置。

我为 z 范围传递了 -1 和 1,但这些并不重要,因为正交投影将 (x, y, z) 放在屏幕上的同一位置,无论 z 的值如何. (虽然近和远不能相等。)这是告诉 OpenGL 忽略 z 坐标的唯一方法;没有特定的“2D”模式,您的矩阵仍然是 4x4,二维顶点的 z 坐标将为 0。

请注意,您的坐标范围从 0 到 799,但实际上是从 0 到 800。原因是 OpenGL 将坐标解释为位于 像素之间,而不是 < em="">在他们身上。把它想象成一把 30 厘米的尺子:它上面有 30 个一厘米的间隔,刻度编号为 0-30。

您使用的顶点缓冲区不起作用,因为您使用的是 GL_FIXED 格式。这意味着小数点前 16 位和小数点后 16 位,因此要在原点周围指定一个 2x2 正方形,您需要将每个值乘以 0x10000:

int vertices[] =  
{
    -0x10000, -0x10000,
     0x10000, -0x10000,
    -0x10000,  0x10000,
     0x10000,  0x10000
};

这可能就是您如此需要对其进行扩展的原因。如果你使用这个数组,没有缩放,你应该得到一个 2x2 像素的正方形。将其变成 1x1 正方形,以便可以通过比例因子直接控制大小,留给读者作为练习;)

关于android - 帮助我为 2D 配置 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914921/

有关android - 帮助我为 2D 配置 OpenGL的更多相关文章

  1. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  4. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  7. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  8. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  9. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  10. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

随机推荐