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) );

 

osg与opengl混合渲染

-
  • 1970年01月01日 08:00

OpenGL中调色板的使用

OpenGL中调色板的使用目 录  1 调色板的知识  2 颜色表示与转换  3 调色板的生成算法  4 设置调色板的例子---------------------------------------...
  • guo_wangwei
  • guo_wangwei
  • 2006-06-16 09:42:00
  • 2273

第5课:OpenGL中的颜色设置

 RGB模式和RGBA模式   计算机屏幕的颜色属于RGB空间。   通常有RGB模式和RGBA模式,其中RGB模式有R、G、B三个分量,取值范围为0.0~1.0;而RGBA模式有R、G、B、A四个分...
  • sky2098
  • sky2098
  • 2007-04-17 13:09:00
  • 9987

OpenGL 学习笔记-顶点数组(颜色)

原文地址:http://www.cnblogs.com/Clingingboy/archive/2010/10/16/1853304.html 当我们人为的绘制形状时,首先想到是是坐标点,而不是ap...
  • happypretty
  • happypretty
  • 2012-12-11 09:49:41
  • 1502

颜色矩阵原理解析

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。 这些效果在android中有很好的支持,通过颜色矩阵(ColorMatri...
  • u010335298
  • u010335298
  • 2016-07-19 16:35:14
  • 5101

OpenGL编程(一)渲染一个指定颜色的背景窗口

上次已经搭好了OpenGL编程的环境。已经成功运行了第一个程序。可只是照搬书上的代码,并没弄懂其中的原理。这次通过一个小程序来解释使用GLUT库编写OpenGL程序的过程。 程序的入口 与其他程序一...
  • chenxiqilin
  • chenxiqilin
  • 2016-03-07 22:55:40
  • 4034

opengl的调色板

1、Windows下的调色板  OpenGL可以使用16色、256色、64K和16M真彩色。真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果,因此对OpenGL而言,调色板只有在2...
  • www_sw
  • www_sw
  • 2009-03-18 08:30:00
  • 338

OpenGL---颜色

RGB颜色void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); //清除颜色 glColor3f(0.0f, 1...
  • u012319493
  • u012319493
  • 2016-07-16 14:24:52
  • 713

<em>OpenGL</em>里面的一些颜色设置和图形绘制用的函数

2010-10-14 上传大小:7KB <em>OpenGL</em> 有个是 颜色的 设置。 还有一个 就是 正方形,正方体,多边体,茶壶 之类的 辅助函数 综合评分:5 收藏评论(1)举报 ...
  • 2018年04月20日 00:00

opengl的调色板

1、Windows下的调色板  OpenGL可以使用16色、256色、64K和16M真彩色。真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果,因此对OpenGL而言,调色板只有在2...
  • www_sw
  • www_sw
  • 2009-03-18 08:30:00
  • 264
收藏助手
不良信息举报
您举报文章:OpenGL中用矩阵调色板混合顶点
举报原因:
原因补充:

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