Ios 不使用LibGDX就可以从RoboVM访问OpenGL ES吗?

Ios 不使用LibGDX就可以从RoboVM访问OpenGL ES吗?,ios,opengl-es,robovm,Ios,Opengl Es,Robovm,是否可以从RoboVM访问iOS上的OpenGL ES而不使用LibGDX?如果有,有什么有用的参考资料吗 我能找到的唯一一件事就是两年前的这个超级简单的演示: 但除了glClearColor和glClear之外,它不提供任何功能 不过,Apple GLKit框架似乎已经实现。我只是找不到所有实际的GLWHERCH(…)函数…是的,这是可能的。你需要两样东西:1。访问OpenGL ES函数(如glClear(…)等)和2。在应用程序中,可以绘制GL图像的 第二点很简单。如果您怀旧,可以使用(需要

是否可以从RoboVM访问iOS上的OpenGL ES而不使用LibGDX?如果有,有什么有用的参考资料吗

我能找到的唯一一件事就是两年前的这个超级简单的演示:

但除了glClearColor和glClear之外,它不提供任何功能


不过,Apple GLKit框架似乎已经实现。我只是找不到所有实际的GLWHERCH(…)函数…

是的,这是可能的。你需要两样东西:1。访问OpenGL ES函数(如
glClear(…)
等)和2。在应用程序中,可以绘制GL图像的

第二点很简单。如果您怀旧,可以使用(需要iOS 5.0)或(需要iOS 2.0)。对于这两种语言,在线上有大量关于如何在Objective-C中使用它们的教程,可以很容易地翻译成RoboVM。所以,我不会在这一点上花费太多时间

访问OpenGL ES函数有点困难,因为RoboVM没有附带开箱即用的定义文件。因此,我们将不得不建立我们自己的使用。事实证明,一旦你了解了Bro是如何处理C字符串、变量指针、IntBuffers等等(这实际上非常漂亮!),你就会非常明白了。我在原始问题中链接的超级简单演示是正确的起点

为了简洁起见,让我在这里发布我编写的文件的一个非常简短的版本,以说明不同数据类型的处理方式:

import java.nio.Buffer;
import java.nio.IntBuffer;

import org.robovm.rt.bro.Bro;
import org.robovm.rt.bro.Struct;
import org.robovm.rt.bro.annotation.Bridge;
import org.robovm.rt.bro.annotation.Library;
import org.robovm.rt.bro.ptr.BytePtr;
import org.robovm.rt.bro.ptr.BytePtr.BytePtrPtr;
import org.robovm.rt.bro.ptr.IntPtr;

@Library("OpenGLES")
public class GLES20 {

    public static final int GL_DEPTH_BUFFER_BIT = 0x00000100;
    public static final int GL_STENCIL_BUFFER_BIT = 0x00000400;
    public static final int GL_COLOR_BUFFER_BIT = 0x00004000;
    public static final int GL_FALSE = 0;
    public static final int GL_TRUE = 1;

    private static final int MAX_INFO_LOG_LENGTH = 10*1024;

    private static final ThreadLocal<IntPtr> SINGLE_VALUE =
        new ThreadLocal<IntPtr>() {
            @Override
            protected IntPtr initialValue() {
                return Struct.allocate(IntPtr.class, 1);
            }
        };

    private static final ThreadLocal<BytePtr> INFO_LOG =
        new ThreadLocal<BytePtr>() {
            @Override
            protected BytePtr initialValue() {
                return Struct.allocate(BytePtr.class, MAX_INFO_LOG_LENGTH);
            }
        };

    static {
        Bro.bind(GLES20.class);
    }

    @Bridge
    public static native void glClearColor(float red, float green, float blue, float alpha);

    @Bridge
    public static native void glClear(int mask);

    @Bridge
    public static native void glGetIntegerv(int pname, IntPtr params);

    // DO NOT CALL THE NEXT METHOD WITH A pname THAT RETURNS MORE THAN ONE VALUE!!!
    public static int glGetIntegerv(int pname) {
        IntPtr params = SINGLE_VALUE.get();
        glGetIntegerv(pname, params);
        return params.get();
    }

    @Bridge
    private static native int glGetUniformLocation(int program, BytePtr name);

    public static int glGetUniformLocation(int program, String name) {
        return glGetUniformLocation(program, BytePtr.toBytePtrAsciiZ(name));
    }

    @Bridge
    public static native int glGenFramebuffers(int n, IntPtr framebuffers);

    public static int glGenFramebuffer() {
        IntPtr framebuffers = SINGLE_VALUE.get();
        glGenFramebuffers(1, framebuffers);
        return framebuffers.get();
    }

    @Bridge
    private static native void glShaderSource(int shader, int count, BytePtrPtr string, IntPtr length);

    public static void glShaderSource(int shader, String code) {
        glShaderSource(shader, 1, new BytePtrPtr().set(BytePtr.toBytePtrAsciiZ(code)), null);
    }

    @Bridge
    private static native void glGetShaderInfoLog(int shader, int maxLength, IntPtr length, BytePtr infoLog);

    public static String glGetShaderInfoLog(int shader) {
        BytePtr infoLog = INFO_LOG.get(); 
        glGetShaderInfoLog(shader, MAX_INFO_LOG_LENGTH, null, infoLog);
        return infoLog.toStringAsciiZ();
    }

    @Bridge
    public static native void glGetShaderPrecisionFormat(int shaderType, int precisionType, IntBuffer range, IntBuffer precision);

    @Bridge
    public static native void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer data);

    @Bridge
    private static native void glVertexAttribPointer(int index, int size, int type, int normalized, int stride, Buffer pointer);

    public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, Buffer pointer) {
        glVertexAttribPointer(index, size, type, normalized ? GL_TRUE : GL_FALSE, stride, pointer);
    }
}
事实证明,Bro非常聪明,您甚至不需要再像使用libGDX那样在robovm.xml中包含
OpenGLES
标记

你知道什么我的应用程序的启动速度大约是使用libGDX时的3倍。它解决了我遇到的另一个问题(参见)。“耶!”为了摆脱不必要的行李


有一件事让生活有点烦人,那就是如果你搞乱了一个方法的调用签名或内存分配,你的应用程序就会因为一个毫无帮助的“由于信号11而终止”而崩溃IDE控制台中的消息,其中不包含应用程序死亡的信息。

这个答案可能需要更新,因为OpenGL在iOS 13+中不再直接受支持。@Abion47考虑到RoboVM在这一点上几乎已经死亡(谢谢,M$!),整个线程已经过时了。RoboVM本身被吃掉并扔到一边,但是开源的fork-MobiVM仍然是活跃的。这条线索可能还有些关联。@Abion47这是个好消息!当他们杀了它时,我真的很沮丧!我一定要看看MobiVM!非常感谢。
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);