您的位置:首页 > 运维架构

GLSL教程 OpenGL Setup for GLSL 创建着色器程序

2010-12-22 17:42 375 查看
下图展示了创建着色器程序并使之运行的必要步骤:



第一步:创建程序容器对象。用于此目的的函数返回一个指向程序容器对象的句柄。

在OpenGL 2.0中,该函数是:

GLuint glCreateProgram(void);

如果使用ARB扩展,该函数是:

GLhandleARB glCreateProgramObjectARB(void);

你可以根据自己的需要,创建足够多的着色器程序。一旦开始渲染,你可以在渲染单个帧的过程中,从一个着色器程序切换到另一个另一个着色器程序,你甚至可以切回到固定功能管线。例如你可以使用refraction和reflection着色器渲染一个茶壶,却使用OpenGL的固定功能管线渲染一个立方体地图作为背景。

下一步:将上一小节创建的着色器链接到刚才创建的程序。在这一步,不需要再编译着色器,这些着色器甚至可以没有源代码。将着色器链接到程序所需的是着色器容器对象。

在OpenGL 2.0中,将着色器链接到程序的函数是:

void glAttachShader(GLuint program, GLuint shader);

Parameters:

program - 程序句柄.
shader - 你想链接的着色器句柄.

如果使用ARB扩展,该函数是:

void glAttachObjectARB(GLhandleARB program, GLhandleARB shader);

Parameters:

program - 程序句柄.
shader - 你想链接的着色器句柄.

如果你有一对顶点/片段着色器,那么你需要将两者均链接到程序。就像一个C程序能有很多模块一样,你可以将多个同类型(顶点或片段)的着色器链接到同一个程序。对于每种类型的着色器,只有一个着色器能有main函数,C语言也是如此。

你可以将同一个着色器链接到多个程序。例如你可以在多个程序中使用相同的顶点着色器。

最后一步:链接程序。为了执行这一步。所有着色器都必须被编译。

在OpenGL2.0中,该链接函数是:

void glLinkProgram(GLuint program);

Parameters:

program - 程序句柄.

在ARB扩展中,该函数是:

void glLinkProgramARB(GLhandleARB program);

Parameters:

program - 程序句柄.

链接操作结束后,你就可以在不影响程序的情况下修改着色器源码、重编译着色器。

如上图所示,链接程序之后,有一个函数用于装载和使用该程序,该函数是glUseProgramObjectARB(ARB扩展)或glUseProgram(OpenGL2.0)。每个程序都对应一个句柄,你可以根据你的需要(你的硬件允许),链接做够多的程序以备使用。

在OpenGL2.0中,该函数如下:

void glUseProgram(GLuint prog);

Parameters:

prog - the handler to the program you want to use, or zero to return to fixed functionality

如果使用ARB扩展,该函数是:

void glUseProgramObjectARB(GLhandleARB prog);

Parameters:

prog - the handler to the program you want to use, or zero to return to fixed functionality

当一个程序正在使用的时候,如果你再次链接它,它将被自动置于应用,因此在这种情况下你没有必要在调用glUseProgram。如果参数为0,OpenGL就会恢复固定功能管线的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: