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

上一个例程中,使用了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-(属性参数)(代码已上传)的更多相关文章
- OpenGL12-shader(GLSL)着色语言1(代码已上传)
OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...
- OpenGL12-shader(GLSL)着色语言4-广告版的实现
之前介绍了vertex shader的基本原理,现在我们来做一个简单的实践,在游戏中广告版(布告版) 随处可见,而且效率很高,现在我们就使用shader来实现这一过程,首先我们要知道布告版的原理 实际 ...
- PHP语言学习之php做图片上传功能
本文主要向大家介绍了PHP语言学习之php做图片上传功能,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 今天来做一个图片上传功能的插件,首先做一个html文件:text.php < ...
- C++向main函数传递参数的方法(实例已上传至github)
通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...
- servlet3.0获取参数与文件上传代码示例
转: servlet3.0获取参数与文件上传代码示例 2018年08月26日 20:25:35 苏凯勇往直前 阅读数:98 package com.igeek.servlet; import ...
- Http multipart/form-data多参数Post方式上传数据
最近,工作中遇到需要使用java实现http发送get.post请求,简单的之前经常用到,但是这次遇到了上传文件的情况,之前也没深入了解过上传文件的实现,这次才知道通过post接口也可以,是否还有其他 ...
- GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...
- OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)
上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...
- OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传
视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...
随机推荐
- 让tableView的某行移动到tableView的某位置
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lineNumber inSection:0]; [lrcTableView selectR ...
- bootstrap-treeview 关于checkbox选择框不显示的问题
bootstrap-treeview.js 1.0.2 不支持checkbox,最后使用 bootstrap-treeview.js 1.2.0 解决此问题.
- hdu 5038 求出现次数最多的grade
http://acm.hdu.edu.cn/showproblem.php?pid=5038 模拟水题 求出现次数最多的grade.如果有多个grade出现的次数一样多,且还有其他的grade,则把这 ...
- eclipse中java build path下 allow output folders for source folders 无法勾选,该如何解决 eclipse中java build path下 allow output folders for source folders 无法勾选,
在创建maven工程时,在设置output folders时,总是勾选以后,老是自动恢复到原来的状态,对比其他的maven的工程发现是在创建maven时候选择的项目为pom,而不是war或者jar,将 ...
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
实战一 , 实战二 介绍了ActiveMQ的基本概念和配置方式. 本篇将通过一个实例介绍使用spring发送,消费topic, queue类型消息的方法. 不懂topic和queue的google 之 ...
- Type conversions in C++类型转换
###Implicit conversions隐式转换* 可以在基本类型之间自由转换:* 可以把任何类型的pointer转换为void pointer:* 可以将子类pointer转换为基类point ...
- 构建NetCore应用框架之实战篇(三):BitAdminCore框架功能规划选择
本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.BitAdminCore功能规划 如何选择框架的落地功能,前篇文章 ...
- asp.net MVC 统计在线人数功能实现
今天开发一个设计一个统计在线人数的统计.实现方式是在MVC 中,用户次执行一个Action请求完成后,向数据表中插入一条用户心跳记录,统计在线人数则是根据该记录,30分钟内有记录的用户则为在线状态. ...
- c# 合并重叠时间段的算法
c# 合并重叠时间段的算法 一.采用非排序: 方案一: 使用递归算法,如不喜欢递归的伙伴们,可以使用whie代替. 1.文件:Extract_Chao.cs(核心) using System; usi ...
- Java并发工具类之线程间数据交换工具Exchanger
Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换.它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据.两个线程通过exchange方法交换数据,如果一个线程执行exch ...