`
tiankefeng0520
  • 浏览: 143494 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

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<checkImageWidth;i++)
	{
		for (j = 0; j < checkImageHeight; j++)
		{
			if(j%2==0)
			{
				checkImage[i][j][0]=255;
				checkImage[i][j][1]=0;
				checkImage[i][j][2]=0;
				checkImage[i][j][3]=100;

			}else
			{
				checkImage[i][j][0]=0;
				checkImage[i][j][1]=255;
				checkImage[i][j][2]=0;
				checkImage[i][j][3]=200;
			}

		}
	}
}


void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	
	glBlendFunc(GL_SRC_ALPHA,GL_ZERO);

	glBindTexture(GL_TEXTURE_2D,texName);
	glEnable(GL_BLEND);
	glBegin(GL_QUADS);

	glTexCoord2i(0,0); glVertex2i(-100,-100);
	glTexCoord2i(4,0); glVertex2i(100,-100);
	glTexCoord2i(4,4); glVertex2i(100,100);
	glTexCoord2i(0,4); glVertex2i(-100,100);

	glEnd();
	glFlush();
}


void init()
{
	
	GLfloat  white[] = { 1.0, 1.0, 1.0, 1.0 };
	glClearColor(0.5,0.5,0.5,1);
	glClearDepth(1.0);
	makeImage();

	glEnable(GL_DEPTH_TEST);					
	glDepthFunc(GL_LEQUAL);	
	glShadeModel(GL_SMOOTH);


	glGenTextures(1,&texName);                                                                                                                                                                                                                                                                                              
	glBindTexture(GL_TEXTURE_2D,texName);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
	//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
	glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
	glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);


	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 
		0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
	glEnable(GL_TEXTURE_2D);
}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(-200,600,-300,300,-100,100);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void keyboard(unsigned char key,int x,int y)
{
	switch(key)
	{
	case alpha:
	
		glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 16, 
			0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
		glBlendFunc(GL_SRC_ALPHA,GL_ZERO);
	
		glBindTexture(GL_TEXTURE_2D,texName);
		glEnable(GL_BLEND);
		glEnable(GL_TEXTURE_2D);
		break;
	
	case luminance:

		glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 
			0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
	
		glBindTexture(GL_TEXTURE_2D,texName);
		glEnable(GL_TEXTURE_2D);
		glDisable(GL_BLEND);
		break;
	case luminance_alpha:

		glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 16, 
			0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

		glBlendFunc(GL_SRC_ALPHA,GL_ZERO);

		glBindTexture(GL_TEXTURE_2D,texName);
		glEnable(GL_BLEND);
		glEnable(GL_TEXTURE_2D);
	
		break;
	case rgba:

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 
			0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

		glBlendFunc(GL_SRC_ALPHA,GL_ZERO);

		glBindTexture(GL_TEXTURE_2D,texName);
		glEnable(GL_BLEND);
		glEnable(GL_TEXTURE_2D);

		break;
	case rgb:

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 
			0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

		glBlendFunc(GL_SRC_ALPHA,GL_ZERO);

		glBindTexture(GL_TEXTURE_2D,texName);
		glEnable(GL_BLEND);
		glEnable(GL_TEXTURE_2D);

		break;

	case ADD:
	
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);


	break;
	case MODULATE:

		//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);

		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		break;
	case DECAL:
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
		break;
	case BLEND:
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
		break;
	}	


	glutPostRedisplay();
}

void mouse(int button,int state,int x,int y)
{ 

}

int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
	glutInitWindowSize(800,600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("纹理函数");
	glewInit();
	init();
	glutDisplayFunc(display);
	glutKeyboardFunc(keyboard);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutMainLoop();
}

 

分享到:
评论

相关推荐

    openGL中二维纹理的生成

    该程序给出了openGL中二位纹理生成代码,对于初学者来说理解openGL中纹理函数有帮助。

    学习OpenGL必备教程nehe_opengl_chs.chm & 全部课程的源程序

    18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...

    OpenGL函数实现纹理映射与三维旋转变换

    熟悉OpenGL MFC图形开发框架,实现OpenGL纹理映射与三维旋转变换。

    OPENGL多纹理程序

    调试通过的加载纹理函数,可以将jpg文件自动转为bmp文件加载

    OpenGL_参考手册.rar

    OpenGL由大量功能强大的图形函数组成,它集成了所有曲面造型、图形变换、光照、材质、纹理、像素操作、融合、反选择、雾化等复杂的计算机图形学算法。开发人员可以利用这些函数对整个三维图形轻松进行渲染,从而...

    OpenGLES20地月球体加纹理

    OpenGLES20是安卓源码树下的opengl开发例子工程,用eclipse建的工程,我在里面加上了地球和月亮的球体+纹理,还有用点精灵绘画的夜空星星。纯粹是工作之余学习记录,有需要的下载参考,我也是参考网上的帖子搞的。...

    OpenGL-tutors.rar_nate robin_nate robin opengl_opengl 交互_纹理参数

    Nate Robin的OpenGL教程程序代码,它允许用户修改函数参数,以交互方式观察代码效果。包括坐标\模型变换、光照、雾和纹理,它们具有可移植性,并且使用了GLUT。

    易语言OpenGL教程第36课渲染到纹理源码

    易语言OpenGL教程第36课渲染到纹理源码例程程序结合易语言OpenGL支持库,调用API函数实现纹理渲染效果。点评:易语言OpenGL教程第36课渲染到纹理源码仅供参考。@易语言难学吗。

    OpenGL基础图形编程

    第一章OpenGL使人们进入三维图形世界 第二章OpenGL基本理解 ...第十二章OpenGL纹理映射 第十三章OpenGL复杂图元建模 第十四章OpenGL光照模型 第十五章OpenGL的三个特殊效果处理 第十六章OpenGL显示列表

    OpenGL 2.1 Reference 函数速查手册(CHM格式最新版)

    最新版OpenGL 2.1 Reference 函数速查手册CHM格式 ------------ 1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上...

    OpenGL 开发教程chm

    虽然这个教程很小,不过觉得内容挺全的,一共分二大部分:Jeff Molofee的OpenGL教程和OPenGL基础图形编程教程,在Jeff Molofee的OpenGL教程里,你将学习第一个OPENGL三角形的生成、着色、转起来、向3D进军、纹理映射...

    OpenGL编程指南.pdf

    2.9.1例子:创建一个二十面体 第3章视图 3.1简介:照相机比喻 3.2.1一个简单的例子:绘制立方体 3.1.2通用的变换函数 3.2视图和模型变换 3.2.1对变换进行思考 3.2.2模型变换 3.2.3视图变换 3.3投影变换 3.3.1透视...

    Opengl绘制茶杯

    用opengl绘制的茶杯,问题描述: OPENGL绘制茶杯 要求: 任意茶杯模型 需求分析: 1、界面要求: 提供全屏和窗口两种显示模式,仅显示图形,界面简单。 2、功能要求: 提供基本的旋转操作,便于观察。 3、性能要求 ...

    OpenGL 二次曲面纹理映射技术分析与应用 (2009年)

    为了实现二次曲面的纹理映射在分析OpenGL纹理映射技术的基础上,详细讨论了球形曲面纹理坐标的生成和设置,然后利用OpenGL函数库,在VC++环境下,实现了雷达天线罩迷彩纹理贴图的效果展示,

    基于Assmip,OpenGL直接绘制3D模型到内存DC及透明窗口-WOW希瓦纳斯带纹理

    用Cfree5做的基于 Assimp OpenGL Devil图像库做的3D模型读取...3.Assimp导入,OpenGL的3D模型读取,显示,用DevIL读取纹理进行贴图。 4.Dll的动态加载API函数。 5.拖动可见区域移动窗口。 6.保存HBITMAP到文件的代码。

    e语言-易语言OpenGL教程第36课渲染到纹理

    易语言OpenGL教程第36课渲染到纹理源码例程程序结合易语言OpenGL支持库,调用API函数实现纹理渲染效果。点评:易语言OpenGL教程第36课渲染到纹理源码仅供参考。

    C#写的Opengl程序

    使用C#调用Opengl函数库,实现纹理贴图功能。OpenGL函数库用的是第三方库CSGL。

Global site tag (gtag.js) - Google Analytics