glTexImage2D()

二维纹理定义的函数

void glTexImage2D(GLenum target,

                               GLint level,

                               GLint components,

                               GLsizei width,

                               glsizei height,

                               GLint border,

                               GLenum format,

                               GLenum type,

                               const GLvoid *pixels);

  定义一个二维纹理映射。其中参数target是常数GL_TEXTURE_2D。参数level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0。

  参数components是一个从1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合,1表示选择了R分量,2表示选择了R和A两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、A四个分量。

  参数width和height给出了纹理图像的长度和宽度,参数border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值。纹理映射的最大尺寸依赖于OpenGL,但它至少必须是使用64x64(若带边界为66x66),若width和height设置为0,则纹理映射有效地关闭。

  参数format和type描述了纹理映射的格式和数据类型,它们在这里的意义与在函数glDrawPixels()中的意义相同,事实上,纹理数据与glDrawPixels()所用的数据有同样的格式。参数format可以是GL_COLOR_INDEX、GL_RGB、GL_RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_LUMINANCE或GL_LUMINANCE_ALPHA(注意:不能用GL_STENCIL_INDEX和GL_DEPTH_COMPONENT)。类似地,参数type是GL_BYPE、GL_UNSIGNED_BYTE、GL_SHORT、 GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT或GL_BITMAP。

  参数pixels包含了纹理图像数据,这个数据描述了纹理图像本身和它的边界。

--------------------------------------------------寂寞的分割线-----------------------------------------------------------------

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
A = AfAs
 


内部格式为GL_RGB和GL_RGBA时, 片元颜色的各个分量与纹理中相应的分量相乘, alpha值也同片元alpha相乘. 光照适合使用纹理映射方式调整.

纹理映射方式相加将纹理颜色和片元颜色相加, 如有alpha值, 其乘以片元的alpha值, 但内部格式为GL_INTENSITY时除外.这种情况纹理alpha值与片元alpha值相加.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/HopeAlwaysHere/archive/2010/02/02/5279811.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值