2022年下午15:14

1.bug状态:不显示渲染。报错提示顶点着色器和片段着色器编译失败。

分析:Asset数据没问题,组件生产线可能会出现问题,第一步就是initModel(),然后是initShader().再者就是rend()中的顺序问题,按步骤依次检查。

解决:发现一处initShader()是通过cube着色器调用。经再检验发现,因为包装的组件名,与类的成员函数同名冲突,而使此处调用的不是用于编译两个立方体shader的组件方法,而是只调用了一个编译立方体shader的成员方法。

收获封装时的命名要避免冲突。成员方法通过类对象调用,普通函数直接调用即可。可见基础不扎实。


2.bug状态:只显示一个(渲染完整的)cube立方体,而不显示光源立方体。

 分析:虽然传入的顶点属性有位置和UV。但是我认为对于光源立方体来说可以省略纹理和UV信息。所以这里存在的问题一定是,我设置的读取了过多的属性信息,而在rend()环节没有解析着色器中对应变量。或者是我读取的着色器中缺少了属性信息,却解析了一些着色器中不存在的变量。但是无论那种,我都没有看到VS编译器有报错,除非关于着色器的错误是打开着色器文件的错误或着色器及其明显的语法错误。

 解决:删除了着色器中的纹理等多余变量,在rend()环节没有绑定纹理。

收获:其实着色器读取数据是十分灵活的,比如顶点属性的原生数据有纹理,位置,颜色的数据的时候,但是我可以在顶点着色器中只接收我可能会用到的数据。比如光源立方体的顶点着色器中只接收了位置信息并且在渲染时我也不用对其他用不到的属性信息进行处理。

void rend()
{//缓冲区glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);//描述摄像机_projMatrix = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f); //定制投影矩阵_camera.update();   //实时更新摄像机矩阵cube_shader.shader_Begin();//资源说明glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, _texture);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, _texture2);glm::mat4 _modelMatrix(1.0f);//解析着色器 变量,并传入数据cube_shader.setMatrix("_modelMatrix", _modelMatrix);cube_shader.setMatrix("_viewMatrix", _camera.getMatrix());//给对应名字的矩阵传入数据cube_shader.setMatrix("_projMatrix", _projMatrix);cube_shader.setInt("_texture", 0);cube_shader.setInt("_texture2", 1);//绑定顶点数组,绘制轮廓glBindVertexArray(VAO_cube);glDrawArrays(GL_TRIANGLES, 0, 36);cube_shader.shader_End();sun_shader.shader_Begin();//解析着色器 变量,并传入数据sun_shader.setMatrix("_modelMatrix", _modelMatrix);sun_shader.setMatrix("_viewMatrix", _camera.getMatrix());//给对应名字的矩阵传入数据sun_shader.setMatrix("_projMatrix", _projMatrix);_modelMatrix = glm::translate(_modelMatrix, glm::vec3(3.0f, 0.0f, 0.0f));sun_shader.setMatrix("_modelMatrix", _modelMatrix);//绑定顶点数组,绘制轮廓glBindVertexArray(VAO_sun);glDrawArrays(GL_TRIANGLES, 0, 36);sun_shader.shader_End();}

总结:在把握完知识的基础框架和细化框架后,总结出了整体框架后,就应该多去巩固练习。提高熟练度。


3.bug3 :渲染效果,光线偏蓝。(光照强度设置 从0.5--1.0---1.5)但颜色和原图对比明现不正确。

分析:我猜测是由于光源颜色读入不正确,但是检查多次流程未发现数据有误。在RenderDoc中,提示顶点着色器编译有问题。。。经过输出光源,发现光源是蓝色了,但是经过观察发现这种蓝色不是巧合,而是(1.0f)的蓝+(1.0f)的绿调和成的蓝。而且我调节图二中的红色值,无论怎样都不起作用,但是蓝色值和绿色值可用。于是把这两者联系到一起,恍然大悟!原来是初始化传过的红色值顶掉了赋值时的红色值,使赋值时的红色无效。

//发生bug前代码glm::vec3 ligntColor(1.0f);//这种写法的意思是只换了1.0f的红色,其余颜色未传。
//这与glm::mat3(1.0f)的写法有区别,后者意为传入一个单位矩阵。

图一

图二

图三

解决方法声明光源颜色和光源位置的时候,不要将初始化写成 glm::vec3 light_color(1.0f);而是在下面重新赋值。或者直接初始化成目标值。

但一直没解决RenderDoc中的报错。提示是API用的不规范。原因还未探明。

最终效果

收获:检验是实践真理的唯一标准,任何细节都不要放过蛛丝马迹。另外对于glm::vec3这个数据是C++数据,而uniform是从CPU直接传向GPU的数据,所以需要单独在着色器中解析变量。但uniform变量的数据与uniform无关,只会影响传输方式。


4.bug状态:漫反射下cube失去纹理。

 分析:说明是纹理出现了错误,第一步着色器读取数据有问题,于是检查了顶点属性指针,发现偏移量取错,修改过后颜色正常。


最后总结:  我需要提升一种能力,就是将错误概括成专业术语的能力。比如:未达到预期渲染的bug状态有很多种,但是只有一种精准的概括。代码能力和debug能力的提升,是个不断精简要求的过程。前几日bug都是流程类型的容易改,但是现在的bug则需要通过数据分析数据。

Debug No5基础光照相关推荐

  1. OpenGL 基础光照ColorsBasic Lighting

    OpenGL 基础光照ColorsBasic Lighting 基础光照ColorsBasic Lighting简介 环境光照 漫反射光照 法向量 计算漫反射光照 最后一件事 镜面光照 基础光照Col ...

  2. 16.opengl-qt 基础光照

    学习链接: 基础光照 - LearnOpenGL CN 环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮.远处的光),所以物体几乎永远不会是完全黑暗的 ...

  3. Vulkan_Shader_Day02—光照(基础光照_Phong Lighting Model)

    基础光照 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的.因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来 ...

  4. LearnOpenGL-光照-2.基础光照

    本人刚学OpenGL不久且自学,文中定有代码.术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject 文章目录 基础光照 ...

  5. UnityShader(四)基础光照

    一.标准光照模型 1.1 光的散射和吸收 光线从光源中发射出来后,与物体表面相交,结果通常有两个:「散射」和「吸收」. 散射只会改变光线的方向,而不改变光线的颜色和密度.吸收则相反.光线在物体表面散射 ...

  6. unity入门精要之第6 章 Unity 中的基础光照概述-1

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 6.1 我们是如何看到这个世界的 6.2 标准光照模型 参考 前言 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说 ...

  7. unity入门精要之第6 章 Unity 中的基础光照--环境光和自发光

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity 中的环境光和自发光 二.在Unity Shader 中实现漫反射光照模型 参考 前言 但这种模型有很多局限性.首先,有很 ...

  8. OpenGL原理与实践——核心模式(五):颜色、基础光照、Phong模型、材质与光

    目录 颜色相关理论 什么是颜色 如何计算颜色? 简单实现 Phong光照模型--局部光照模型 环境光 ​编辑 漫反射 镜面反射 材质与光 材质与纹理的关系 材质在shader的体现 材质属性与光属性 ...

  9. Learn OpenGL (九):基础光照

    环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮.远处的光),所以物体几乎永远不会是完全黑暗的.为了模拟这个,我们会使用一个环境光照常量,它永远会给物 ...

  10. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

