当前位置: 首页 > 知识库问答 >
问题:

场景窗体资源不显示纹理

汤玉宸
2023-03-14

问题截图我正在用Sceneform构建一个非常简单的应用程序,目前只有一个带有sceneview的活动,我在其中添加了一个可渲染的。我想加载我在blender上创建的行星的简单模型,并将其导出为obj文件作为可渲染文件。但是,对象会加载和显示,但根本没有纹理或凹凸贴图,它只是灰色的。我需要知道我的代码有什么问题导致纹理无法加载。调试应用程序或logcat中的错误时,我没有收到任何错误消息。

当我使用一个obj文件来处理我在互联网上下载的一块岩石时,效果很好,对象会显示其纹理。然而,当我开始使用完全相同的过程来导入和显示我在blender上创建的模型时

我还通过使用可完成的未来纹理和. setFacture()方法,直接在Main Activity.java文件中向可渲染添加了纹理。(最后值得注意的是,我已经尝试导出为fbx,而有同样的问题)

MAYActivity.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
CompletableFuture<Texture> merSurFuture = Texture.builder().setSource(this, R.drawable.mercury_global_map).build();
ModelRenderable.builder().setSource(this, Uri.parse("mercuryobj.sfb") )
        .build()
        .thenAcceptBoth(merSurFuture, (renderable, texture )  -> {
            mObjRenderable = renderable;
            mObjRenderable.getMaterial().setTexture("baseColor", texture);
            SceneView sceneView = findViewById(R.id.scene_view);
            sceneView.setBackgroundColor(Color.BLACK);
            Scene scene = sceneView.getScene();

            //adding a node to the sceneview
            Node node = new Node();
            node.setParent(scene);
            node.setName("sun");
            node.setRenderable(renderable);
            node.setLocalPosition(new Vector3(0f,-0.5f,-1f));
        })
        .exceptionally(throwable -> {
            Toast toast = Toast.makeText(this, "unable to load sun", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return null;

        });

mtl文件:

`# Blender MTL File: 'Mercury.blend'
 # Material Count: 1

 newmtl Material.001
 Ns 96.078431
 Ka 1.000000 1.000000 1.000000
 Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 1
map_Bump -bm 0.000030 mercury_topo.png
map_Ks Mercury_global_map.png
map_Kd Mercury_global_map.png
map_Ka Mercury_global_map.png

`

obj文件相关行:

mtllib mercurymtl.mtl
o Mercury_Sphere
...
usemtl Material.001
s 1

sfb文件:

{
materials: [
{
  name: 'Material.001',
  parameters: [
    {
      baseColor: 'Mercury_global_map',
    },
    {
      baseColorTint: [
        0.80000000000000004,
        0.80000000000000004,
        0.80000000000000004,
        1,
      ],
    },
    {
      metallic: 0,
    },
    {
      roughness: 1,
    },
    {
      opacity: null,
    },
  ],
  source: 'build/sceneform_sdk/default_materials/obj_material.sfm',
},
],
model: {
attributes: [
  'Position',
  'Orientation',
],
collision: {},
file: 'sampledata/mercuryobj.obj',
name: 'mercuryobj',
recenter: 'root',
scale: 0.20496,
},
samplers: [
{
  file: 'sampledata\\Mercury_global_map.png',
  name: 'Mercury_global_map',
  params: {
    usage_type: 'Data',
  },
  pipeline_name: 'Mercury_global_map.png',
 },
],
version: '0.54:2',
}

我希望模型加载并显示它的纹理,就像我在网上下载的模型一样。模型实际上加载完全平滑,没有纹理。

共有3个答案

丌官炎彬
2023-03-14

请删除“\”this“/”并按ctrl键s,然后重试。。。

像这样改变:

samplers: [
   {
     file: 'sampledata/Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "Normal",},
    ],
   },
 ],
董庆
2023-03-14

有点太晚了,但文档说明纹理可能不会自动导入到资源中,在这种情况下,它们应该在sfa文件中定义

在新转换的sfa文件中,您可以在samplers数组中添加纹理(图像文件),然后在注入块中声明其用法为正常(向网格添加详细信息)

  samplers: [
   {
     file: 'sampledata\\Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "Normal",},
    ],
   },
 ],
微生博简
2023-03-14

这样做:

samplers: [
   {
     file: 'sampledata/Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "BaseColor",},
    ],
   },
 ],

并在材质参数中应用“Tex_Beagle”作为基色:)

 类似资料:
  • 我得到这个错误而导入场景形式资产。我添加了 在项目级渐变文件中,此

  • 在 Cocos Creator 3D 中,游戏场景(Scene) 是开发时组织游戏内容的中心,也是呈现给玩家所有游戏内容的载体。而场景文件本身也作为游戏资源存在,其保存了游戏的大部分信息,也是创作的基础。 创建场景 我们现在共有三种创建场景的方式: 为了您的项目具备良好的文件夹目录结构,我们强烈建议您使用 方法一 创建场景 方法一:在 资源管理器 中选中你想要创建场景文件的文件夹,在文件夹目录上

  • 我是新来的阿科雷和斯内福。我在arSceneView中有一个arObject,我想在场景中隐藏它(几秒钟)。我不想从场景中分离()锚点,只需将其隐藏,然后在几秒钟后再次显示。 我已尝试更改的参数。sfa文件,但它不起作用 或者我还缺少什么别的方法

  • 导入Sceneform资产时出现此错误:Gradle生成因新的导入规则而失败。是否要还原更改?选项是Revert和Keepbroken gradle changes。 还会弹出一个错误消息: 错误:java。RuntimeException:java。lang.NoSuchMethodError:com。Android工具。主意模板。配方接受者执行者。追加(Ljava/io/File;Ljava/

  • 我试图用opengl在Qt中显示纹理,但当我运行时它就是不显示纹理。 我做了一些研究,发现我需要将纹理的高度和宽度设为2的幂。我的纹理现在是(1024x1024)。 我还添加了很多glTexParameterf,可以解决我的问题,但仍然没有运气。 EDIT1:是不是我的质地太大了? EDIT2:glBindTexture(GL_TEXTURE_2D,m_textureID);放置在glBindTe

  • 有问题显示纹理在我的3D框在LWJGL使用光滑。早些时候我犯了一个错误: BasicShader类: BasicVertex.vs basicfragment.fs