上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了

OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层

的数据传递到shader中,在shader中完成相应的计算。

  先说下在这一节中,我们要完成的任务,不调用OpenGL的旋转函数(即glRotate××)

系列函数,不使用矩阵完成对模型的旋转。要完成这样的功能,那么我们就只能借住shader

来进行计算,编写shader更多的情况要求我们对数学知识了解到更多,掌握的更多,写shader

就是写一些列的算法,这些算法多数数与数学相关的。今天我们要掌握的知识是:uniform类型

变量的使用。

  看代码:

    uniform float times;
void main( void )
{
float c = cos(times);
float s = sin(times);
vec4 temp = gl_Vertex;
temp.x = gl_Vertex.x * c - gl_Vertex.y * s;
temp.y = gl_Vertex.x * s + gl_Vertex.y * c;
gl_Position = gl_ModelViewProjectionMatrix * temp;
gl_FrontColor = gl_Color;
}

从c/c++语言的角度来看shader,那么times变量就是一个全局变量,在程序中,我们通过使用

这个全局变量,来完成对顶点的旋转工作,沿着z轴。现在纹理来了,我们在显卡中生命的变量

如何才可以在c++的访问。OpenGL扩展api中提供了这样手段来访问uniform类型变量的手段。

看代码:

_times  =   glGetUniformLocationARB( _programObj, "times" );

上面的函数是cpu上执行的函数,_times是一个无符号类型的变量,_programObj也是,在

上一节中已经做过介绍,就是保存程序的句柄或者叫索引。glGetUniformLocationARB函数的

第二个参数就是变量的名称,通过这个名称,我们可以得到这个变量对应的句柄(或者叫索引)

后面通过这个索引我们可以访问shader中的times这个变量了。值得注意到是,这个变量的生存

周期是对全局的。

  通过调用下面的代码,修改shader中times的值:

static  float xxx = ;

glUseProgramObjectARB( _programObj );
glUniform1fARB(_times,xxx); xxx += 0.01f;
if (xxx > 3.14f)
{
xxx = ;
}

这样就将times的值修改了。大家可以慢慢体会这个过程,可以想象一下程序执行的过程,下一例程

将给大家展示如何在vertex shader中声明例外一个类型的变量。

代码下载

OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)的更多相关文章

  1. OpenGL12-shader(GLSL)着色语言1(代码已上传)

    OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...

  2. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  3. OpenGL12-shader(GLSL)着色语言3-(属性参数)(代码已上传)

    上一个例程中,使用了uniform 类型的变量,uniform可以理解为全局变量,这一节中使用 的是attribute类型的变量,翻译过来就是属性,他是与顶点绑定的,就意味着一个顶点可以 有很多个属性 ...

  4. OpenGL12-shader(GLSL)着色语言4-广告版的实现

    之前介绍了vertex shader的基本原理,现在我们来做一个简单的实践,在游戏中广告版(布告版) 随处可见,而且效率很高,现在我们就使用shader来实现这一过程,首先我们要知道布告版的原理 实际 ...

  5. 着色语言(Shader Language)

    摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...

  6. win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)

    一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...

  7. DirectX9:高级着色语言(HLSL)

    一.简介 高级着色语言(High)可以编写顶点着色器和像素着色器,取代固定功能流水线中的部分功能,在图形卡的GPU(Graphics Processing Unit,图形处理单元)中执行 注意:如果图 ...

  8. OPENGL学习笔记整理(五):着色语言

    有些事情本身就是十分奇怪的.在传统上,图形硬件的设计目的是用于快速执行相同的硬编译指令集.不同的计算步骤可以被跳过,参数可以被调整,但计算本身确实固定不变的.然而,随着技术的发展,却越来越变得可以编程 ...

  9. Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.

    这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...

随机推荐

  1. WPF图形图像相关类

    BitmapMetadata类: 继承自抽象类ImageMetadata,包含图像的原数据信息,如相机型号.图像修改程序名称.拍照日期.拍照地点等.ImageSoure类包含ImageMetadata ...

  2. golang闭包里的坑

    介绍 go的闭包是一个很有用的东西.但是如果你不了解闭包是如何工作的,那么他也会给你带来一堆的bug.这里我会拿出Go In Action这本书的一部分代码,来说一说在使用闭包的时候可能遇到的坑.全部 ...

  3. Xcode svn import项目 上传.a文件(静态库)

    在终端使用命令 touch 项目所在文件夹 svn import 项目文件夹 https://服务器地址 -m "iPad import" 这样就把项目上传到服务器上了!但是不能把 ...

  4. mysql 可重复执行添加列

    DROP PROCEDURE IF EXISTS `add_column_if`; CREATE PROCEDURE `add_column_if`(IN v_table varchar(), IN ...

  5. vim 安装vim-javascript插件--Vundle管理

    最近看了一下node.js,但是写的时候,vim对js没有很好的提示.于是就安装插件来处理,准备安装vim-javascript.但是安装github上面的插件时,推荐用Vundle和pathogen ...

  6. datename和datepart

    select datename(year, getdate()) + 'aaa11' --不报错 datename返回的是nvarchar类型 select datalength(datename(y ...

  7. WPF 自定义快速实现线程等待函数FastTask

    在WPF实现 我们常常需要实现这个目标:线程里面执行复杂的任务,然后主窗体等待动画 我把我最简单的东西给包了一下,更方便使用,大家也可以方便使用 1:添加CommHelper类 FastTask方法 ...

  8. UCS2-little endian转码(utf16)

    public static void readFile(){ BufferedReader in = null; try { in = new BufferedReader(new InputStre ...

  9. C博客第03次作业---函数

    1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 首先,对于学习了函数的我来说是很开心的,因为学了函数之后可以解决很多以前不懂的问题,可以说函数是C语言中 ...

  10. vhosetuser 和 vhostuservlient 差异

    Open vSwitch支持的vHost-user类型 在Open vSwitch中vHost User通过socket进行通信,模式为client-server,其中server端负责创建/管理/销 ...