起步

又有好些天没来更新了,实在是愧对我的朋友们:( 公司最近的事情稍微有点忙,最近一直都是这样,赶进度,没办法,天底下做项目的都一样。好不容易腾点时间出来看了看专业方面的书,就赶紧来和大家分享一下读书的心得。先把《黄玫瑰》放起先~^_^ 在公司做360项目,看来最多的就是shader了。从某种角度上来说,shader是不分语言的,或者说是各种图形api都能够提供shader开发的功能(只要api的供应商乐意),因为从本质上讲这是由gpu的架构决定的——它是"programmable"的话,那么shader就可以在它上面应用。这样一来,我就有了更多的选择,要知道我可买不起360开发机(也没人能卖给我),家里也没有win pc ——我便盯上了OpenGL。在OpenGL 2里,shader功能已经是标配,名曰Opengl Shading Language (GLSL),在2之前的某个版本里shader已经通过扩展的形式出现了。 shader是什么呢?初学时我也问这个问题。就好象普通的程序一样,shader也可以被看着是一种程序。普通的程序运行在cpu上(不管是cisc, risc等),而shader运行在gpu上,由gpu负责执行其指令。cpu什么都可以做,但gpu却不是万能的。gpu的主要功能是渲染图形,将图像结构绘制到frame buffer中,显示到屏幕上,因此shader的效果就是控制gpu如何去渲染图形。由于gpu的架构特点,它的可编程能力一般只限于vertex和pixel的处理上(Opengl中称之为fragment,为了便于理解,我们均使用pixel这个名称),所以shader也就分为vertex shader和pixel shader。注意,如果在渲染过程中程序未指定任何shader,那么gpu(或说是图形api更准确一点)便用传统的fixed function来代替shader,即与不具备可编程能力的图形芯片处理效果一致。如果仅有vertex shader,则pixel shader将就fixed function来代替,同理对pixel shader。 跟普通的应用程序开发一样,shader也分为源码编辑、编译、链接和运行几个基本的环节,同时它还具备一些自己特有的不同之处。要创建一个shader,首先要为shader指定一段源程序,opengl提供的api中,该“源程序”是一段asc字符串,而在其他的3d api中,可能是一个asc纯文本文件,这依api的不同而不同。在指定源程序之后,接下来的工作便是“编译”,即把源程序编译为二进制代码(针对gpu的)。如果编译成功,那么接下来的工作便是链接。通过链接,把多个shader组成一个具备完整渲染功能的shader程序(通常是一个vertex shader加上一个pixel shader)。链接成功之后,你就可以使用你的shader程序了。在opengl中它的用法跟设置渲染状态类似,设定使用该shader之后,所有执行的渲染动作将按照你的shader来进行,除非你关闭它或指定另一个新的shader程序对象。 我们拿GLSL来举例说明一下(通过函数名称我们基本上就可以了解这个函数的用途)。 1. 创建shader对象:GLuint glCreateShader(GLenum shaderType)。 shaderType是vertex shader或pixel shader中的一种,由常量GL_VERTEX_SHADER和GL_FRAGMENT_SHADER来表示——后者就是我们常说的pixel shader。函数返回一个整型值,类似于句柄,用来管理shader对象。 2. 为shader对象指定源程序:void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length)。 shader便是我们创建时生成的那个“句柄”;count是string的个数;length数组则是记录了每个string的长度(如果它们不是以'/0'结尾的话)。当字符串以'/0'结尾,那么length实际上就没有必要了。这个函数执行的实际动作是把源代码拷贝到了shader对象的缓存中。 3. 编译shader对象:void glCompileShader(GLuint shader)。 该函数执行shader的编译动作。函数没有返回值,如果编译失败怎么办?GLSL将把编译的结果(失败,成功等)写到shader对象的状态值中,可以通过glGetShader函数查询GL_COMPILE_STATUS来得到。同时,如果失败的话,还可以通过又有好些天没来更新了,实在是愧对我的朋友们:( 公司最近的事情稍微有点忙,最近一直都是这样,赶进度,没办法,天底下做项目的都一样。好不容易腾点时间出来看了看专业方面的书,就赶紧来和大家分享一下读书的心得。先把《黄玫瑰》放起先~^_^ 在公司做360项目,看来最多的就是shader了。从某种角度上来说,shader是不分语言的,或者说是各种图形api都能够提供shader开发的功能(只要api的供应商乐意),因为从本质上讲这是由gpu的架构决定的——它是"programmable"的话,那么shader就可以在它上面应用。这样一来,我就有了更多的选择,要知道我可买不起360开发机(也没人能卖给我),家里也没有win pc ——我便盯上了OpenGL。在OpenGL 2里,shader功能已经是标配,名曰Opengl Shading Language (GLSL),在2之前的某个版本里shader已经通过扩展的形式出现了。 shader是什么呢?初学时我也问这个问题。就好象普通的程序一样,shader也可以被看着是一种程序。普通的程序运行在cpu上(不管是cisc, risc等),而shader运行在gpu上,由gpu负责执行其指令。cpu什么都可以做,但gpu却不是万能的。gpu的主要功能是渲染图形,将图像结构绘制到frame buffer中,显示到屏幕上,因此shader的效果就是控制gpu如何去渲染图形。由于gpu的架构特点,它的可编程能力一般只限于vertex和pixel的处理上(Opengl中称之为fragment,为了便于理解,我们均使用pixel这个名称),所以shader也就分为vertex shader和pixel shader。注意,如果在渲染过程中程序未指定任何shader,那么gpu(或说是图形api更准确一点)便用传统的fixed function来代替shader,即与不具备可编程能力的图形芯片处理效果一致。如果仅有vertex shader,则pixel shader将就fixed function来代替,同理对pixel shader。 跟普通的应用程序开发一样,shader也分为源码编辑、编译、链接和运行几个基本的环节,同时它还具备一些自己特有的不同之处。要创建一个shader,首先要为shader指定一段源程序,opengl提供的api中,该“源程序”是一段asc字符串,而在其他的3d api中,可能是一个asc纯文本文件,这依api的不同而不同。在指定源程序之后,接下来的工作便是“编译”,即把源程序编译为二进制代码(针对gpu的)。如果编译成功,那么接下来的工作便是链接。通过链接,把多个shader组成一个具备完整渲染功能的shader程序(通常是一个vertex shader加上一个pixel shader)。链接成功之后,你就可以使用你的shader程序了。在opengl中它的用法跟设置渲染状态类似,设定使用该shader之后,所有执行的渲染动作将按照你的shader来进行,除非你关闭它或指定另一个新的shader程序对象。 我们拿GLSL来举例说明一下(通过函数名称我们基本上就可以了解这个函数的用途)。 1. 创建shader对象:GLuint glCreateShader(GLenum shaderType)。 shaderType是vertex shader或pixel shader中的一种,由常量GL_VERTEX_SHADER和GL_FRAGMENT_SHADER来表示——后者就是我们常说的pixel shader。函数返回一个整型值,类似于句柄,用来管理shader对象。 2. 为shader对象指定源程序:void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length)。 shader便是我们创建时生成的那个“句柄”;count是string的个数;length数组则是记录了每个string的长度(如果它们不是以'/0'结尾的话)。当字符串以'/0'结尾,那么length实际上就没有必要了。这个函数执行的实际动作是把源代码拷贝到了shader对象的缓存中。 3. 编译shader对象:void glCompileShader(GLuint shader)。 该函数执行shader的编译动作。函数没有返回值,如果编译失败怎么办?GLSL将把编译的结果(失败,成功等)写到shader对象的状态值中,可以通过glGetShader函数查询GL_COMPILE_STATUS来得到。同时,如果失败的话,还可以通过glGetShaderInfoLog来查询日志来了解详细的内容。 4. 创建shader程序对象:GLuint glCreateProgram(void)。 它跟glCreateShader类似,创建的程序对象由返回的整型值来标识,在链接和使用时都需要用到这个值,一定要保存好了^_^。 5. 关联shader对象和程序:void glAttachShader(GLuint program, GLuint shader)。 这个函数告诉GLSL把某个shader加入到program的链接列表(这个词是我自己起的,反正就是这个作用)中,这样在链接时GLSL才知道要把哪些shader对象组装成为一个shader程序。 6. 链接shader程序:void glLinkProgram(GLuint program)。 7. 使用shader程序:void glUseProgram(GLuint program)。 调用了glUseProgram之后,gpu便会乖乖地按照你的意图进行渲染了。还是挺简单的吧? 今天先写到这儿,明天再跟大家聊聊如何与shader进行数据通讯。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值