GlTexImage2D(Glenum target,Glint level,Glint internalformat,Glsizei width,Glsizei height,Glint border,Glenum format,Glenum type,const Glvoid *pixels)
targe 必须是GL_TEXTURE_2D。
level: 系统自动生成纹理 (MipMap:1,2),当设置为0时,单分辨率纹理图像,设置为1时候,分辨率为原大小的1/2,必须大于等于0
internalformat:有效取值范围为 GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE,GL_LUMINANCE_ALPHA. 这个值和format参数必须是一样的。
GL_ALPHA (0, 0, 0, A)
GL_LUMINANCE (1, 1, 1, 1)
GL_LUMINANCE_ALPHA (1, 1, 1, A)
GL_RGB (R, G, B, 1)
GL_RGBA (R, G, B, A)
Width和Height必须是2的整数幂,如果有边界,则必须是2的整数幂+2。
Border为0代表无边框,1代表纹理有边框
format和internalformat一样。
Type: 此参数决定了pixel中的一个像素的比特组成,GL_UNSIGNED_BYTE为1位。此位通常为元像素(r+g+b)/3得出:
for (int y = 0; y < mHeight; y++)
{
short* yp = (short*)((int)data.Scan0 + data.Stride * y);
for (int x = 0; x < mWidth; x++, pixCount++)
{
short* p = (short*)(yp + x);
short pixel = *p;
byte b = (byte)((pixel & 0x1F) << 3);
byte g = (byte)(((pixel >> 5) & 0x3F) << 2);
byte r = (byte)(((pixel >> 11) & 0x1F) << 3);
byte totalAlpha = (byte)((r + g + b) / 3);
alphaBytes[pixCount] = totalAlpha;
}
}
当type取_5_6_5,_4_4_4_4或者5_5_5_1时,代表每一个pixel中每一个short型包含了rgb三原色或者rgba。
//5_6_5 : rrrrrggggggbbbbb
//4_4_4_4: rrrrggggbbbbaaaa
//5_5_5_1:rrrrrgggggbbbbba
Pixel中第一个像素为坐下点,最后一个为右上点。从左往右,从下往上循环
GL_ALPHA: 数组中每个元素只是一个ALPHA值,系统根据这个值和所设定的ALPHA过滤方法来判断显示不显示这个像素,而且不管原来的Bitmap此像素点是什么颜色,最后画出来的一概是白色。
纹理映射方式混合和相加:
基本内部格式 |
GL_BLEND |
GL_ADD |
GL_ALPHA |
C = Cf A = AfAs |
C = Cf A = AfAs |
GL_RGB |
C = Cf(1 - Cs) + CcCs A = Af |
C = Cf + Cs A = Af |
GL_RGBA |
C = Cf(1 - Cs) + CcCs A = AfAs |
C = Cf + Cs
|
内部格式为GL_RGB和GL_RGBA时, 片元颜色的各个分量与纹理中相应的分量相乘, alpha值也同片元alpha相乘. 光照适合使用纹理映射方式调整.
纹理映射方式相加将纹理颜色和片元颜色相加, 如有alpha值, 其乘以片元的alpha值, 但内部格式为GL_INTENSITY时除外.这种情况纹理alpha值与片元alpha值相加.
未完