上一个例程中,使用了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. 设置p标签可编辑

    一,只可编辑,粘贴复制字段长度不正常 <p contenteditable="true" >这是一个可编辑内容的p标签啦啦~</p> 二,可编辑,可粘贴复制 ...

  2. SpringMVC 示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  3. Android SDK目录结构

    Android版本下载:从4.0到8.0版本: Android SDK目录结构图: sdk全称:software develop kits 软件开发工具集 add-ons:Google API map ...

  4. 在Windows 7上安装Team Foundation Server(TFS)的代理服务器(Agent)

    自2009年微软发布Windows 7以来,经过8年的市场验证,Windows 7已经成为史上应用最为广泛的操作系统.但是面对技术变化的日新月异,2015年微软正式停止了对Windows 7的主流支持 ...

  5. js实现回车登陆

    2018-11-15 $(document).keydown(function (event) { if (event.keyCode == 13) { $("#LoginBtn" ...

  6. Unity3d ugui 实现image代码换图

    核心脚本代码 Image IMGE = transform.Find("IMGE").GetComponent<Image>();Sprite sprite1 = Re ...

  7. C# 二维码/条形码入门操作

    效果图: 先给之前的群友道个歉,说声不好意思.QRCoder 只支持二维码,没有条形码. 以上demo生成条形码是用 BarcodeLib 这个库,识别是用 zxing,二维码生成用 QRCoder, ...

  8. .net core 读取本地指定目录下的文件

    项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...

  9. ASP.NET Core使用EPPlus操作Excel

    1.前言 本篇文章通过ASP.NET Core的EPPlus包去操作Excel(导入导出),其使用原理与NPOI类似,导出Excel的时候不需要电脑上安装office,非常好用 2.使用 新建一个AS ...

  10. VS2017集成FastReport.Net并将模板保存到数据库

    本着开发与实施分离的思想,设计一个通用的报表设计窗体显得尤为重要(下图为图一): 要求与优点: I.报表设计窗体支持所有单据调用,一种单据支持多个打印模板. II.报表模板存储在数据库中.一是支持客户 ...