问题描述
我正在构建一个 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
您没有遗漏一个步骤是正确的,您代码中的步骤只是顺序错误。