Home Forums Games202-高质量实时渲染 作业0 结果不稳定,有时模型显示不全

Tagged: 

Viewing 11 reply threads
  • Author
    Posts
    • #11147 Score: 0
      刀客塔
      Participant
      3 pts

      我这里作业0 有的时候只会显示202和光源,不会显示模型(如图)。有的时候显示正常模型。
      每次刷新有一定概率正常,一定概率不正常,大概三七开,只显示202的时候多一些。
      我在 Windows 和 Mac 上都尝试过,都是这样的。
      有人遇到过类似的问题吗?

      这样的话怕之后出错不知道是代码有问题还是随机的浏览器问题。

      Attachments:
      You must be logged in to view attached files.
    • #11153 Score: 0
      xiexuefeng
      Participant

      +1,不知道是啥问题,反正只能看到202和光源(我是Mac + Chrome/Safari);不过我自己用Three.js(npm包)加载就好了;

    • #11180 Score: 0
      爱登堡
      Participant

      我也遇到一样的问题,用官方的three.js,直接替换项目中的three.js,然后就会出现其他问题。

    • #11200 Score: 0
      Misaka Mahiru
      Participant

      踢踢lz,找到解决方案了嘛Orz

    • #11201 Score: 1
      刀客塔
      Participant
      3 pts

      暂时有了一个折衷的解决办法(这很图形学)。因为这个事情可以通过刷新解决,所以我只要想办法知道是模型加载出了问题,还是我写的代码有问题即可。如果代码没问题,那么多刷新几次就可以了。

      那怎么样知道是不是模型加载出了问题呢?我看了一下 three.js 的 OBJLoader 的文档,发现作业0中的 onError 函数实现的有问题,将至改成

      function onError(err) {
      console.error( ‘An error happened:’ , err);
      }

      即可。

      在渲染时打开 Console,如果有 err 就是模型加载的问题,如果没有 err,应该就是预期的结果了。

      这个 err 我也具体看了一下,是 material 的 img 没有加载出。但具体为什么没有加载出,还没有研究出来。图形学新手。

      This post has received 1 vote up.
      • This reply was modified 2 years ago by 刀客塔.
      • #11203 Score: 0
        Misaka Mahiru
        Participant

        根据大佬方法,onError函数正常报错了。但是也没有研究出来为什么会有TypeError: Failed to execute ‘texImage2D’ on ‘WebGLRenderingContext’: Overload resolution failed.这个错误。
        不过大佬是怎么刷新出来的呢?我用的win10+edge+vs环境,一直只能看到光源和202.换了chrome直接两眼一黑只有UI了。。

        • #11204 Score: 0
          刀客塔
          Participant
          3 pts

          差不多,不过我是用的 Chrome。两眼一黑只有UI还有一个可能性是 three.js 没下载下来,因为这个是从 cloudflare 上下载的,需要挂代理。

          刷新就是CTRL+R多按几次……

          • #11205 Score: 0
            Misaka Mahiru
            Participant

            谢谢!挂梯子+刷新好几次终于出来了。。那我也不去管那些报错了Orz

    • #11207 Score: 0
      刀客塔
      Participant
      3 pts

      芭比Q了,作业1我刷了好久也没刷出来……
      看来没办法是要学习一下 three.js 了……

    • #11218 Score: 2
      刀客塔
      Participant
      3 pts

      研究了一下,知道了为什么会刷不出来模型,从原理上讲,应该大部分人都刷不出来才对。

      loadOBJ.js 中,materials.preload(); 其实是一个异步方法,这个方法会去 load mtl文件,image 文件的路径也在其内,然而在这步方法之后紧接着就去 load object 并且使用了 mtl 文件中的 image,因为前一步是异步的,这个时候 material 其实还没有load 完成,导致了 object load 时的报错。

      如果使用 Promise 方法可能会比较优雅,不过代码改动量比较大。我也是JS小白。

      一个比较 tricky 的方法就是在 load object 的前等一等,最后这段代码如图所示,我用一个函数wrap了一下load object 的过程,然后使用 setTimeout 等了100ms。

      This post has received 2 votes up.
      Attachments:
      You must be logged in to view attached files.
    • #11301 Score: 1
      loong
      Participant
      1 pt

      加载不稳定原因楼上说的挺清楚了,可以在index.html中<head>中最上面(21行)加<link rel=”preload” href=”/assets/mary/MC003_Kozakura_Mari.png” as=”image” type=”image/png” crossorigin/>让材质图片预先加载

      This post has received 1 vote up.
      • #11337 Score: 0
        鲤鱼王
        Participant

        如果提示请使用有效的as值,或者不支持的type值,可以删掉type属性

      • #16928 Score: 0
        Pattiiii
        Participant

        谢谢楼主
        如果是用下载的工程目录的话,路径是”assets/mary/MC003_Kozakura_Mari.png”,把asset前面那一杠去掉,就不会报错了~而且可以稳定显示

    • #11324 Score: 0
      雅各布
      Participant

      预加载的方案比较优雅,实操有效,谢谢了。

    • #11620 Score: 0
      limil
      Participant

      非常感谢,预加载有用

    • #11928 Score: 0
      愿我能
      Participant

      预加载有用,也感谢楼主的分析

    • #16877 Score: 0
      xianlong
      Participant

      亲测可以用,只不过需要将代码中的中文 ” 换成 英文的 ”

      <link rel=”preload” href=”/assets/mary/MC003_Kozakura_Mari.png” as=”image” type=”image/png” crossorigin/>

      忽略,原来是评论中的标点会显示成中文的

      • This reply was modified 8 months, 3 weeks ago by xianlong.
Viewing 11 reply threads
  • You must be logged in to reply to this topic.