【问题标题】:Assimp loads vertices, but model is not getting displayedAssimp 加载顶点,但模型未显示
【发布时间】:2019-11-02 05:48:27
【问题描述】:

IDE: xcode

系统: MacOS

我想要做什么

我的project [repo] 正处于我成功完成skybox [tutorial link] 工作的地步,但我正在努力处理assimp's model loading [tutorial link]

问题

我没有收到任何错误。模型只是没有加载到窗口中,即使我在model.h [GitHub line link] 的相应行添加了cout << vertices.data() << endl; [GitHub line link],在它在main.cpp [GitHub line link] 中初始化之后,它正在打印0x106e6b000,所以模型顶点正在加载。

但是,除了背景颜色之外,窗口仍然是空的。 In the tutorial [YouTube video link with timestamp],我忠实地遵循,它正在工作。

我想要达到的目标:

我正在尝试渲染模型nanosuit.obj,它被证明是红色的。ourModel.Draw( shader );应该绘制它,但没有或它没有被显示。 出于某种原因,它没有显示,尽管没有找不到数据或触发异常的错误。

我很想提供一个 MCVE,但它的代码非常相互关联,因此是 GitHub 链接。

据我所知,这应该绘制模型,除非它抱怨。

// Draw the loaded model
        glm::mat4 model;
        model = glm::translate( model, glm::vec3( 0.0f, -1.75f, 0.0f ) ); // Translate it down a bit so it's at the center of the scene
        model = glm::scale( model, glm::vec3( 0.2f, 0.2f, 0.2f ) ); // It's a bit too big for our scene, so scale it down
        glUniformMatrix4fv( glGetUniformLocation( shader.Program, "model" ), 1, GL_FALSE, glm::value_ptr( model ) );
        ourModel.Draw( shader );

我尝试过的东西:

  • 旋转相机以检查模型是否在我的 FOV 之外渲染
  • 玩转缩放
  • 加载其他.objs
  • 打印正在传递的变量,只是看到确实正在加载模型,只是没有显示

我试图不编码转储,因此行链接。如果您想要代码 sn-ps,请随时告诉我。至于为什么会这样,我有点迷失了。

编辑:

@Botje 建议我尝试以下方法:

  1. modelLoading.frag [repo, line link] 应用红色而不是纹理,以尽量减少模型纹理出现问题的风险。无效。仍然没有模型。
     void main( )
        {
            //color = vec4( texture( texture_diffuse, TexCoords ));
            color = vec4( 1.0f, 0.0f, 0.0f, 1.0f);
        }
  1. model.h 中,编辑cout << vertices.size() << endl; [repo, line link] 打印,这对于教程中的nanosuit.obj 模型是正确的。我在那里有一颗行星,这不是教程的一部分,因此之前的0x106e6b000。我现在得到vertices.size()

156 15222 19350 78 6804 7248 8316

所以模型肯定在加载,只是没有渲染。问题一定是在模型加载之后渲染之前的某个地方。

【问题讨论】:

  • 我不会依赖 vertices.data() 为空数组的 NULL。最好检查.size()
  • 要尽可能多地排除其他因素,首先要修改片段着色器以分配平面颜色,而不是从纹理中读取。 color = vec4( 1.0f, 0.0f, 0.0f, 1.0f); 如果这会在屏幕上产生红色形状,我认为您的问题可能在于您的片段着色器链接:modelLoading.frag 需要 texture_diffuse 而 Mesh.h 第 87 行分配 texture_diffuse1(请参见那里的“+ 号” .)
  • @Botje 对问题进行了编辑。我应用了这两个建议,但到目前为止,窗口中没有显示任何内容。我还把教程中的“nanosuit.obj”扔了回去,它由多个部分组成。你可以在 repos res/models 中看到它。还是什么都没有。

标签: c++ opengl glfw assimp


【解决方案1】:

知道了。模型从未初始化。该教程是 2018 年之前的,当时 GLM 不再自动初始化。

在我发布的 sn-p 中是错误。

应该是这样的:

// Draw the loaded model
glm::mat4 model = glm::mat4(1.0f); 

代替:

// Draw the loaded model
glm::mat4 model;

发生了什么?

我的 GLM 版本是 0.9.9.3,而教程肯定是 0.9.9.0 之前的版本,他们更改了它。

注意,很多教程都使用此代码。

I worked with 没有change it either

您可以通过在 xcode 中单击项目来检查您的 GLM 版本 您的文件浏览器,在目标列表中选择应用程序,然后

构建设置 > 搜索路径 > 标题搜索路径

双击打开列表。

【讨论】:

  • 不,GLM 用于默认初始化向量和矩阵。 They stopped in min-2018 with 0.9.9.0: "移除默认初始化,使用GLM_FORCE_CTOR_INIT 恢复旧行为"
  • @genpfault 我现在看到了一个模型。我看不到没有这个的模型。为了让它自动加载,我需要改变什么?更高的 GLM 版本?当前版本为 0.9.9.3(根据标头搜索路径 /usr/local/Cellar/glm/0.9.9.3/include/)。
  • 我指的是“本教程只是垃圾,因为不这样做。”声明:当教程编写/最后更新时,GLM 将默认初始化事物。如果您根据 2018 年之前的 GLM 构建本教程,我怀疑它仍然可以工作。
  • Ooooooh 我很抱歉,是的,你完全正确。他们回到显式初始化。编辑了我的答案。谢谢你的历史课!
  • 我有同样的问题,但我已经有这个代码,这不是问题
猜你喜欢
  • 2016-12-26
  • 2013-03-27
  • 2013-11-19
  • 2021-07-17
  • 2020-05-07
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多