一、前言
这是笔者第一次发表文章,对自己的学习做一定的归纳总结。对于撰写文章缺乏经验,学习上松松散散,希望能借此平台上来促进自身的学习,提高自身的学习自觉性和时间效率上的提高。
最近处于失眠状态,精神不是很好,学习opengl已经有了一定的入门基础。之前的主要学习资料主要来自于其他人的简书文章,如果深入的学习和探究,还是能从其中获取不少收获的。这是链接资料的地址:从0开始的OpenGL学习。
本人非常热爱游戏开发,就学于西安电子科技大学,如果有志同道合者,非常欢迎一起联系共同探究问题。
二、涉及主题
1.OpenGL开发的一个简单架构总结
2.针对从0开始的OpenGL学习(十七)-加载模型这篇文章进行自己的实践总结
3.实践过程中出现的bug
三、具体内容
1.opengl的简单架构
随着知识内容的增多 ,opengl程序扩展的非常快,把很多代码堆放在一起未尝不可,但后面必然会带来很多调试和扩展的麻烦。基于之前的学习内容,以及今后的文章知识扩展,自己对opengl程序做了一个简单的架构。

2.实践总结
具体的实践内容看上述提供的文章即可,实践中多手动敲写代码,理顺整个处理过程,置身于哪个情境中,接下来应该做什么,为什么这么做。多想想其他的可能性,比如opengl中的函数调用顺序为什么是这样,两个函数的调用顺序能交换吗,什么函数的调用有前置依赖的函数。这些当然不需要强行去记忆,多方面去思考,去实践,多错几次或多动手,都能增加自身的印象,培养自身的编程直觉力。
学习本身也是一个技巧性的活,接触一种新的定义,一种新的事物,大可按自己的猜想去定义它,去把它转换成自己能理解且当前能解释的过去的,之后如果出错,再重新进一步的深入了解,不能一开始执著于不懂而畏惧不前,兴趣是非常重要的,保持过程中的积极性,欢快且轻松的进行下去,而不是咬牙硬撑。
3.bug归纳
(1)文件目录组合错误
文件路径中划分符出现为 '\'的,在具体的代码中写成‘\\'才表示'\',第一个'\'表示转义字符的意思。
原本出错代码为:string realPath = directory + "\" + aiPath.C_Str();
正确代码为:string realPath = directory + "\\" + aiPath.C_Str();
(2) fragment shader中uniform在结构体重定义错误
原本错误的定义如下:

修改后的正确定义:

(3)模型显示出错
错误效果图:

分析和尝试的措施:
这个是在实践中碰到最麻烦的bug,模型的身体中部和腿部显示为黑色,其他部位的纹理显示正常。先从代码的方面考虑,可能代码中的资源加载出错,没有加载成功。从图中可以看出,模型的顶点位置数据没有问题,定位到贴图出错的方向。经过检查,Model里面的每个Mesh都成功加载了贴图资源,而且从模型资源本身来分析,leg或者body的顶点资源是一套的且贴图也是共用一张,不应该出现一边正常一边全黑的情况。考虑到纹理单元的情况,但纹理单元应该只是起到中介容器的作用,不造成影响。
接下来把文题定位到着色器方面,应为着色器和渲染息息相关。经检查着色器代码没有什么问题,如果着色器中的纹理贴图资源没有问题,那么没有排查的因素还有纹理坐标出错的可能。在着色器中不好调试,我尝试了对fragment shader进行下面的修改:

运行之后看到如下结果:

很明显,纹理坐标的范围不在[0,1]之间了,经过重重的回溯排查,问题出现在了加载图片的属性设置上,错误代码如下:

修改后正确的代码:

网友评论