OpenGL: 按列存储矩阵(column-major)。调用API形成的矩阵用来和一个列向量相乘,矩阵在左,列向量在右
GLSL: 存储方式和OpenGL相同(column-major)
DirectX: 按行存储矩阵(row-major)。调用API形成的矩阵用来和一个行向量相乘,矩阵在右,行向量在左
HLSL: 存储方式和DirectX相反(column-major)
因此,若HLSL的矩阵也是用来右乘行向量,则应将DX API构造的矩阵做Transpose,这样数学上HLSL会将Transpose后的矩阵视为 和DX API构造的矩阵是同一个矩阵,但是实际数值的存储顺序不同。若用来将矩阵左乘列向量,则可以不必做Transpose。
因此,一般的传入shader的操作是原封不动的将用来存储矩阵的array导入shader。但是如果是用的effect system里的setMatrix(), 则会先自动将矩阵由row-major改为colunn-major存储,再将其导入shader。这种情况下则无需在导入前手动Transpose 矩阵。
2010年10月30日星期六
2010年2月12日星期五
编写GLSL及其glew需要注意的几个问题
GLSL
1.uniform variable is read-only.
2.给float变量赋值要加.0
3.类型转换是int(variable)而不是(int)variable
4.数组index若用vaiable访问(no matter read or write) 则必须事先定义好大小.若index只用constant则不必
glew
1.要在main中调用glewInit(),否则程序运行到某些库函数时会产生异常,但编译不会报错
2.setShader()部分要在glutMainLoop()之前,否则shader会不起作用
3.GLboolean glewIsSupported (const char* name)可用来检测是否对某个extension支持
4.某些extension对其余extension会有dependence.这时需要在shader起始位置加上类似下面的语句
#extension GL_EXT_gpu_shader4 : enable
1.uniform variable is read-only.
2.给float变量赋值要加.0
3.类型转换是int(variable)而不是(int)variable
4.数组index若用vaiable访问(no matter read or write) 则必须事先定义好大小.若index只用constant则不必
glew
1.要在main中调用glewInit(),否则程序运行到某些库函数时会产生异常,但编译不会报错
2.setShader()部分要在glutMainLoop()之前,否则shader会不起作用
3.GLboolean glewIsSupported (const char* name)可用来检测是否对某个extension支持
4.某些extension对其余extension会有dependence.这时需要在shader起始位置加上类似下面的语句
#extension GL_EXT_gpu_shader4 : enable
订阅:
博文 (Atom)