【问题标题】:Minimal OpenGL example in JavaJava中最小的OpenGL示例
【发布时间】:2016-10-07 16:47:41
【问题描述】:

作为一名 Java 开发人员,我最近有了学习 OpenGL 的想法。我完全理解,Java 不是计算机图形学的最佳语言,但由于我只想学习基础知识和概念(而不是编写 Minecraft 2),我认为它会做得很好。

我首先在 google 和 github 中搜索一些使用 JOGL(Java OpenGL)的“hello worlds”。我非常惊讶,85% 以上的“你好世界”有大约 100-500 行代码(我大多还不明白),而且几乎没有人使用 Maven/Gradle 依赖,这导致了我必须在正确设置库(包括本机)时遇到麻烦(使用 Linux,不确定这是否重要)。

我真的在寻找一些琐碎的例子,比如添加 Maven/Gradle 依赖,编写简单的 JavaFX 窗口,显示 OpenGL 球体,这样我就可以专注于 OpenGL 而不是配置所有内容。

Android 的例子很少,但我想在笔记本电脑上运行它(更容易开发)。

我错过了什么吗?我应该在哪里寻找它?

【问题讨论】:

  • “85% 的“hello world”有大约 100-500 行代码”——不幸的是,你几乎找不到更短的代码,OpenGL API 是一团糟。首先,您应该选择在移动设备上使用的 OpenGL 版本(1.x、2.x、3.x ...)或 OpenGL ES 版本(1.x、2.x、...)。现代版本广泛使用着色器。

标签: java opengl


【解决方案1】:

我完全理解,Java 并不是计算机图形学的最佳语言

嗯,这取决于,每种语言都有其优缺点。

例如,Java 允许您非常快速地运行程序,但您无法像 c/c++ 那样完全控制内存。

编译不需要时间,即使某些部分代码充满错误也可以运行。

但与一些较新的 jvm 语言(例如 kotlin、scala 或 groovy)相比,它变得有些冗长。

我首先在 google 和 github 中搜索一些使用 JOGL(Java OpenGL)的“hello worlds”。我非常惊讶,85% 以上的“hello world”有大约 100-500 行代码

嗯,那是因为渲染并不像你想象的那么简单。

但是,如果您希望核心类非常紧凑,您可以通过将繁重的手工工作委派给实用类来消除大量样板代码,并获得一个低于一百行的问候三角形。

例如在mine 的这个问候三角形中。你可以:

  • 避免在main 方法中对glWindow 进行多次默认调用

  • 将所有常量变量保存在一个静态类中

  • 避免initDebug()

  • 减半initBuffers()

  • 通过 movind initProgram() to utils 在一行中初始化你的着色器程序

几乎没有人使用 Maven/Gradle 依赖项,这导致我在设置库(包括本机)时遇到了麻烦

我感觉到你,我真的感觉到了。

正因为如此,我在 github 上创建了两个组织,一个名为 java-graphic 以保持 API 中立,另一个名为 java-opengl-labs 用于与 jogamp 相关的所有内容,以解决我们 Java 开发人员的一些主要问题和将我们所有的努力集中到一个统一的地方。

我还希望有大量可用的现代教程、工具、库等等,所有这些都在 Maven/Gradle 依赖项下,只需单击一下,我就可以设置好一切并准备好使用。

当我开始学习 OpenGL 时,情况要糟糕得多,我正在尝试改变它,但这是一项巨大的努力。

有很多事情要做:

  • 编写新的对应工具(主要是 assimp 和 bullet)
  • 改进现有代码
  • 实施 Maven/Gradle
  • 编写维基
  • 改善渠道沟通
  • ...

如果您(或正在阅读的任何人)可以贡献,请不要犹豫,非常欢迎您 :)

我真的在寻找一些琐碎的例子,比如添加 Maven/Gradle 依赖,编写简单的 JavaFX 窗口,显示 OpenGL 球体,这样我就可以专注于 OpenGL 而不是配置所有内容。

你得到的最简单的,就是我链接你的那个你好三角形。不幸的是,它还没有 Maven/Gradle 依赖,但它只依赖于纯 jogl。

Android 的例子很少,但我想在笔记本电脑上运行它(更容易开发)

由于您还提到了 Android(以前也提到过冗长的内容),所以我建议您看看 Kotlin... 我最近开始深入研究它,与 java 相比,它是一个全新的水平,我还写了一个小的hello triangle 就像一个纯粹的风格练习

【讨论】:

  • 注意:我们倾向于不鼓励在此处的问题或答案中进行投票评论 - 如果必须,请在 cmets 中添加一些内容,但大多数读者对此并不感兴趣,他们甚至不登录,让单独投票。保持简洁!
  • 在旁注中,反对票可能不会达到“仇恨”的高标准,这是一个可能为战争、种族主义等保留的强词。 Downvoting 只是一种沟通工具,表示帖子没有达到某人对质量的期望,最好不要个人认为。虽然有人可能会争辩说,对一个好的答案投反对票是不合理的,但“否决”和“好”的衡量标准都是主观的。你会发现,如果你持续发布好帖子,你得到的分数会比失去的多。
  • 我说是因为问题和每个答案都奇怪地得到了-1,没有理由,所有这些都比较快。所以我以为是同一个人。 Ps:我不会将仇恨与战争/种族主义进行比较,或者至少在这场比赛中
  • 是的,有时人们会对页面上的所有内容投反对票。令人沮丧,但在编辑中真正提及它并不能解决任何问题,除了让编辑有更多工作要做。到那时,反对者将继续前进。如果你看到是否发生了很多事情,并且你觉得你有一个解决方案可以提供,那么一定要在 Meta 上发布一个关于它的问题。
  • I'd not compare hate with war/racism, or at least in this context。这就是为什么我认为这是错误的词。我个人感到沮丧的是,这些天来,轻微的轻罪通常被称为是出于“仇恨”的动机,大概是因此肇事者可以被视为“仇恨者”(在您的情况下明确如此)。这种语言装置旨在使一个人完全超越苍白,而实际上在这种情况下的不法行为只是一件微不足道的事或令人讨厌的事,当我们仔细想想时,他们根本不可能是出于仇恨的动机。
【解决方案2】:

尝试查看 JogAmp wiki,以及包含可用源代码的演示。

JogAmp 维基:http://jogamp.org/wiki/index.php/Main_Page

JogAmp 演示:http://jogamp.org/jogl-demos/www/

我也建议阅读OpenGL Redbook,这将介绍很多核心的OpenGL概念,但是是为1.1版的OpenGL制作的,仍然是一个很好的阅读,但有些做法会过时。

最后,我推荐阅读 The OpenGL Programming Guide - 8th Edition。它基本上类似于红皮书,但适用于现代 OpenGL。 Here's亚马逊上的链接

红皮书和 OpenGL 编程指南中的代码将采用伪代码或 C/C++,但 Java 和 C/C++ 之间的概念和 API 调用都是相同的。唯一的主要区别在于窗口的创建,但这应该在 JogAmp 演示和 wiki 中介绍。

编辑:我刚刚注意到有第 9 版的 OpenGL 编程指南,您可能想阅读它,第 8 版涵盖 OpenGL 4.3,第 9 版涵盖 4.5。

很遗憾,您找不到任何简单或琐碎的示例。学习 OpenGL 是一项非常艰巨的任务,不会一蹴而就。从长远来看,学习配置库和 OpenGL API 的核心概念会对您有很大帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 2021-08-19
    • 2014-12-12
    • 1970-01-01
    • 2014-04-19
    • 2019-09-08
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多