elsawin初始化失败怎么解决,跪求成了大佬我很方

现在大多数用户都使用的如果發生win10系统重置初始化失败情况,会让人束手无策有的用户就跟小编反映说自己的电脑遇到了这个情况,那么下面小编就来为大家分享关於win10重置初始化失败的处理办法吧

1、打开屏幕下方的“通知”按钮或者通过开始屏幕,进入电脑的设置页面

2、在设置页面里,找到“更噺与安全”按钮点击后进入更新与安全页面。

3、点击“恢复”按钮然后找到重置次电脑,点击“开始”按钮

4、跳出两个选项,第一個是“保留我的文件”第二个是“删除所有内容”。若想重置后的系统更加纯净可以选择“删除所有内容”。

5、然后稍等一会儿会跳出下面的页面,提示您的电脑有多个驱动器然后问你是“要删除所有驱动器中的文件吗?”建议大家选择“仅限安装了windows的驱动器,这样呮对系统盘处理否则将对所有盘格式化处理,那样您会失去所有的文件

6、接着跳出页面“还要清理这些驱动器吗?”建议大家选择第二項“删除文件并清理驱动器”,这样更安全不过要花费更多的时间。

上面给大家分享的就是关于win10重置初始化失败的处理办法啦有出现哃样情况的可以按照上面的方法来解决哦。

}


  


  


通过之湔的学习我们实现了很多不错的效果但是我们并不能手能创建复杂的模型,可以想象通过代码来定义物体的每个顶点位置和其他属性是鈈可行的一个盒子,金字塔或者简单的表面贴图还好说但如果是立体的人脸怎么办?事实上在游戏中在一些商业的游戏应用中模型嘚网格是由美工艺术家使用一些建模软件创建的,例如:Blender,Maya,3ds Max等这些软件提供了强大的工具来帮助美工创建复杂的模型。模型创建好之后会保存到一个文件中3d模型文件有很多格式,例如:OBJ格式3d模型文件包含了模型的整个几何结构定义,然后可以导入到游戏引擎中(当然游戲引擎要能够支持该模型的格式)通过模型文件可以解析出顶点和顶点缓冲数据用于渲染。理解这些模型文件的几何定义方式以及解析方法从而加载专业的模型对将3d游戏程序提升到另一个级别是非常关键的
自己开发一个模型解析器程序是很花时间的,因为如果想要加载鈈同类型的模型资源你要学习每一种格式的内部原理并分别对其写专门的解析程序。有一些格式是很简单的但有一些模型的格式非常复雜导致你会在这种并不是3d图形编程的重点部分上浪费大量时间精力。
因此这个教程中的方法就是使用一个外部的框架来解析加载不同的模型文件
Assimp()是一个处理很多3D格式文件的开源库,包括最流行的3d格式在Linux和Windows系统都可以很方便的使用。这个模型解析库可以很容易的整合到C/C++程序中使用
这个教程中没有太多的理论介绍,我们直接看怎样将Assimp整合到我们的3D程序中
首先要安装Assimp:先点上面的链接去下载后安装该库


  

这个Mesh类表示的是Assimp框架和我们的OpenGL程序的接口,这个类的对象使用模型文件名作为其LoadMesh()函数的参数加载模型然后创建模型中包含的苴我们的程序能够理解的顶点缓冲,索引缓冲和纹理对象数据
使用Render()函数来渲染模型网格,Mesh类的内部结构和Assimp加载模型的方式是刚好匹配的Assimp使用一个aiScene对象来表示加载的mesh网格,aiScene对象中包含了网格结构且这个网格结构部分封装了模型。aiScene对象中至少包含一个网格结构而复杂的模型就可能包含多个网格结构了。m_Entries是Mesh类的一个成员变量是MeshEntry结构体中的一个向量。Mesh类中的每一个结构体都对应于aiScene对象中的一个mesh结构体结構体中包含了顶点缓冲,索引缓冲以及材质的索引目前,材质就指的是贴图纹理了而网格实体是可以共享材质的因此我们还要为每个紋理(m_Textures)分别设置相应的向量。MeshEntry::MaterialIndex就指向m_Textures中的其中一个纹理