最新文章

  1. 中国IT潜在的巨大希望
  2. 在arm板卡上做一个简单的关机脚本
  3. UVA - 202 Repeating Decimals
  4. activiti7流程设计器_变频空调器通信电路
  5. IOT(10)--RTOS
  6. 我就是一根儿筋 也许问题很简单
  7. Linux 设备树的使用技巧
  8. CentOS 6,7系统服务管理
  9. 项目管理10大模板Excel版(可直接套用)
  10. 融云发送图片消息_融云 SDK 消息结构详解
  11. 第二次打卡 数据处理
  12. Adding Animations之Zooming a View
  13. 在页面上用$(#userName).val();获取不到值,提示$(#userName)未定义
  14. 明瞳智控四月再升级,视图终端上云更便捷
  15. C++找不到头文件问题
  16. 曾仕强讲座免费在线学习 免费下载
  17. 谈谈事件委托的理解?
  18. 千锋教育python怎么样_深圳千锋的python怎么样
  19. mac电脑垃圾清理 mac电脑垃圾桶清空的如何撤回
  20. OpenCV编程-肤色检测

热门文章

  1. 天池- IJCAI-18 阿里妈妈搜索广告转化预测(完整版代码,数据集等总结)
  2. Elasticsearch 运行时类型 Runtime fields 深入详解
  3. Rockchip | Rockchip固件升级工具
  4. Ubuntu 更换阿里云软件源
  5. c++读xml文件 MSXML
  6. 序列化和反序列化 加上json数据流转换
  7. ZoneAlarm 不错的防火墙软件
  8. Flash按钮操作(画面暂停与播放)
  9. 小胡时隔两年的第二篇Blog
  10. magento 开发 -- 入门深入理解第五章 – Magento资源配置