Piglit是用来测试OpenGL实现的自动化测试集合。它的目标是通过为开发人员提供执行回归测试的简单方法来帮助提高开源OpenGL驱动程序的质量。它包含Glean测试,一些从Mesa改编的测试以及一些针对某些bug的特定回归测试。
官方git仓库位于: git://anongit.freedesktop.org/git/piglit
piglit运行的脚本在piglit项目top路径下,所以cmake需要在top路径下运行。
运行测试使用如下命令:
其中sanity是指定运行的测试集,results/sanity指定结果存放路径。
piglit中有如下的测试集:
OpenGL 测试集
OpenCL 测试集
Vulkan 测试集
查看上面测试生成的结果使用如下命令:
将会在 summary/sanity/ 目录下生成一个结果的 html 文件:
测试结果会包含的状态如下:
本文同时发布在我的个人博客上: https://dragon_boy.gitee.io
在片元着色器处理片段后,模板测试可以被执行,类似于深度测试,有一些丢弃片段的选项。之后,剩余的片段进行深度测试,OpenGL接着丢弃更多的片段。模板测试基于一种新的缓冲--模板缓冲。一个模板缓冲的值的大小为8bit,每个像素总共由256个不同的模板值。注意:GLFW会自动创建模板缓冲,其它的不一定,根据实际情况而定。下面是模板缓冲的一个例子:
模板缓冲首先用0填充,之后部分位置用一个开放矩形的1阵列填充。在模板测试之后,只有模板值为1的片段会被渲染出来。
使用模板测试的流程大致如下:
接着,记得在渲染循环中清除模板缓冲来更新值:
和深度测试一样,我们可以使用slStencilMask来设置掩码,掩码的值将与模板值进行与运算后写入模板缓冲。默认是设置为0xFF,不影响模板值,当然也可以设置为0x00来将模板值全部置为0(相当于禁止写入):
和深度测试一样,模板测试也有一些特定的方法可以使用来控制模板测试。有两个方法可以使用:glStencilFunc和glStencilOp。
glStencilFunc(GLenum func, GLint ref, GLuint mask)有三个参数:
glStencilFunc只说明了如何通过模板测试和丢弃片段,glStencilOp则说明了如何更新缓冲。
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)的三个参数的说明:
模板测试的其中一个应用是描边,效果如下:
这个应用在游戏中选择物体时非常有用。做法大致如下:
在绘制立方体时,先开启模板测试:
接着在每一帧,如果模板测试和深度测试都成功,我们都替换模板缓冲中的值(接下来由glStencilFunc设置):
我们将物体的模板值均设为1:
接着绘制放大的物体来作为外轮廓,让外轮廓那一圈通过模板测试,并禁止模板缓冲写入:
完整流程如下:
结果如下:
安装首先不可或缺的就是编译器与基本的函式库,如果系统没有安装的话,依照下面的方式安装:
$ sudo apt-get install build-essential
安装OpenGL Library
$ sudo apt-get install libgl1-mesa-dev
安装OpenGL Utilities
$ sudo apt-get install libglu1-mesa-dev
OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。
安装OpenGL Utility Toolkit
$ sudo apt-get install libglut-dev
OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了强化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 对于视窗介面支援。
注意:在这一步的时候,可能会出现以下情况,shell提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libglut-dev
将上述$ sudo apt-get install libglut-dev命令改成$ sudo apt-get install freeglut3-dev即可。
测试
示例test.c源码:
#include <GL/glut.h>
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0)
glMatrixMode(GL_PROJECTION)
glOrtho(-5, 5, -5, 5, 5, 15)
glMatrixMode(GL_MODELVIEW)
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0)
return
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1.0, 0, 0)
glutWireTeapot(3)
glFlush()
return
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv)
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE)
glutInitWindowPosition(0, 0)
glutInitWindowSize(300, 300)
glutCreateWindow("OpenGL 3D View")
init()
glutDisplayFunc(display)
glutMainLoop()
return 0
}
编译程式时,执行以下指令:
$ gcc -o test test.c -lGL -lGLU -lglut
执行:
$ ./test
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)