【问题标题】:Is there a Clojure wrapper for (modern) OpenGL?(现代)OpenGL 是否有 Clojure 包装器?
【发布时间】:2012-10-18 14:49:57
【问题描述】:

我发现的唯一东西是Penumbra,它似乎封装了 OpenGL 1.1,我一点也不关心。它真的不需要做任何花哨的事情,在一个命名空间中公开 OpenGL 3.3/core 或 OpenGL 4.x/core 的 LWJGL 包装器就足够了 - 我不介意更多惯用包装器,只要它不执行任何即时模式绘图并支持 GLSL 3.3,我基本上很高兴。

【问题讨论】:

  • 我想知道,仅仅因为 Penumbra 支持即时模式,为什么这意味着你不能扩展它来做你想做的事?
  • 它不“支持”即时模式。它完全围绕它构建。 “扩展”它来做我想做的事情与自己写整个事情是一样的。顺便说一句,我现在正在这样做。在“只给我 OpenGL 作为 clojure 函数而不特别考虑惯用语”的那种薄薄的方式中。
  • @Cubic 你有包装器的链接吗?我也打算这样做,但如果你已经拥有它,那么避免重复工作会很棒!

标签: opengl clojure lwjgl


【解决方案1】:

遗憾的是,除了 Penumbra 之外别无他物。我也很想拥有这个......我想知道我们是否可以筹集资金来资助 Zach Tellman 进行这项工作?!

