一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种渲染问题的调试方法、装置、设备及存储介质与流程

2022-11-19 17:01:34 来源:中国专利 TAG:


1.本发明实施例涉及信号的软件处理技术领域,尤其涉及一种渲染问题的调试方法、装置、设备及存储介质。


背景技术:

2.随着opengl版本的升级,当前图形开发中使用的opengl版本越来越高,从最初的1.0已经演进到最新的4.6版本。开发方式也从最初的纯c/c 编程转变为c/c 混合着色器shader编程。在opengl 3.3版本后,opengl图形管线已由固定管线转变为可编程管线。固定管线编程方式相对比较简单,可编程管线编程复杂很多,但是后者可以实现前者实现不了的一些渲染效果,而且在性能上相对前者也有一定提升。目前基于opengl 3.3之后版本开发显卡变得越来越普遍,当在被测显卡上渲染结果有异常时,常规的分析方法是修改目标程序或者测试用例的源码中的着色器代码,然后重新编译运行。但是此常规分析方法在修改着色器代码后,若所述着色器代码集成在应用程序源码中,在修改着色器代码后需要对应用程序源码重新编译后才能运行,并且对有一系列限定条件或者操作以及特定环境或者装置才能重现的问题,重新运行时需要重复执行限定的条件或操作以及远程连接异常发生的机器以及去现场才能调试,不利于对渲染问题的实时调试。


技术实现要素:

3.有鉴于此,本发明实施例期望提供一种渲染问题的调试方法、装置、设备及存储介质,通过在调试渲染问题过程中实时修改有错误的着色器代码并重新编译和运行,提高了渲染问题调试的效率。
4.本发明实施例的技术方案是这样实现的:第一方面,本发明实施例提供了一种渲染问题的调试方法,包括:在应用程序执行时记录图形api函数调用顺序及所使用的参数以生成跟踪文件;按帧回放所述跟踪文件,并在回放过程中提取被回放帧对应的着色器代码,并按照提取出的着色器代码进行渲染生成第一渲染结果;当所述第一渲染结果异常时,返回到所述被回放帧的上一帧位置,记录并保存所述上一帧对应的用于分析和调试的描述信息;其中,所述描述信息至少包括所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息;当所述描述信息指示所述着色器代码有错误时,实时修改所述提取出的着色器代码并保存到缓存中,继续所述被回放帧的回放;基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性。
5.第二方面,本发明实施例提供了一种渲染问题调试装置,所述装置包括:生成部分、提取部分、记录部分、修改部分、确定部分;其中,
所述生成部分,经配置为在应用程序执行时记录图形api函数调用顺序及所使用的参数以生成跟踪文件;所述提取部分,经配置为按帧回放所述跟踪文件,并在回放过程中提取被回放帧对应的着色器代码,并按照提取出的着色器代码进行渲染生成第一渲染结果;所述记录部分,经配置为当所述第一渲染结果异常时,返回到所述被回放帧的上一帧位置,记录并保存所述上一帧对应的用于分析和调试的描述信息;其中,所述描述信息至少包括所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息;所述修改部分,经配置为当所述描述信息指示所述着色器代码有错误时,实时修改所述提取出的着色器代码并保存到缓存中,继续所述被回放帧的回放;所述确定部分,经配置为基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性。
6.第三方面,本发明实施例提供了一种计算设备,所述计算设备包括:通信接口,存储器和处理器;各个组件通过总线系统耦合在一起;其中,所述通信接口,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;所述存储器,用于存储能够在所述处理器上运行的计算机程序;所述处理器,用于在运行所述计算机程序时,执行第一方面所述渲染问题的调试方法的步骤。
7.第四方面,本发明实施例提供一种计算机存储介质,所述计算机存储介质存储有渲染问题调试的程序,所述渲染问题调试的程序被至少一个处理器执行时实现第一方面所述渲染问题的调试方法的步骤。
8.本发明实施例提供了一种渲染问题的调试方法,通过在应用程序执行时调用封装在动态链接库中的图形api函数并记录所述图形api函数调用顺序及所使用的参数生成跟踪文件;回放所述跟踪文件并回放过程中提取被回放帧对应的着色器代码并保存到缓存中,按照提取出的着色器代码进行渲染以生成第一渲染结果;当所述第一渲染结果出现异常时,记录所述被回放帧上一帧的用于分析和调试的描述信息,返回到所述被回放帧的上一帧位置,根据所述描述信息分析得到所述着色器代码有错误时,实时修改有错误的着色器代码并保存在缓存中;然后从被回放帧的上一帧位置继续所述被回放帧的回放;基于所述被回放帧的回放,当检测到所述着色器代码发生修改时,重新编译和运行修改后的所述着色器代码以生成第二渲染结果,并确定所述第二渲染结果是否与预期结果一致性,判断是否需要重复操作。在渲染问题分析调试的过程中,均可以单独实时修改所述着色器代码并重新编译和运行,从而节省了渲染问题分析和调试的时间,提高了着色器代码修改和运行的效率。
附图说明
9.图1为本发明实施例提供的计算机系统组成示意图;图2为说明图1中的cpu、gpu和存储器的实例实施方案的框图;图3为本发明实施例提供的绘制三角形的可编程管线流程示意图;
图4为本发明实施例提供的一种渲染问题的调试方法流程图;图5为本发明实施例提供的一种渲染问题的调试方法操作流程图;图6为本发明实施例提供的一种渲染问题调试装置组成示意图。
具体实施方式
10.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
11.参见图1,其示出了能够实现本发明实施例技术方案的计算机系统组成100,需注意,图示的系统是可能的系统的仅一个示例,并且可根据需要在各种系统中的任一系统中实现本发明的实施方案。该计算机系统组成100具体可以为任意类型的计算装置,包括且不限于台式计算机、服务器、工作站、膝上计算机、基于计算机的仿真器、无线装置、移动或蜂窝电话(包含所谓的智能电话)、个人数字助理(pda)、视频游戏控制台(包含视频显示器、移动视频游戏装置、移动视频会议单元)、膝上型计算机、桌上型计算机、电视机顶盒、平板计算装置、电子书阅读器、固定或移动媒体播放器等。如图1所示,计算机系统组成100可以包括中央处理器(central processing unit,cpu)10、图形处理器(graphic processing unit,gpu)20、存储器30,还包括显示处理器40、显示器41以及通信接口50。显示处理器40可为与gpu 20相同的集成电路(integrated circuit,ic)的部分,也可在包含gpu 20的一或多个ic的外部,或可形成于在包含gpu 20的ic外部的ic中。
12.具体来说,cpu 10可包括控制计算机系统组成100运算的通用或专用处理器,其经配置以处理供执行的计算机程序的指令。用户可经由通信接口50与耦合到计算机系统组成100的另一输入装置(未图示)例如:轨迹球、键盘、鼠标、麦克风、触摸垫、触摸屏以及其他类型的装置将输入提供给计算机系统组成100中的cpu 10,以使得cpu 10执行一或多个软件应用程序的指令。在cpu 10上执行的应用程序可包括图形用户接口(graphic user interface,gui)应用程序、操作系统、便携式制图应用程序、用于工程或艺术应用的计算机辅助设计程序、视频游戏应用程序、文字处理器应用程序、电子邮件应用程序、电子表格应用程序、媒体播放器应用程序或使用2d、3d图形的渲染应用程序等,本发明实施例以执行图形渲染应用程序为例。此外,cpu 10上执行的渲染应用程序可包含一或多个图形渲染指令(也可以理解为待渲染的画面帧中包含一或多个所述图形),所述图形渲染指令可符合图形应用程序编程接口(application programming interface,api),例如,开放式图形库api(opengl api)、开放式图形库嵌入系统(opengl es)api、direct3d api、x3d api、renderman api、webgl api、开放式计算语言(opencltm)、renderscript或任何其它异构计算api,或任何其它公用或专有标准图形或计算api,本发明下面的描述中将以opengl api为例进行说明。
13.gpu 20可经配置以执行图形运算,从而将一或多个图形图元渲染到显示器41进行展示。可以理解为,cpu 10通过控制gpu驱动程序14,将opengl定义的图形渲染指令翻译为gpu 20可读的图形渲染命令,然后gpu 20根据收到的一或多个图形渲染命令,包括但不限于图形命令和图形数据,其中,所述图形数据包括绘制命令、状态信息、图元信息、纹理信息等,以使得gpu 20执行所述图形渲染命令中的一些或者全部,从而将一或多个图形图元进行渲染并在显示器41上展示出来。
14.存储器30,经配置用于存储能够在cpu 10上运行的应用程序指令、gpu 20执行需要的图形数据以及其运行结果数据。例如,gpu 20可将完全形成的图像存储在存储器30中。存储器30可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(ram)、静态ram(sram)、动态ram(dram)、可擦除可编程rom(eprom)、电可擦除可编程rom(eeprom)、快闪存储器、磁性数据媒体或光学存储媒体。显示处理器40可从存储器30检索图像且输出使显示器41的像素照亮以显示所述图像的值。显示器41可为计算机系统100的显示器,其显示由gpu 20产生的图形图像内容。显示器41可为液晶显示器(lcd)、有机发光二极管显示器(oled)、阴极射线管(crt)显示器、等离子显示器或另一类型的显示装置。
15.结合图1所示,图2进一步阐述计算机系统组成100中的关键部件cpu 10、gpu 20和存储器30的实施方案的框图200,如图2所示,本发明实施例的实施方案的框图200主要包括但不限于cpu 10、gpu 20、存储器30及其对应内部构成。其中,cpu 10包含应用程序11、图形api 13、gpu驱动程序14,其中图形api 13和gpu驱动程序14两者中的每一个,可以为一或多个应用程序服务,在一些示例中,图形api 13和gpu驱动程序14可实施为cpu 10的硬件单元,而gpu驱动程序14可以将cpu 10的一或多个图形渲染指令编译成gpu 20可执行的应用程序命令。gpu 20内部结构包括但不限于图形存储器21、处理器集群22。在本发明实施例中,图形存储器21可为gpu 20的一部分。因此,gpu 20可在不使用总线的情况下从图形存储器21读取数据且将数据写入到图形存储器21。换句话说,gpu 20可使用本地存储装置而不是芯片外存储器在本地处理数据,此类图形存储器21可被称作芯片上存储器。这允许gpu 20通过消除gpu 20经由总线读取和写入数据的需要来以更高效的方式操作,其中经由总线操作可经历繁重的总线业务。在一些示例中,gpu 20可不包含单独的存储器,而是经由总线利用外置的存储器30。图形存储器21的类型参见前述存储器30的类型,此处不再赘述。处理器集群22,用于执行图形处理管线,以便对图形渲染命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。存储器30可包含系统存储器31和帧缓存32。其中,帧缓存32可为系统存储器31的部分或可与系统存储器31分离。帧缓存32可存储渲染图像数据,例如像素数据,其具体存储的数据为每个像素的红色、绿色、蓝色、α(rgba)分量,其中“rgb”分量对应于色彩值,并且“a”分量对应于目的地α值(例如,用于图像合成的不透明度值)。在一些示例中,所述帧缓存还可被称为帧缓冲器(frame buffer)或显存或输出缓冲器,用于预览所述画面帧的渲染效果,也可以理解为预览所述画面帧的渲染效果可以通过frame buffer机制实现,帧缓存是内核空间中的一种驱动程序接口,它本身不具备任何运算数据的能力,中间不会对数据做处理,但其需要真的显卡驱动的支持。
16.基于现有技术中opengl的应用程序调用方式,cpu 10通过应用程序11经由图形api 13向gpu驱动程序14发出指令,gpu驱动程序14可调配指定供gpu 20执行的一或多个运算以便渲染图元的一或多个命令,以用于将一或多个图形图元渲染到可显示的图形图像中。当gpu 20接收到来自cpu 10的图形渲染命令时,gpu 20可使用处理器集群22执行图形处理管线,以便对命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。具体来说,gpu 20在实现或运行应用程序的过程中,需要借助于图形渲染管线以实现对图形的渲染操作,所述图形渲染管线属于一种通过级联形成的逻辑结构,各级也可称为各渲染阶段,其包括固定管线和可编程管线。参见图3,其示出了本发明实施例提供的绘制三角形的可编程管线流程示意图300,对于输入的顶点数据处理流程见图3中的虚线
框,一般分为顶点着色器、图元装配、几何着色器、光栅化、片段着色器以及测试与混合六个步骤,最后得到屏幕图像。所述可编程管线是增加了可编程的着色器shader的图形渲染管线,如图3中所示圆角框中的顶点着色器、几何着色器以及片段着色器,用户需要在应用程序中编写各着色器模块对应的代码。opengl在处理着色器shader时,和其他编译器一样,通过编译、链接等步骤,生成着色器程序(glprogram),所述着色器程序同时包含了顶点着色器、几何着色器和片段着色器的运算逻辑。在opengl进行绘制时,可编程管线中每一步骤对应的具体操作为:步骤1:顶点着色器,即对传入的顶点数据进行运算,以确定三角形顶点数据坐标位置;需要说明的是,所述顶点着色器的顶点数据输入主要有两种,统一变量(uniform)和顶点属性(vertex attribute)。所述统一变量在所有顶点运算中是一样的,而所述顶点属性则是从外部输入的顶点数据中获取,一般在每个顶点运算中都是不同的。
17.步骤2:图元装配,确定渲染的图元类型为三角形并将顶点转换为图元;步骤3:几何着色器,接收一组顶点数据并对数据进行处理,根据数据生成多个图形;具体来说,几何着色器把一个或多个顶点转变为完全不同的基本图形,从而生成比原来多的顶点或者修改图形的位置,例如可以在三角形内部增加一个三角形。
18.步骤4:光栅化,即为把图形转变为屏幕像素点,也可以理解为将图元矢量图形转换为栅格化数据;步骤5:片段着色器,将栅格化数据中的每一个像素传入片段着色器中进行运算并决定像素的颜色,也可以在这个阶段将某些像素丢弃;步骤6:测试与混合,即为检测片段中每个像素的深度值来确定像素要不要被丢弃,另外还会检测α(alpha)值,对颜色值进行混合。
19.基于上述内容的阐述,本发明实施例期望在应用程序执行前对图形api函数做hook处理并封装为动态链接库。所述动态链接库在其他一些示例中,也可被称之为“动态库文件”或“动态链接文件”等,从而使得在应用程序执行时调用所述动态链接库中的图形api函数并记录所述图形api函数调用顺序及所使用的参数以生成跟踪文件,基于所述跟踪文件的回放提取出着色器代码并按照所述着色器代码对图形进行渲染以生成渲染结果,当所述渲染结果异常时可以实时修改所述着色器代码并且可以只对所述着色器代码进行编译和运行进行渲染问题调试,从而节省了渲染问题分析调试的时间,提高渲染问题调试效率。基于此,参见图4,其示出了本发明实施例提供的一种渲染问题的调试方法,该方法包括:s401:在应用程序执行时记录图形api函数调用顺序及所使用的参数以生成跟踪文件;s402:按帧回放所述跟踪文件,并在回放过程中提取被回放帧对应的着色器代码,并按照提取出的着色器代码进行渲染生成第一渲染结果;s403:当所述第一渲染结果异常时,返回到所述被回放帧的上一帧位置,记录并保存所述上一帧对应的用于分析和调试的描述信息;其中,所述描述信息至少包括所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息;s404:当所述描述信息指示所述着色器代码有错误时,实时修改所述提取出的着
色器代码并保存到缓存中,继续所述被回放帧的回放;s405:基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性。
20.根据上述方案的描述,本发明实施例通过在应用程序执行时调用所述动态链接库中封装的图形api函数并记录所述图形api函数调用顺序及所使用的参数生成跟踪文件;通过渲染问题调试软件的回放模块按帧回放所述跟踪文件,并在所述跟踪文件的回放过程中提取被回放帧对应的着色器代码,保存到缓存中并显示在界面上,按照提取出的着色器代码进行渲染以生成第一渲染结果;当所述第一渲染结果出现异常时回放暂停,可以得到所述第一渲染结果异常发生时即当前被回放帧的位置、调用的函数、执行的着色器信息、被回放帧的上一帧的上下文参数信息以及所有帧缓存信息等描述信息;返回到所述被回放帧的上一帧位置,根据所述描述信息分析得到所述着色器代码有错误时,则可以实时修改有错误的着色器代码并保存在缓存中;然后从被回放帧的上一帧位置继续所述被回放帧的回放;基于所述被回放帧的回放,当检测到所述着色器代码发生修改时,则重新编译和运行修改后的所述着色器代码以生成第二渲染结果,并确定所述第二渲染结果是否与预期结果一致性,判断是否需要重复操作。在渲染问题分析调试的过程中,不论所述着色器代码是集成在应用程序源码或测试用例源码中或存放在单独文件中,均可以单独实时修改所述着色器代码并重新编译和运行,但是所述应用程序或测试用例的源码均不需要重新编译和运行,从而节省了渲染问题分析和调试的时间,提高了着色器代码修改和运行的效率。
21.需要说明的是,为了便于描述,经hook处理的图形api函数或者封装在动态链接库中的图形api函数,也可称之为第一图形api函数,真实图形api函数库中的图形api函数也可称之为第二图形api函数,其中,第一图形api函数可以是第二图形api函数的部分或全部函数。本发明实施例中所述第一图形api函数是满足设定条件或一次绘制操作的第二图形api函数的全部函数。
22.对于图4所示的技术方案,在一些可能的实现方式中,所述在应用程序执行时记录图形api函数调用顺序及所使用的参数以生成跟踪文件,包括:在应用程序启动前预加载动态链接库;其中,所述动态链接库包括已被hook处理过的所有第一图形api函数;在应用程序执行时调用所述动态链接库中的第一图形api函数并记录所述第一图形api函数调用顺序及所使用的参数写入本地跟踪文件。
23.对于上述实现方式,在一些示例中,所述在应用程序启动前预加载动态链接库,具体来说,动态链接库在被调用之前需要被指定为预加载库,本发明实施例以采用ld_preload方式预加载所述动态链接库为例,具体实施方式为,假定封装的动态链接库命名为hook gl.so,真实图形api函数库命名为gl.so,可以在linux命令行输入如下命令进行加载动态链接库hook gl.so:export ld_preload="./hook gl.so"对于上述实现方式,在一些示例中,所述在应用程序执行时调用所述动态链接库中的第一图形api函数并记录所述第一图形api函数调用顺序及所使用的参数写入本地跟踪文件,具体来说,在应用程序执行时调用已被hook处理并封装在动态链接库中第一图形
api函数,结合图2,具体图形api函数调用顺序参见图2中应用程序11与hook模块12之间的虚线箭头,然后调用真实图形api函数库gl.so中的第二图形api函数,在一些示例中,此步骤也可以不调用真实图形api函数库gl.so中的第二图形api函数,即不获取渲染结果,只调用动态链接库hook gl.so中的第一图形api函数以生成跟踪文件。在应用程序执行时调用到的所述第一图形api函数做两件事情,一是执行第一图形api函数操作,二是把第一图形api函数调用顺序及所使用的参数写入本地跟踪文件中。详细来说,写入本地跟踪文件实施例的代码实现方式可以包括如下步骤:1、对所有图形api函数进行hook处理;2、记录图形api函数的调用参数数据;3、执行图形api函数操作;4、将图形api函数名和记录的数据信息写入本地跟踪文件中。以gluniform3f函数为例,具体的代码实现详细如下所示:extern "c" publicvoid apientry gluniform3f(glint location, glfloat v0, glfloat v1, glfloat v2) {
ꢀꢀꢀꢀ
//记录事件开始标志位,然后记录函数名gluniform3f,将其写入跟踪文件中
ꢀꢀꢀꢀ
unsigned _call = trace::abstractwriter::getinstance()-》beginenter(&_gluniform3f_sig);
ꢀꢀꢀꢀ
//记录第一个参数值location,类型为glint,将其写入跟踪文件中
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》beginarg(0);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》writesint(location);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endarg();
ꢀꢀꢀꢀ
//记录第二个参数值v0,类型为glfloat,将其写入跟踪文件中
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》beginarg(1);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》writefloat(v0);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endarg();
ꢀꢀꢀꢀ
//记录第三个参数值v1,类型为glfloat,将其写入跟踪文件中
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》beginarg(2);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》writefloat(v1);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endarg();
ꢀꢀꢀꢀ
//记录第四个参数值v2,类型为glfloat,将其写入跟踪文件中
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》beginarg(3);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》writefloat(v2);
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endarg();
ꢀꢀꢀꢀ
//记录调用结束标志位,将其写入跟踪文件中
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endenter();
ꢀꢀꢀꢀ
//执行系统gluniform3f函数
ꢀꢀꢀꢀ
_gluniform3f(location, v0, v1, v2);
ꢀꢀꢀꢀ
//记录事件结束标志位
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》beginleave(_call);
ꢀꢀꢀꢀ
if (true) {
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
//记录调用结束标志位
ꢀꢀꢀꢀ
trace::abstractwriter::getinstance()-》endleave();}保存在本地跟踪文件中的gluniform3f函数的信息如下:9086 @0 gluniform3f(location = 4, v0 = 0.00625, v1 = 0.0666667, v2 = 3) 0依据前述代码,gluniform3f的信息说明:9086:调用的call id@0:thread idgluniform3f:图形api函数名(location = 4, v0 = 0.00625, v1 = 0.0666667, v2 = 3):输入参数数据0:结束标志如果有图形api函数不是void类型,会在最后以“= 值”的方式添加,例如:8972 @0 glcreateshader(type = gl_vertex_shader) = 40。
24.对于图4所示的技术方案,在一些可能的实现方式中,所述按帧回放所述跟踪文件,并在回放过程中提取被回放帧对应的着色器代码,并按照提取出的着色器代码进行渲染生成第一渲染结果,包括:按帧回放所述跟踪文件并基于所述跟踪文件的回放提取被回放帧对应的着色器代码,保存在缓存中并显示在界面上;应用程序执行时读取所述缓存中提取出的着色器代码,并按照所述提取出的着色器代码进行渲染以生成第一渲染结果。
25.对于上述实现方式,在一些示例中,所述按帧回放所述跟踪文件并基于所述跟踪文件的回放提取被回放帧对应的着色器代码,保存在缓存中并显示在界面上,具体来说,在渲染问题调试软件上使用跟踪回放模块回放所述跟踪文件,所述跟踪回放模块包括暂停、继续以及返回上一帧操作;在所述跟踪文件的回放过程中通过着色器显示编辑模块将集成在应用程序源码中或存放在单独文件中的被回放帧对应的着色器代码提取出来并保存在缓存中,然后显示在界面上,以用于后续分析和定位得到所述着色器代码有错误时,可以实时修改所述着色器代码。
26.本发明实施例以顶点着色器为例,提取和编译着色器代码的步骤一般包括:1、着色器源代码定义;2、创建着色器;3、将着色器源代码附加到着色器;4、编译着色器源代码四个步骤。详细来说,具体代码实现为://着色器源代码定义const char *vertexshadersource = "#version 330 core\n"
ꢀꢀꢀꢀ
"layout (location = 0) in vec3 apos;\n"
ꢀꢀꢀꢀ
"void main()\n"
ꢀꢀꢀꢀ
"{\n"
ꢀꢀꢀꢀ
" gl_position = vec4(apos.x, apos.y, apos.z, 1.0);\n""}\n";//创建着色器
unsigned int vertexshader;vertexshader = glcreateshader(gl_vertex_shader);//将着色器源代码附加到着色器上glshadersource(vertexshader, 1, &vertexshadersource, null);//编译着色器源代码glcompileshader(vertexshader);其中,通过glshadersource函数中的第三个参数vertexshadersource,可以获取到着色器源代码。
27.需要说明的是,所述着色器源代码也可称之为着色器代码,是指用来实现图像渲染并且替代固定渲染管线的可编辑着色器程序的代码,是为图形渲染管线的某个特定部分而运行的程序代码。
28.对于上述实现方式,在一些示例中,所述应用程序执行时读取所述缓存中提取出的着色器代码,并按照所述提取出的着色器代码进行渲染以生成第一渲染结果,具体来说,应用程序执行时直接读取缓存中提取出的着色器代码,并进行渲染以生成第一渲染结果。对于上述操作,结合图2,图形api函数调用顺序是应用程序11与hook模块12之间的虚线箭头以及hook模块12与图形api 13之间的实线箭头。
29.对于图4所示的技术方案,在一些可能的实现方式中,所述当所述第一渲染结果异常时,返回到所述被回放帧的上一帧位置,记录并保存所述上一帧对应的用于分析和调试的描述信息;其中,所述描述信息至少包括所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息,包括:逐像素对比第一渲染结果与预期结果之间的差异,若不一致,则判定所述第一渲染结果异常;返回到所述被回放帧的上一帧位置,记录并保存所述被回放帧的上一帧的上下文参数信息、所有帧缓存信息以及着色器信息。对于上述实现方式,在一些示例中,所述逐像素对比第一渲染结果与预期结果之间的差异,若不一致,则判定所述第一渲染结果异常,具体来说,可以理解为,根据生成的第一渲染结果与预期结果,分别选取同一帧像素数据的红色、绿色、蓝色、α分量,即像素的rgba四个分量作为比较参数,比较第一渲染结果和预期结果在同一位置上的像素值是否一致,原则上回放跟踪文件同一帧的渲染效果两者应该完全一样,当两者的渲染结果存在不一致且差异超出限定范围则判定被测显卡的第一渲染结果为异常。
30.需要说明的是,所述的预期结果也可以理解为在标准显卡上针对同一帧的回放得到的预期渲染结果。所述标准显卡也可以称之为参照显卡,在标准显卡上渲染的图像可以默认为是正确的,把其作为参照显卡,用于判断被测显卡渲染的图像是否正确。
31.对于上述实现方式,在一些示例中,所述返回到所述被回放帧的上一帧位置,记录并保存所述被回放帧的上一帧的上下文参数信息、所有帧缓存信息以及着色器信息,具体来说,当所述第一渲染结果出现异常时,也可以理解为被回放帧渲染结果异常时,可选地,暂停回放,可以得到被回放帧渲染结果异常时的位置、调用的函数、执行的着色器信息、上一帧的上下文参数信息以及所有帧缓存信息,通过所述渲染问题调试软件的上一帧保存模块保存到缓存中,用于后续对渲染结果异常图像进行分析和定位。
32.需要说明的是,所述帧缓存如前述内容所示,是一个存储器,保存了最终显示在屏幕上图像的全部信息,帧缓存的每一个存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像;帧缓存信息包括颜色缓存、深度缓存以及模块缓存等信息。
33.对于图4所示的技术方案,在一些可能的实现方式中,所述当所述描述信息指示所述着色器代码有错误时,实时修改所述提取出的着色器代码并保存到缓存中,继续所述被回放帧的回放,具体来说,基于前述步骤s402中所述跟踪文件的回放过程,已提取出被回放帧的着色器代码并已保存在缓存中,然后通过着色器显示编辑模块将所述提取出的着色器代码显示在界面上;根据记录和保存的所述被回放帧的上一帧对应的用于分析和调试的描述信息,例如被回放帧异常发生时的位置、调用的函数、执行的着色器信息以及上一帧的上下文参数信息和所有帧缓存信息,分析得到所述着色器代码有错误时,实时在显示界面上修改有错误的着色器代码并保存到缓存中。所述修改有错误的着色器代码相当于修改了缓存内容,每次读取代码时,直接读取缓存中的数据,继续执行时,调用缓存内容就相当于调用了新代码并且新增代码不会同步写入跟踪文件中,同时也没有写入单独的文件中,一旦缓存内容清空,修改后的着色器代码将不再存在,需要基于跟踪文件的回放重新提取所述着色器代码的源代码再次修改,才可以避免所述渲染结果异常。接着,继续所述被回放帧的回放,以用于后续调用所述修改后的着色器代码。
34.对于图4所示的技术方案,在一些可能的实现方式中,所述基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性,包括:基于所述被回放帧的回放,当检测到所述着色器代码发生改变时通过着色器编译模块将所述修改后的着色器代码进行编译;运行编译后的着色器代码并链接着色器程序以执行所述编译后的着色器代码生成第二渲染结果。
35.对于上述实现方式,在一些示例中,所述基于所述被回放帧的回放,当检测到所述着色器代码发生改变时通过着色器编译模块将所述修改后的着色器代码进行编译,具体来说,所述着色器程序中的代码即着色器代码,跟传统的c 等语言类似,需要将面向人类的高级语言,例如opengl着色语言(opengl shading language,glsl),其可用于opengl编程开发,通过编译器转成面向机器的二进制指令,二进制指令可转译成汇编代码,上述由高级语言编译成汇编指令的过程通常是在离线阶段执行,以减轻运行时的消耗。
36.本发明实施例中将所述修改后的着色器代码进行编译是通过所述着色器编译模块完成的。所述着色器编译模块具体实施方式可以有以下步骤:1、检测出着色器代码发生改变时,通过glshadersource函数重新把着色器源代码附加到着色器上,例如顶点着色器;2、编译着色器;3、将编译的所述着色器附加到程序对象上;4、重新链接所述着色器。具体代码实现示例如下://当检测出着色器代码发生改变时,重新把着色器源代码附加到着色器上glshadersource(vertexshader, 1, &vertexshadersource, null);//编译着色器glcompileshader(vertexshader);//把编译的着色器附加到程序对象上
glattachshader(shaderprogram, vertexshader);//重新链接着色器gllinkprogram(shaderprogram);对于上述实现方式,在一些示例中,所述运行编译后的着色器代码并链接着色器程序以执行所述编译后的着色器代码生成第二渲染结果,具体来说,所述着色器代码的执行是在gpu中完成的,调用过程为cpu将着色器的二进制指令经由gpu驱动程序推送到gpu,gpu在执行着色器程序中的所述着色器代码时会用上下文将指令分成若干信道推送到各个处理核心的存储空间。在所述着色器代码执行阶段,所述汇编代码会被gpu推送到执行上下文,然后gpu会逐条获取、解码所述汇编指令,并按照所述汇编指令执行指定的操作。
37.具体来说,所述链接着色器的实现方式一般包括:1、创建着色器程序对象;2、将编译的着色器附加到所述着色器程序对象上;3、链接着色器。具体代码实现为://创建着色器程序对象unsigned int shaderprogram;shaderprogram = glcreateprogram();//把上述编译的着色器附加到程序对象上glattachshader(shaderprogram, vertexshader);//链接着色器gllinkprogram(shaderprogram);需要说明的是,对于opengl中存在的应用程序program和着色器shader的关系为,program相当于当前渲染管线所使用的程序,是shader的容器,可以挂载多个shader;而每个shader相当于一个程序部分,用来替代固定渲染管线的可编辑程序。对着色器shader的处理流程为,首先需要对shader脚本进行编译,然后将编译好的shader挂载到program上,在opengl的渲染中使用program来使shader生效。也就是说,shader是专门用来实现不同渲染工序的程序,通过shader可以自定义gpu的shader渲染算法,以使得gpu根据所述shader渲染算法处理所述图形数据中的每一个顶点以及每一个像素点,从而将该画面帧渲染到显示器。
38.对于图4所示的技术方案,在一些可能的实现方式中,所述基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性,还包括:逐像素对比所述第二渲染结果与预期结果的差异,以确定所述第二渲染结果是否与预期结果一致;若所述第二渲染结果与预期结果一致时,则继续下一帧回放;若所述第二渲染结果与预期结果不一致时,则重新返回到所述被回放帧的上一帧位置修改所述着色器代码后继续回放,直到渲染结果与预期结果一致。
39.对于上述实现方式,具体来说,逐像素对比所述第二渲染结果是否与预期结果一致;如果不一致,则继续返回到所述被回放帧上一帧位置,修改所述着色器代码后,继续回放,直到渲染结果达到预期结果;如果一致,则继续下一帧的回放。此过程可以反复操作并且对于特定环境或者装置以及限定条件才能重现的问题,不需要重新设置所述特定环境或限定条件。
40.对于图4所示的技术方案,结合图3绘制一个三角形的可编程管线流程图,参见图5,其示出了本发明实施例提供的一种渲染问题的调试方法操作流程图,具体描述采用渲染问题的调试方法的实施方式,详细的实施方式操作步骤如下:s501:启动被测显卡的渲染问题调试软件;s502:选择需要执行的应用程序;例如,选择需要执行的应用程序为绘制一个三角形,假定在要执行的应用程序命名为myapp,该应用程序是用于使用gpu绘制一个三角形,绘制三角形时使用到的所述第一图形api函数即为绘制一个三角形需要的所有函数,例如顶点函数glvertex3f、光照函数gllightfv、材质函数glmaterialfv、颜色函数glcolor3f以及指定当前程序对象的uniform值gluniform3f等;在应用程序启动前,预先对绘制三角形所需要的所有图形api函数做了hook处理并生成动态链接库。
41.s503:运行绘制三角形的应用程序;对于上述绘制三角形的应用程序,可以在linux命令行输入如下命令调用要执行的应用程序myapp:./myapps504:应用程序执行时调用所述第一图形api函数并生成本地跟踪文件;在应用程序执行时加载并调用所述动态链接库中封装的所有第一图形api函数,具体来说,通过渲染问题调试软件自带的图像api的hook模块调用图形api函数写trace模块,将所述所有第一图形api函数调用顺序及各图形api函数在调用时所使用的参数通过图形api函数写trace模块记录在跟踪文件中并保存到本地,同时所述图像api的hook模块还负责调用真实图形api函数显示渲染图形窗口。
42.s505:回放跟踪文件;使用渲染问题调试软件的跟踪回放模块,按帧回放所述跟踪文件。
43.s506:记录被回放帧的上一帧的上下文参数信息和所有帧缓存数据信息;通过渲染问题调试软件中的上一帧信息保存模块将被回放帧的上一帧的上下文参数信息和所有帧缓存数据信息记录并保存到缓存中。
44.s507:基于所述跟踪文件的回放,提取所述被回放帧对应的着色器代码并显示在界面上;基于所述跟踪文件的回放,例如,使用glshadersource函数提取出集成在应用程序源码中的或存放在单独文件中的所述被回放帧对应的着色器代码保存到缓存中;通过渲染问题调试软件中着色器显示编辑模块将所述着色器代码显示在界面上,并可以实时修改所述着色器代码。
45.s508:判断当前帧图像是否异常;若是,跳转到步骤s511;若否,跳转到步骤s509;s509:判断当前帧是否为最后一帧;若是,跳转到结束;若否,跳转到步骤s510;s510:若当前帧图像渲染结果无异常并且当前帧不是最后一帧,则继续下一帧的回放,并重新跳转到步骤s506,记录所述被回放帧的上一帧的上下文参数信息和帧缓存信息;s511:若当前帧图像渲染结果异常,则返回到被回放帧的上一帧位置;具体来说,如果渲染的三角形的顶点位置与预期结果不一致,则顶点着色器或几
何着色器代码有错误,所述跟踪文件回放过程中,返回到所述被回放帧图像渲染结果异常发生时的上一帧位置;如果渲染三角形颜色与预期结果不一致,片段着色器代码有错误,则返回到所述被回放帧图像渲染结果异常发生时的上一帧位置。
46.s512:分析记录的所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息,当所述信息指示所述着色器代码有错误时,实时修改所述着色器代码;如果渲染的三角形的顶点位置与预期结果不一致,则顶点着色器或几何着色器代码有错误,返回顶点位置异常发生时的上一帧位置,修改顶点着色器或几何着色器代码后,继续所述被回放帧的回放。如果渲染三角形颜色与预期结果不一致,则片段着色器代码有错误,返回到颜色渲染异常时的上一帧位置,修改片段着色器代码后,继续所述被回放帧的回放。
47.s513:基于所述被回放帧的回放,当检测到着色器代码发生修改时,重新编译修改后的着色器代码并链接到着色器程序重新运行;具体来说,渲染问题调试软件的着色器编译模块检测到着色器代码发生修改时,重新编译并链接到着色器程序以执行修改后的着色器代码生成渲染结果,对比所述渲染结果与预期结果的一致性,如果一致,则继续下一帧的回放;如果不一致,继续返回到被回放帧的上一帧位置,修改着色器代码后继续回放,直到渲染结果与预期结果一致。
48.基于前述技术方案相同的发明构思,参见图6,其示出了本发明实施例提供的一种渲染问题调试装置600,所述装置600包括:生成部分601、提取部分602、记录部分603、修改部分604、确定部分605;其中,所述生成部分601,经配置为在应用程序执行时记录图形api函数调用顺序及所使用的参数以生成跟踪文件;所述提取部分602,经配置为按帧回放所述跟踪文件,并在回放过程中提取被回放帧对应的着色器代码,并按照提取出的着色器代码进行渲染生成第一渲染结果;所述记录部分603,经配置为当所述第一渲染结果异常时,返回到所述被回放帧的上一帧位置,记录并保存所述上一帧对应的用于分析和调试的描述信息;其中,所述描述信息至少包括所述被回放帧的上一帧的上下文参数信息和所有帧缓存信息;所述修改部分604,经配置为当所述描述信息指示所述着色器代码有错误时,实时修改所述提取出的着色器代码并保存到缓存中,继续所述被回放帧的回放;所述确定部分605,经配置为基于所述被回放帧的回放,在检测到所述着色器代码发生修改时重新编译和运行修改后的着色器代码以生成第二渲染结果,并确定所述第二渲染结果与预期结果的一致性。
49.在一些示例中,所述生成部分601,经配置为:在应用程序启动前预加载动态链接库;其中,所述动态链接库包括已被hook处理过的所有第一图形api函数;在应用程序执行时调用所述动态链接库中的第一图形api函数并记录所述第一图形api函数调用顺序及所使用的参数写入本地跟踪文件。
50.在一些示例中,所述提取部分602,经配置为:按帧回放所述跟踪文件并基于所述跟踪文件的回放提取被回放帧对应的着色器代码,保存在缓存中并显示在界面上;
应用程序执行时读取所述缓存中提取出的着色器代码,并按照所述提取出的着色器代码进行渲染以生成第一渲染结果。
51.在一些示例中,所述记录部分603,经配置为:逐像素对比第一渲染结果与预期结果之间的差异,若不一致,则判定所述第一渲染结果异常;返回到所述被回放帧的上一帧位置,记录并保存所述被回放帧的上一帧的上下文参数信息、所有帧缓存信息以及着色器信息。
52.在一些示例中,所述确定部分605,经配置为:基于所述被回放帧的回放,当检测到所述着色器代码发生改变时通过着色器编译模块将所述修改后的着色器代码进行编译;运行编译后的着色器代码并链接着色器程序以执行所述编译后的着色器代码生成第二渲染结果。
53.在一些示例中,所述确定部分605,还经配置为:逐像素对比所述第二渲染结果与预期结果的差异,以确定所述第二渲染结果是否与预期结果一致;若所述第二渲染结果与预期结果一致时,则继续下一帧回放;若所述第二渲染结果与预期结果不一致时,则重新返回到所述被回放帧的上一帧位置修改所述着色器代码后继续回放,直到渲染结果与预期结果一致。
54.可以理解地,在本实施例中,“部分”可以是部分电路、部分处理器、部分程序或软件等等,当然也可以是单元,还可以是模块也可以是非模块化的。
55.另外,在本实施例中的各组成部分可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
56.所述集成的单元如果以软件功能模块的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储应用程序代码的介质。
57.因此,本实施例提供了一种计算机存储介质,所述计算机存储介质存储有渲染问题调试的程序,所述渲染问题调试的程序被至少一个处理器执行时实现上述技术方案中所述渲染问题的调试方法的步骤。
58.可以理解地,上述渲染问题调试装置600的示例性技术方案,与前述一种渲染问题的调试方法的技术方案属于同一构思,因此,上述对于渲染问题调试装置600的技术方案未详细描述的细节内容,均可以参见前述一种渲染问题的调试方法的技术方案的描述。本发明实施例对此不做赘述。
59.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何
熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献