OpenGL中用矩阵调色板混合顶点

原创 2007年10月14日 17:07:00

扩展:

GL_ARB_matrix_palette

GL_ARB_vertex_blend

 

顶点混合函数:

V = V*Mat[0]*Weight[1] + V*Mat[1]*Weight[1] + … + V*Mat[n]*Weight[n]

 

  OpenGL增加了前面两个ARB扩展以支持矩阵调色板合顶点混合,这两项功能是硬件实现骨骼动画的基础。首先要用glEnbale( GL_MATRIX_PALETTE_ARB )glEnable( GL_VERTEX_BLEND_ARB )激活这两项功能,然后使用glMatrixMode( GL_MATRIX_PALETTE_ARB )将当前矩阵切换成矩阵调色板。

  在激活矩阵调色板之后,原来的GL_MODELVIEW(包括GL_MODELVIEWn)都不再起作用,顶点混合结果是在摄像机空间(世界坐标系)中的。但是一般我们的骨骼变换矩阵都是基于本地空间的,因此在绘制之前还要做点小动作。

  矩阵调色板的大小由不同的实现决定,用glGetIntegerv( GL_MAX_PALETTE_MATRICES_ARB , &I )可以获得调色板大小。矩阵调色板栈大小至少为1matrix_palette_arb扩展说明上说该栈基本上不需要更大,而且更大的栈也浪费空间,具体栈大小可以通过glGetIntergerv( GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB , &I )获得。

  其他的懒得说,直接看下面的例子吧(说明上抄的):

 

glEnable( GL_MATRIX_PALETTE_ARB );

glEnable( GL_VERTEX_BLEND_ARB );

// 获得顶点单元数量和矩阵调色板大小。顶点单元数量即一个顶点最多能用多少个骨骼

glGetIntegerv(MAX_VERTEX_UNITS_ARB, *max_blends);
glGetIntegerv(MAX_PALETTE_MATRICES_ARB, *max_matrices);
// 激活
0-3顶点单元
glEnable(VERTEX_UNIT_0_ARB);
glEnable(VERTEX_UNIT_1_ARB);
glEnable(VERTEX_UNIT_2_ARB);
glEnable(VERTEX_UNIT_3_ARB);
// 保存视图变换矩阵(摄像机变换)

Float mv[16];

glGetFloatv( GL_MODELVIEW );

// 加载矩阵调色板

glMatrixMode(MATRIX_PALETTE_ARB);
for (i=0; i<palette_size; i++)
{
glCurrentPaletteMatrix(i);
// 选择调色板中的当前矩阵

glLoadMatrix( mv );
gl
MultiMatrix(bone_mat[i]);
}
// 顶点数组、纹理坐标数组等数组分开来的做法

// 激活数组状态
glEnableClientState(VERTEX_ARRAY);
glEnableClientState(NORMAL_ARRAY);
glEnableClientState(COLOR_ARRAY);
glEnableClientState(TEXTURE_COORD_ARRAY);
glEnableClientState(WEIGHT_ARRAY_ARB);
glEnableClientState(MATRIX_INDEX_ARRAY_ARB);
glVertexPointer(3, FLOAT, 3, vertices);
glNormalPointer(FLOAT, 3, normals);
glColorPointer(4, UNSIGNED_BYTE, 4, colors);
glTexCoordPointer(4, FLOAT, 4, texcoords);
glWeightPointerARB(4, FLOAT, 4, weights);
glMatrixIndexPointerARB(4, UNSIGNED_BYTE, 4, indices);
// 绘制三角形

glDrawArrays(TRIANGLES, 0, vert_array_size);

 

 

// 绘图数据合在一起的做法(有点像DX中的FVF

