无法让纹理在 Common Lisp 的 OpenGL 中工作

问题描述

我正在构建一个 simple Solar system model 并尝试在一些球体上设置纹理。

几何体已正确生成,我尝试了几种不同的方法生成纹理坐标。目前我依靠 glu:quadric-texture调用 glu:sphere生成坐标。

然而,纹理永远不会出现 - 对象以单色渲染。

我浏览了几个 OpenGL 指南,我认为我没有遗漏任何一步,但谁知道呢。

大致情况如下:

  • 调用 gl:enable :texture-2d 打开纹理
  • 使用 cl-jpeg 加载图像
  • 调用gl:bind-texture
  • 使用 gl:tex-image-2d
  • 从图像复制数据
  • 使用 gl:gen-textures 生成纹理 ID。还尝试过一个一个生成 ID,而不是一次生成所有 ID,但没有效果
  • 在绘制过程中创建新的二次曲面,启用纹理坐标生成并在生成二次曲面点之前绑定纹理:
    (let ((q (glu:new-quadric)))
      (if (planet-state-texture-id ps)
          (progn (gl:enable :texture-gen-s)
                 (gl:enable :texture-gen-t)
                 (glu:quadric-texture q :true)
                 (gl:bind-texture :texture-2d planet-texture-id)))
        (glu:quadric-texture q :false))
      (glu:sphere q
                  planet-diameter
                  *sphere-resolution*
                  *sphere-resolution*)

我也尝试了更手动的纹理坐标生成方法,没有效果

这里没有想法......

当程序运行时,我可以看到纹理被加载并且纹理ID被保留,它打印

loading texture from textures/2k_neptune.jpg with id 1919249769
Loaded data. Image dimensions: 1024x2048

解决方法

我不知道您是否找到了解决问题的方法,但是在创建了测试图像并修改了您的一些代码之后,我能够将纹理应用于球体。

问题在于您在启用纹理之前尝试将其上传到 GPU。 (gl:enable :texture-2d) 在您开始处理纹理/图像数据之前必须被调用。 我建议将 let* 块与位于“setup-gl”之后的 main 函数中的 Planets-init 一起放置,并将“format”函数与行星数据一起移动以使其正常工作而不会出现错误。
我的建议是这样的:

(let ((camera ...
   ...
  (setup-gl ...)
  (let* ((planets...
    ...
    (format ... planet-state)

在您的 draw-planet 函数中,您需要在其末尾添加 (gl:bind-texture :texture-2d 0),以便纹理不会用于其他对象,例如轨道路径。
照原样, (gl:quadratic-texture ...) 之前的 (gl:color 1.0 ...) 将修改渲染对象的颜色,因此它可能看起来不像您期望的那样。

编辑:我应该澄清这一点,但正如你的代码一样

initialize-planets > make-textures > enable-textures > render

什么时候该

enable-textures > init-planets > make-textures > render

您没有遗漏一个步骤是正确的,您代码中的步骤只是顺序错误。