OpenGL学习二十:纹理函数

通过纹理函数(glTexEnv*())可以把纹理图像的颜色与物体表面的原先的颜色进行混合

当我们指定纹理数据时,其第三个参数internalformat可以简化为6种格式

基本内部格式 所提取的源颜色(R,G,B,A)
GL_ALPHA (0,0,0,A)
GL_LUMINANCE (L,L,L,1)
GL_LUMINANCE_ALPHA (L,L,L,A)
GL_INTENSITY (I,I,I,I)
GL_RGB (R,G,B,1)
GL_RGBA (R,G,B,A)

void glTexEnvf (GLenum target, GLenum pname, GLfloat param);
如果target是GL_TEXTURE_FILTER_CONTROL pname必须是GL_TEXTURE_LOD_BIAS,param是个浮点数表示mipmap细节层的偏移量

target是GL_TEXTURE_ENV情况下
GL_TEXTURE_ENV_MODE GL_DECAL,GL_REPLACE,GL_BLEND,GL_MODULATE,GL_ADD或GL_COMBINE
GL_TEXTURE_ENV_COLOR 包含4个浮点值的RGBA数组

GL_REPLACE,GL_MODULATE,GL_DECAL纹理函数
s表示纹理的源颜色
f表示新的片段值
c表示用GL_TEXURE_ENV_COLOR分配的颜色值
如果没有下标,表示最终计算所得的颜色
  GL_REPLACE GL_MODULATE GL_DECAL
GL_ALPHA C=Cf A=As C=Cf A=AsAf 未定义
GL_LUMINANCE C=Cs A=Af C=CfCs A=Af 未定义
GL_LUMINANCE_ALPHA C=Cs A=As C=CfCs A=AsAf 未定义
GL_INTENSITY C=Cf A=Cs C=CfCs A=AsAf 未定义
GL_RGB C=Cs A=Af C=CfCs A=Af C=Cs A=Af
GL_RGBA C=Cs A=As C=CfCs A=AsAf C=Cf(1-As)+CsAs A=Af
GL_BLEND,GL_ADD 纹理函数

  GL_BLEND GL_ADD
GL_ALPHA C=Cf A=AfAs C=Cf A=AsAf
GL_LUMINANCE C=Cf(1-Cs)+CcCs A=Af C=Cf+Cs A=Af
GL_LUMINANCE_ALPHA C=Cf(2-Cs)+CcCs A=AfAs C=Cf+Cs A=AsAf
GL_INTENSITY C=Cf(3-Cs)+CcCs A=Af(1-As)+AcAs C=Cf+Cs A=Af+As
GL_RGB C=Cf(4-Cs)+CcCs A=Af C=Cf+Cs A=Af
GL_RGBA C=Cf(5-Cs)+CcCs A=AfAs C=Cf+Cs A=AfAs

#include "header.h"

#define	checkImageWidth 16
#define	checkImageHeight 16
GLubyte checkImage[checkImageWidth][checkImageHeight][4];
int texName;

enum InternalFormat
{
	alpha='a',
	luminance='b',
	luminance_alpha='c',
    intensity='d',
	rgb,
	rgba
};
enum Env
{
	ADD='A',
	BLEND='B',
	REPLACE='R',
	MODULATE='M',
	DECAL='D'
};
void makeImage()
{
	int i,j;
	for ( i=0;i


你可能感兴趣的:(OpenGL)