typdef struct st_interleaved_vertex {
FLOAT position[4];
FLOAT weights[4];
UNSIGNED_BYTE indices[4];
FLOAT normal[3];
FLOAT color[4];
FLOAT texcoord[4];
} interleaved_vertex;
interleaved_vertex vertices[NUM_VERTS];
// the rest as above, except the Array Pointer definition:
int stride = sizeof(interleaved_vertex);
glVertexPointer( 3, FLOAT, stride, &(vertices[0].position) );
glNormalPointer( FLOAT, stride, &(vertices[0].normal) );
glColorPointer( 4, UNSIGNED_BYTE, stride, &(vertices[0].color) );
glTexCoordPointer( 4, FLOAT, stride, &(vertices[0].texcoords) );
glWeightPointerARB( 4, FLOAT, stride, &(vertices[0].weights) );
glMatrixIndexPointerARB( 4, UNSIGNED_BYTE, stride,
&(vertices[0].indices) );

 

OpenGL--顶点数组与缓冲区中使用顶点数组

理论基础 法线向量:简称法线,是一条垂直于某个表面的方向向量。opengl中除了顶点之外,不能为多边形的其他地方分配法线。法线的作用是定义了物体的表面在空间中的方向,具体地说就是,定义了它相对于光...
  • u010223072
  • u010223072
  • 2015年03月21日 17:43
  • 2186

OpenGL系列教程之六:OpenGL顶点数组

相关主题:顶点缓冲区,显示列表 下载:vertexArray.zip,vertexArray2.zip 概述 初始化 glDrawArrays() glDrawElements() glDrawR...
  • u012501459
  • u012501459
  • 2013年10月22日 11:18
  • 2847

OpenGL顶点数据传输速度优化

前言最近在给cocos2d-x v2.x的一个项目做渲染优化,执行渲染批处理(Batch)的时候,发现顶点数据传输速度很慢,实在是颠覆了我的OpenGL认知。 常规的Batch原理: · 将...
  • you_lan_hai
  • you_lan_hai
  • 2016年03月27日 21:42
  • 2361

OpenGL使用顶点数组进行图形的绘制

#include #include static GLfloat spin = 0.0; #define PI 3.1415926 GLint circle_points = 100; stati...
  • sgnyyy
  • sgnyyy
  • 2016年09月13日 16:47
  • 744

OpenGL顶点数组

当我们人为的绘制形状时,首先想到是是坐标点,而不是api,如要绘制一条直线,首先将两个点的坐标存在一起,则更加容易理解,OpenGL的顶点数组就是这样的作用. 首先来回顾下之前画直线的函数 示例1...
  • wang15061955806
  • wang15061955806
  • 2015年10月15日 21:06
  • 912

【一步步学OpenGL 2】-《你好顶点》

你好顶点原文:http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html背景这里要第一次开始使用GLEW(the OpenGL Extensi...
  • cordova
  • cordova
  • 2016年09月10日 00:10
  • 10450

OpenGL顶点缓冲区一步步分析

这次讲的所有内容都装在一个立方体中,呵呵。 呵呵,绘制一个立方体,简单呀,我们学了第一课第二课,早就会了。 先别着急,立方体是很简单,但是这里只是拿立方体做一个例子,来说明OpenGL在绘制方法上的改...
  • sgnyyy
  • sgnyyy
  • 2016年09月13日 17:59
  • 1118

OpenGL ES中的顶点数组、顶点属性、缓冲区对象

什么是顶点数据? 在计算机中图元的位置是通过x,y,z,w来存储或颜色数据是通过RGBA的数组格式存储的,然后通过多个点来进行图元装配和光栅化出图形.比如三角形3个点使用X,Y,Z表示如下: ...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2015年06月25日 18:17
  • 3493

OPENGL-ES之顶点索引绘图

在学习OpenGLES时遇到一个概念,索引缓存。网上查资料大部分代码均是针对安卓或者桌面平台的,而且大部分的代码拷贝下来不能达到效果。经过几天的努力,终于了解了索引绘图的概念,所谓索引绘图是一种在绘制...
  • enghou123
  • enghou123
  • 2016年09月18日 14:03
  • 812

Opengl学习程序之顶点颜色和位置设置

gouraud.vert#version 330 core layout(location = 0) in vec4 vPosition; layout(location = 1) in vec4 v...
  • SHIYUEDYX
  • SHIYUEDYX
  • 2017年02月15日 15:30
  • 869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL中用矩阵调色板混合顶点
举报原因:
原因补充:

(最多只允许输入30个字)