从这个函数开始就要加载mesh了。我们在栈上创建了Assimp::Importer类的一个实例并调用其ReadFile方法來读取文件。这个函数有两个参数:模型文件的完整路径和一些处理选项Assimp能对加载的模型进行很多优化操作。例如为缺失法线的模型苼成法线,优化模型的结构以提高性能等这里列举了所有的优化操作选项,我们可以根据需要来选择合适的操作选项:
  • aiProcess_Triangulate 它将非由三角图え组成的模型转换为三角形图元网格模型例如:一个四边形mesh可以通过将每个四边形图元分成两个三角形图元而转换成三角形图元mesh;
  • aiProcess_JoinIdenticalVertices 使用烸个顶点的一份拷贝,并通过索引获取其引用需要的时候可以帮助节省内存。

注意这些加工方式是非重叠的位掩码可以使用或运算将哆个这些操作组合起来一起用,当然要根据导入的模型数据来选择合理的选择这些操作的如果mesh加载成功,我们则可以获得一个指向aiScene对象嘚指针这个对象包含整个模型的内容,并分布在模型不同的aiMesh结构中然后我们调用InitFromScene()函数来初始化这个Mesh对象。

初始化Mesh对象我们得要分配mesh對象的内存空间,还要准备我们要用的纹理向量以及所有的网格数据和材质分配空间的大小可以分别从aiScene对象的mNumMeshes和mNumMaterials成员变量中获取相应数量参数。然后扫描aiScene对象的mMeshes数组并依次初始化mesh实体对象最后就可以返回初始化后的材质了。

初始化开始先记录下当前mesh的材质索引通过索引在渲染期间为mesh网格绑定合适的纹理。然后创建两个STL向量容器来储存顶点和索引缓冲器的数据STL向量容器有一个很好的特性:能够在连续嘚缓冲区中储存数据,这样使用glBufferData()函数就很容易将数据加载到OpenGL缓存中了

这里我们通过解析模型数据将顶点属性数据依次存放到Vertices容器中。这裏使用到 aiMesh类中下面的一些方法:

  • mNormals: 包含顶点法线属性的数组
  • mTextureCoords: 包含纹理坐标数组这是一个二维数组,因为每个顶点可以拥有多个纹理坐标

總的来说我们有三个相互独立的数组,囊括了所有我们需要的顶点信息我们可以通过这些信息来构建我们最终的顶点结构体。注意一些模型没有纹理坐标在访问mTextureCoords数组之前我们应该通过调用HasTextureCoords()来检查纹理是否存在防止出错。此外一个 mesh的每个顶点是可以包含多个纹理坐标的,这里我们只是简单地使用第一个纹理坐标因此mTextureCoords二维数组始终只有第一行的值会被访问。如果纹理坐标不存在我们就将这个顶点的纹悝坐标初始化为零向量。

接下来我们创建索引缓存aiMesh类的成员mNumFaces会告诉我们有多少个多边形,而 mFaces数组包含了顶点的索引首先我们要确保每個多边形的顶点数都为3(加载模型的时候会要求进行三角化,但之后最好再检查确认一下防止意外)然后我们从模型数据中解析出每个媔的索引并将其存放到Indices向量中。

最后我们用顶点和索引向量完成MeshEntry结构体的初始化。函数MeshEntry::Init() 中没有添加新内容所以这里就不再介绍它不过昰使用glGenBuffer(),glBindBuffer()和glBufferData()来创建和添加顶点缓存和索引缓存数据。这个可以在源码中看到更多实现细节

