如何在 LWJGL 中将 3D 纹理加载到我的 3D 模型上



我在Blender3D中制作了一把剑,将其导出为三角模型。OBJ格式,它还生成了一个.MTL 文件,我使用 UV 映射为模型创建纹理,并以.PNG格式导出。

如何在 LWJGL 中将剑纹理加载到我的剑模型上?

我只能找到有关如何使用立方体执行此操作的教程,但是我的游戏不是 MineCraft 的复制品,所以立方体对我来说没有用。

谁能在这里帮我?

澄清:这里要问的是,如何在 LWJGL 环境中获取与相应的 OBJ 文件一起使用的 MTL 文件,并将 MTL 材料应用于 OBJ 对象。

基本上,您可以创建类似class OBJModel的东西,然后有一个OBJModelLoader.load(final InputStream is);加载波前.obj文件并返回class OBJModel的实例。

class OBJModel中,您将有一些数组存储顶点,法线,纹理坐标,面,材质等。

加载模型

如果您不知道.obj文件中的所有这些内容是什么意思,那么您可以在维基百科上阅读所有有关它的信息,请单击此处

只是为了给出一个想法,您将如何制作OBJModel load()方法,这里有一个想法:

public final static OBJModel load(final InputStream is)
{
    final OBJModel model = new OBJModel();
    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is)))
    {
        String line;
        while ((line = br.readLine()) != null)
        {
            if (line.isEmpty() || (line.charAt(0) == '#'))
            {
                continue;
            }
            if (line.contains("#"))
            {
                line = line.substring(0, line.indexOf('#'));
            }
            line = line.trim();
            if (line.isEmpty())
            {
                continue;
            }
            if (line.startsWith("v "))
            {
                String[] xyz = line.split(" ");
                float x = Float.parseFloat(xyz[1]);
                float y = Float.parseFloat(xyz[2]);
                float z = Float.parseFloat(xyz[3]);
                model.addVertex(x, y, z);
                continue;
            }
            else if (line.startsWith("vn "))
            {
                String[] xyz = line.split(" ");
                float x = Float.parseFloat(xyz[1]);
                float y = Float.parseFloat(xyz[2]);
                float z = Float.parseFloat(xyz[3]);
                model.addNormal(x, y, z);
                continue;
            }
            else if (line.startsWith("vt "))
            {
                String[] uv = line.split(" ");
                float u = Float.parseFloat(uv[1]);
                float v = Float.parseFloat(uv[2]);
                model.addTextureCoordinate(u, v);
                continue;
            }
            else if (line.startsWith("f "))
            {

由于我这样做只是为了让您了解如何制作它,因此您必须自己完成它。

渲染模型

当您想要渲染模型时,只需像使用纹理坐标渲染顶点时一样执行

Blender提供所有正确的纹理坐标,所以你唯一需要做的就是在渲染所有顶点之前绑定纹理,然后用它们的纹理坐标。

我建议使用VAOs来存储和渲染模型,尽管这取决于您使用的OpenGL版本。如果无法使用VAOs则只需使用常规VBOs使用gl*Pointer调用,但不要使用即时模式进行渲染。

最新更新