【讨论】:

    【解决方案2】:

    你检查过 Quil 吗?它是 Clojure 的处理,也适用于 OpenGL。

    https://github.com/quil/quil

    【讨论】:

    • 对处理不是很感兴趣,我理解它的方式也是使用 FF 管道。
    • Quil 使用 Processing 和 Processing 使用 JOGL 来支持硬件加速 3D 渲染。
    • 处理和它的衍生项目是错误的噩梦。我不建议在其中做任何严肃的事情。
    【解决方案3】:

    Opengl 直接处理对 gpu 的调用,所以我认为不可能获得任何远程惯用的 clojure。

    就个人而言,我一直在 clojure 代码中使用 JOGL (https://jogamp.org/jogl/www/) 调用。

    到目前为止,我对表演感觉还不错。


    ****** 刚刚注意到阿卡迪亚的存在,看起来很棒: https://github.com/arcadia-unity/Arcadia

    【讨论】:

    • 当我说 惯用 时,我并不是指功能性。我更多地谈论的是语法糖,以使处理这些函数更加自然。
    • 在我看来,阿卡迪亚已经死了。由于 Unix 文件路径,它在 Windows 上也不起作用。在 Linux 上,Unity 编辑器需要 32 位 gcc,我敢肯定这是不可接受的。我没有在 Mac 上尝试过,但我认为这是您唯一的选择,而且仍然是使用看似已死的项目。 (很遗憾,我很兴奋,我对 Unity3D 和 Clojure 非常感兴趣。UE4 也是如此,但这可能太牵强了:P)。
    • Arcadia 作为一个项目远未消亡。只需查看 github 存储库即可显示稳定且一致的进展。查看 twitter 提要,很明显 Unity 5.5 + Mono 4.9 测试版的开发是活跃和持续的,以及移动应用程序打包。查看 Gitter 频道可以发现,一些开发人员实际上是在将 Arcadia 用于项目,而不仅仅是原型设计。
    【解决方案4】:

    您可以使用 Java 库 LWJGL version 3。还有legacy LWJGL version 2,封装比较广泛。

    这是一个使用 LWJGL 版本 2 的最小示例:

    (ns raw-opengl
      (:import [org.lwjgl BufferUtils]
               [org.lwjgl.opengl Display DisplayMode GL11 GL12 GL13 GL15 GL20 GL30]))
    
    (def vertex-source "#version 130
    in mediump vec3 point;
    in mediump vec2 texcoord;
    out mediump vec2 UV;
    void main()
    {
      gl_Position = vec4(point, 1);
      UV = texcoord;
    }")
    
    (def fragment-source "#version 130
    in mediump vec2 UV;
    out mediump vec3 fragColor;
    uniform sampler2D tex;
    void main()
    {
      fragColor = texture(tex, UV).rgb;
    }")
    
    (def vertices
      (float-array [ 0.5  0.5 0.0 1.0 1.0
                    -0.5  0.5 0.0 0.0 1.0
                    -0.5 -0.5 0.0 0.0 0.0]))
    
    (def indices
      (int-array [0 1 2]))
    
    (def pixels
      (float-array [0.0 0.0 1.0
                    0.0 1.0 0.0
                    1.0 0.0 0.0
                    1.0 1.0 1.0]))
    
    (defn make-shader [source shader-type]
      (let [shader (GL20/glCreateShader shader-type)]
        (GL20/glShaderSource shader source)
        (GL20/glCompileShader shader)
        (if (zero? (GL20/glGetShaderi shader GL20/GL_COMPILE_STATUS))
          (throw (Exception. (GL20/glGetShaderInfoLog shader 1024))))
        shader))
    
    (defn make-program [vertex-shader fragment-shader]
      (let [program (GL20/glCreateProgram)]
        (GL20/glAttachShader program vertex-shader)
        (GL20/glAttachShader program fragment-shader)
        (GL20/glLinkProgram program)
        (if (zero? (GL20/glGetShaderi program GL20/GL_LINK_STATUS))
          (throw (Exception. (GL20/glGetShaderInfoLog program 1024))))
        program))
    
    (defmacro def-make-buffer [method create-buffer]
      `(defn ~method [data#]
         (let [buffer# (~create-buffer (count data#))]
           (.put buffer# data#)
           (.flip buffer#)
           buffer#)))
    
    (def-make-buffer make-float-buffer BufferUtils/createFloatBuffer)
    (def-make-buffer make-int-buffer BufferUtils/createIntBuffer)
    
    (Display/setTitle "mini")
    (Display/setDisplayMode (DisplayMode. 320 240))
    (Display/create)
    
    (def vertex-shader (make-shader vertex-source GL20/GL_VERTEX_SHADER))
    (def fragment-shader (make-shader fragment-source GL20/GL_FRAGMENT_SHADER))
    (def program (make-program vertex-shader fragment-shader))
    
    (def vao (GL30/glGenVertexArrays))
    (GL30/glBindVertexArray vao)
    
    (def vbo (GL15/glGenBuffers))
    (GL15/glBindBuffer GL15/GL_ARRAY_BUFFER vbo)
    (def vertices-buffer (make-float-buffer vertices))
    (GL15/glBufferData GL15/GL_ARRAY_BUFFER vertices-buffer GL15/GL_STATIC_DRAW)
    
    (def idx (GL15/glGenBuffers))
    (GL15/glBindBuffer GL15/GL_ELEMENT_ARRAY_BUFFER idx)
    (def indices-buffer (make-int-buffer indices))
    (GL15/glBufferData GL15/GL_ELEMENT_ARRAY_BUFFER indices-buffer GL15/GL_STATIC_DRAW)
    
    (GL20/glVertexAttribPointer (GL20/glGetAttribLocation program "point"   ) 3 GL11/GL_FLOAT false (* 5 Float/BYTES) (* 0 Float/BYTES))
    (GL20/glVertexAttribPointer (GL20/glGetAttribLocation program "texcoord") 2 GL11/GL_FLOAT false (* 5 Float/BYTES) (* 3 Float/BYTES))
    (GL20/glEnableVertexAttribArray 0)
    (GL20/glEnableVertexAttribArray 1)
    
    (GL20/glUseProgram program)
    
    (def tex (GL11/glGenTextures))
    (GL13/glActiveTexture GL13/GL_TEXTURE0)
    (GL11/glBindTexture GL11/GL_TEXTURE_2D tex)
    (GL20/glUniform1i (GL20/glGetUniformLocation program "tex") 0)
    (def pixel-buffer (make-float-buffer pixels))
    (GL11/glTexImage2D GL11/GL_TEXTURE_2D 0 GL11/GL_RGB 2 2 0 GL12/GL_BGR GL11/GL_FLOAT pixel-buffer)
    (GL11/glTexParameteri GL11/GL_TEXTURE_2D GL11/GL_TEXTURE_WRAP_S GL11/GL_REPEAT)
    (GL11/glTexParameteri GL11/GL_TEXTURE_2D GL11/GL_TEXTURE_MIN_FILTER GL11/GL_NEAREST)
    (GL11/glTexParameteri GL11/GL_TEXTURE_2D GL11/GL_TEXTURE_MAG_FILTER GL11/GL_NEAREST)
    (GL30/glGenerateMipmap GL11/GL_TEXTURE_2D)
    
    (GL11/glEnable GL11/GL_DEPTH_TEST)
    
    (while (not (Display/isCloseRequested))
      (GL11/glClearColor 0.0 0.0 0.0 0.0)
      (GL11/glClear (bit-or GL11/GL_COLOR_BUFFER_BIT GL11/GL_DEPTH_BUFFER_BIT))
      (GL11/glDrawElements GL11/GL_TRIANGLES 3 GL11/GL_UNSIGNED_INT 0)
      (Display/update)
      (Thread/sleep 40))
    
    (GL20/glDisableVertexAttribArray 1)
    (GL20/glDisableVertexAttribArray 0)
    
    (GL11/glBindTexture GL11/GL_TEXTURE_2D 0)
    (GL11/glDeleteTextures tex)
    
    (GL15/glBindBuffer GL15/GL_ELEMENT_ARRAY_BUFFER 0)
    (GL15/glDeleteBuffers idx)
    
    (GL15/glBindBuffer GL15/GL_ARRAY_BUFFER 0)
    (GL15/glDeleteBuffers vbo)
    
    (GL30/glBindVertexArray 0)
    (GL30/glDeleteVertexArrays vao)
    
    (GL20/glDetachShader program vertex-shader)
    (GL20/glDetachShader program fragment-shader)
    (GL20/glDeleteProgram program)
    (GL20/glDeleteShader vertex-shader)
    (GL20/glDeleteShader fragment-shader)
    
    (Display/destroy)
    

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2015-11-04
      • 2011-06-29
      • 1970-01-01
      • 2013-02-24
      • 2012-04-29
      相关资源
      最近更新 更多