1. 1、本文档共56页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
渲染语言.ppt

可编程处理器与着色语言 授课教师:陈荣钦 单位:数信学院 着色语言 用指定的绘制模型对几何元素进行绘制的语言 着色树(Shade Trees) Quake III竞技场中的脚本语言 RenderMan着色语言 顶点/片段处理器中使用的语言 DirectX 9中的高级渲染语言(HLSL) OpenGL的GLSL NVIDIA的CG语言 可以在DirectX和OpenGL使用 CG着色语言 C for Graphics 使用比较广泛: 跨API(DirectXOpenGL) 跨平台(Xbox、Windows、Linux、Mac OS X ) 开发者需要CG 编译器,从 NVIDIA开发 主页下载 GLSL 支持GLSL,需要下载: Glew:从下载 必威体育精装版的显卡驱动(GLSL编译器包含在驱 动程序中):从显卡厂商主页下载 GPU编程基础 GLSL教程——来自lighthouse3d 网址:/opengl/glsl/ 为何选择GLSL? GLSL和CG的功能、性能基本一致,甚至语法也很相近,只是GLSL与OpenGL更加接近。 图形硬件可编程管线介绍 顶点着色器 顶点着色器的输入是顶点数据: 顶点位置:由glVertex3f等指定 顶点颜色:glColor3f、glColorPointer…… 顶点法向:glNormal、glNormalPointer…… 如果开启了可编程管线,下面的OpenGL代码将顶点的位置和颜色发送到顶点着色器 顶点着色器 顶点着色器可以完成以下任务: 使用模型视点矩阵和投影矩阵进行顶点变换 法线变换以及规范化 纹理坐标生成和变换 执行顶点级别的光照计算或者为片段着色器计算某些值 彩色材质应用 上述功能不一定完全使用。但是:如果要执行光照计算,就必须在着色器中实现所有的代码,而不可能让固定管线和可编程管线同时分担上面的工作。 顶点着色器只作用于一个顶点,而不能处理多个顶点的情况。比如,图元装配是在顶点处理之后进行的,无法在顶点着色器内部进行。 必威体育精装版的图形硬件可以在顶点着色器内部访问纹理,称为顶点纹理取样(vertex texture fetch ) 片段着色器 片段着色器的输入是光栅化后的片段值及其相关联的数据、纹理数据等 可以执行的操作: 在插值得到的值上进行操作(从前面的阶段得到) 访问纹理 纹理应用 雾化 计算法线用于执行像素级别的光照 不能让可编程管线和固定管线同时分担上述操作 只作用于一个片段,对邻近片段的访问是不允许的 片段着色器不能访问帧缓存,因此像混合、深度测试、模版测试等操作不能在片段着色器内部使用。 使用GLSL需要的设置 假设我们已经编写了下面两个着色器 检查OpenGL版本 GLSL是OpenGL2.0的一部分,需要检查图形硬件是否支持OpenGL2.0,否则无法执行GLSL着色器。 设置的基本步骤 源代码 如何调试GLSL代码 编译、链接时的错误可以捕捉: GLSL着色器是在GPU中运行的,使用VC等调试器无法进行(调试CPU上执行的代码) GLSL代码一般比较短小 简单的调试技巧:修改一些颜色值来观察效果的变化 OpenGL和GLSL的通信 考虑一个例子:为了在Shader内部执行动画计算,往往需要OpenGL程序传递一个时间timeElapsed变量。 GLSL有两种常用的变量可以在OpenGL中设置: Uniform(一致变量) 用于不经常更改的数据,最多一个图元更改一次,因此不能用于顶点属性(即,不能用于glBegin/glEnd之间) 只读,在OpenGL中设置,在着色器内部不能写入 Attribute(属性变量) 用于顶点属性值的变量,只能在顶点着色器中使用(可以读写),而不能在片段着色器中使用 设置uniform变量 设置步骤: 获取变量的位置(在着色器内部定义) GLint glGetUniformLocation(GLuint program, const char *name); 设置变量值 void glUniform1f(GLint location, GLfloat v0); void glUniform2f(GLint location, GLfloat v0, GLfloat v1); void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLint glUniform{1,2,3,4}fv(GLint location, GLsizei count, GLfloat *v); 设置unifo

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档