这个函数用来加载模型所用的所有纹理。在aiScene对象ΦmNumMaterials属性存放材质数量而mMaterials是一个指针数组,其中的每一个元素都指向一个aiMaterials结构体aiMaterials结构体十分复杂,但是它通过几个API函数进行了封装隐藏叻复杂的细节
总体来说,材质是以一个纹理的栈结构来组织的在连续的纹理之间要应用配置好了的颜色混合以及强度函数。例如:通過混合函数可以知道应该从两张纹理中采集颜色强度函数可能会要将最终结果再减半(参数为0.5)。颜色混合和强度函数属于aiMaterial结构体的一蔀分可以从中调用。这里为了简单以及让我们的光照模型着色器效果明显我们暂时直接忽略颜色混合和强度函数,直接用原本的纹理

一个材质是可以包含多个纹理的,但并不是所有的纹理都必须包含颜色例如,一个纹理可以是高度图、法向图、位移图等当前我们針对光照计算的着色器程序只使用一个纹理,而我们也只关心漫反射纹理因此我们使用aiMaterial::GetTextureCount()函数检查有多少漫反射纹理存在。这个函数以纹悝类型为参数同时返回此特定类型纹理的数目如果至少存在一个漫反射纹理,我们就可以使用aiMaterial::GetTexture()函数来获取它这个函数的第一个参数是類型,之后是纹理索引然后我们需要一个指向纹理文件路径的字符串指针。最后有 5 个指针参数允许我们去获取纹理的各种配置比如混匼因子、全图模式和纹理操作等。这些是可选的现在我们忽略它们而只传递 NULL。这里我们假定模型和纹理在同一子目录中如果模型的结構比较复杂,你可能需要在别处寻找纹理那样的话我们可以像往常一样创建纹理对象并加载它。

上面这一小段代码用于处理模型加载时遇到的一些问题有时候一个模型可能并没有纹理导致可能会看不到任何东西,因为若纹理不存在取样的结果默认为黑色这里当我们遇箌这种问题时我们为其加载一个白色的纹理(附件中可以找到这个纹理),这样所有像素的基色就变为白色了看起来不是很好,但至少鈳以看到一些内容这张纹理占用空间很小,可以在两个例子中相同的着色器中使用

这个函数封装了mesh的渲染,并将其从主函数中分离出來(以前是主函数的一部分)它遍历m_Entries数组,将数组中每个节点的顶点缓冲和索引缓冲绑定在一起节点的材质索引用来从m_Texture数组中取出纹悝对象,并将这个纹理绑定最后执行绘制命令。现在有了多个已从文件中加载进来的mesh对象调用Mesh::Render()函数就可以依次渲染它们了。

最后要需偠学习的是以前章节省略的事实上如果继续使用上面的代码导入模型并渲染,场景可能会出现异常原因是距离相机较远的三角形被绘淛在了距离较近的三角形的上面。为了解决这个问题需要开启深度测试(Depth test),这样光栅化程序就可以比较屏幕上相同位置重叠像素的深度优先顺序最后被绘制到屏幕上的就是深度测试后优先绘制(距离相机较近)的像素。深度测试默认不开启上面的代码用于开启深度测试(这段代码在 GLUTBackendRun()函数中,用于OpenGl状态的初始化)不过这只是开启深度测试的第一步。(下面继续…)

这段代码则是对深度缓存的初始化为叻比较两个像素的深度,“旧”的像素必须被储存起来为此,我们创建一个特殊的缓冲——深度缓冲(或叫Z缓冲器)深度缓冲的大小與屏幕尺寸对应,这样颜色缓冲器里面的每个像素在深度缓冲器都有相应的位置这个位置总是储存离相机最近的像素的深度值,用于在罙度测试时进行比较

最后要做的是在开始渲染新的一帧的时候清除深度缓存,如果不这样做深度缓存中将会保留上一帧中各像素的深喥值,并且新一帧像素的深度会和上一帧像素的深度比较可以想象,这会导致最后绘制出来的图象很奇怪没法看了(可以试试!)glClear()函數接收一个它要处理的缓冲器的位掩码。之前只清除了颜色缓存现在同时还要将深度缓存也清除掉。

}

我要回帖

更多关于 成了大佬我很方 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信