上一个例程中,使用了uniform 类型的变量,uniform可以理解为全局变量,这一节中使用

的是attribute类型的变量,翻译过来就是属性,他是与顶点绑定的,就意味着一个顶点可以

有很多个属性(当然也可以没有),提出这个概念的原因是啥呢?我们先看下最早期的OpenGL

早己的OpenGL定义的数据比较少,有顶点,法线,颜色,纹理(1.0版本),也就是说一个

顶点可以传递给显卡的数据是有限的,没有办法在像显卡传递更多的数据参与计算,例如,现在

游戏中比较流线的法线贴图(或者叫凹凸纹理)是做不到,为了满足这样的应用场合,提出了顶点

属性这样一个概念,目的就是,传递更多的数据给显卡,参与计算,显示更好的效果。

知道这个目的了,也就知道该咋用这个东西,看下面的定义:

struct Vertex
{
//! 这里是颜色数据,可以通过OpenGL的glColorPonter来传递
//! 这里我们通过另外的途径来传递(属性)
float r, g, b, a;
float x, y, z;
};

结构体中定义了颜色和顶点位置,但这一次,颜色数据不是通过OpenGL的函数进行传递,而是通过

属性字段进行传递,用来展示如何使用这一系列的api。

            uniform float times;
attribute vec4 attrColor;
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 = attrColor;
}

红色的是在上一个例程中多增加的部分,就是在应用层中用来传递顶点颜色使用的变量。

_attrColor  =   glGetAttribLocationARB( _programObj, "attrColor" );

应用层中,通过调用上面的函数,获取attrColor变量的句柄。当我们获取到句柄以后,就

可以给他传递数据。但我们还是需要再做一些事情:如下所示:

glUseProgramObjectARB( _programObj );

  该数据告诉显卡,下面我们要使用该程序(shader)去执行顶点的处理过程,如果要

取消使用shader处理,则参数传递0取消定点过程处理,如下所示:

glUseProgramObjectARB(  );

接下来调用下面的函数启动属性索引。

glEnableVertexAttribArray(_attrColor);

启动这个属性(看名字,就知道是顶点属性数组)。当启用了这个属性以后,可以

调用下面的api将应用层数据传递给shader了:

glVertexAttribPointer(_attrColor,,GL_FLOAT,GL_FALSE,sizeof(Vertex),g_cubeVertices);

该函数的参数意义如下:

第一个参数:属性的句柄(或者叫索引)

第二个参数:是传递的数据元素的维度,在这里我们传递的是颜色,r,g,b,a四个,就是一个元素中含

四个成员。

第三个参数:是元素的类型:这个我用用的是float

第四个参数:是否规格化,一般我们不做。传递GL_FALSE

第五个参数:描述了元素之间的偏移量,就是对最后一个参数中数据的描述,当访问完第一组数据以后

在下一个元素在什么位置,通过该变量进行计算。

第六个参数:数据指针,这个传递的是实际的数据地址。当然如果我们使用了顶点缓冲区,就可以给0

glVertexPointer(,GL_FLOAT,sizeof(Vertex),&g_cubeVertices[].x);

这个函数是调用传统的OpenGL函数传递顶点数据给显卡。

最后进行进行绘制。

glDrawArrays( GL_QUADS, ,  );

该函数参数如下:

第一个参数说明要绘制图元的类型,四边形。

第二个参数说明从哪一个元素就行绘制

第三个参数说明绘制元素的个数。

渲染函数如下:

 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

            glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, - ); static float xxx = ; glUseProgramObjectARB( );
glUniform1fARB(_times,xxx); xxx += 0.01f;
if (xxx > 3.14f)
{
xxx = ;
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableVertexAttribArray(_attrColor);
glVertexAttribPointer(_attrColor,,GL_FLOAT,GL_FALSE,sizeof(Vertex),g_cubeVertices);
glVertexPointer(,GL_FLOAT,sizeof(Vertex),&g_cubeVertices[].x);
glDrawArrays( GL_QUADS, , ); SwapBuffers( _hDC );

代码下载

OpenGL12-shader(GLSL)着色语言3-(属性参数)(代码已上传)的更多相关文章

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

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

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

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

  3. PHP语言学习之php做图片上传功能

    本文主要向大家介绍了PHP语言学习之php做图片上传功能,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 今天来做一个图片上传功能的插件,首先做一个html文件:text.php < ...

  4. C++向main函数传递参数的方法(实例已上传至github)

    通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...

  5. servlet3.0获取参数与文件上传代码示例

    转: servlet3.0获取参数与文件上传代码示例 2018年08月26日 20:25:35 苏凯勇往直前 阅读数:98   package com.igeek.servlet;   import ...

  6. Http multipart/form-data多参数Post方式上传数据

    最近,工作中遇到需要使用java实现http发送get.post请求,简单的之前经常用到,但是这次遇到了上传文件的情况,之前也没深入了解过上传文件的实现,这次才知道通过post接口也可以,是否还有其他 ...

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

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

  8. OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)

    上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...

  9. OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...

随机推荐

  1. Python初学者的捷径[译]

    下面列出的都是这些年总结的Python的有用的知识点和一些工具.希望对你有所帮助! 交换变量值 x = 6 y = 5 x, y = y, x print x >>> 5 print ...

  2. SSH:Struts + Spring + Hibernate 轻量级Java EE企业框架

    Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本.这个版本以前称为 J2EE.能够帮助我们开 ...

  3. day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)

    A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执 ...

  4. Spark RDD详解

    1.RDD是什么 RDD(Resilient Distributed Dataset):是Spark的核心数据结构,指的是一个只读的.可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多 ...

  5. What if you are involved in an automobile accident in the US

    What if you are involved in an automobile accident in the US With increasing Chinese tourists and vi ...

  6. FreeBSD下面安装PostgreSQL。

    1.确认pkg版本大于1.1.4,可以用pkg -v查看,如果小于此版本,请升级.2.在/usr/local/etc/pkg.conf文件中,删除掉repository相关的语句,像PACKAGESI ...

  7. python中的 += 与 +

    这一部分首先要理解python内存机制,Python中万物皆对象. 对于不可变对象,改变了原来的值,其别名(变量名)绑定到了新值上面,id肯定会改变 对于可变对象,+ 操作改变了值,id肯定会变,而+ ...

  8. .net core Memcached使用

    首先,你要在你电脑上安装配置好Memcached环境哦 Startup类的ConfigureServices中加入 //memcachedcore1 services.AddEnyimMemcache ...

  9. C# 下载文件 删除文件 写入文本

    由于经常用到文件处理,便自己封装了下 分享给大家. 包含写入文本  批量删除文件  下载文件 .--可直接使用 /// <summary> /// 写入到txt /// </summ ...

  10. php CI框架log写入

    1.首先,打开application下的config.php文件,将log配置打开如下 /* |---------------------------------------------------- ...