`
tiankefeng0520
  • 浏览: 146847 次
  • 性别: 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.rar_OPENGL 纹理_Opengl纹理_opengl添加纹理_opengl纹理贴图

    OpenGL是一种强大的图形库,用于在...总的来说,这个压缩包提供了一个学习和实践OpenGL纹理处理的好机会,涵盖了从基本概念到实际编码的全过程,对于任何想要提升OpenGL图形编程技能的人来说都是一份宝贵的学习资料。

    OpenGl所有函数库

    2.GLUT中的函数:如glutInit、glutCreateWindow、glutDisplayFunc等,用于初始化和管理窗口。 3.GLU(OpenGL Utility Library):提供了高级图形函数,如投影、平移、旋转等辅助功能。 4.GLUT和GLU中的函数如...

    openGL中二维纹理的生成

    本程序提供了二维纹理生成的代码示例,非常适合初学者学习和理解OpenGL的纹理操作。 首先,要生成二维纹理,你需要了解以下几个关键步骤: 1. **加载纹理图像**:通常,我们从文件中加载图像数据,如.jpg、.png或....

    Qt下Opengl纹理映射实例:正方体(可拖动旋转)

    在本实例中,我们将深入探讨如何在Qt环境下...通过学习和实践这个项目,你可以掌握OpenGL纹理映射、Qt的OpenGL集成、以及事件驱动的用户交互设计。同时,了解如何组织和管理Qt项目的源代码和构建过程也是相当重要的。

    OPENGL_TEXTURE.zip_OPENGL 纹理_Opengl纹理_opengl 贴图_opengl贴图_贴图

    首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像属性。在OpenGL中,纹理可以被看作是存储在GPU内存中的图像,可以在渲染过程中快速访问。通过将...

    Texture_openGL.rar_OPENGL 纹理_Opengl纹理_opengl 贴图_三维纹理_三维纹理贴图

    学习和理解OpenGL纹理技术对于开发游戏、可视化软件或其他图形密集型应用至关重要。通过实践这样的示例,开发者能够更好地掌握如何在实际项目中高效地利用纹理来提升图形表现力。此外,对于三维纹理的理解,也有助于...

    OpenGL.rar_OPENGL 纹理_opengl_opengl 纹理贴图_opengl纹理贴图_镂空效果

    通过学习这些资源,开发者可以深入理解OpenGL纹理贴图和镂空效果的实现方法,并将其应用到自己的项目中。 总之,OpenGL的纹理贴图技术和镂空效果是提升3D图形表现力的重要手段。通过理解和掌握这些概念,开发者可以...

    opengles多重纹理与过程纹理

    OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的精简版本...通过研究这些资源,你可以深入学习如何在OpenGL ES环境中实现这两种纹理技术,并应用于自己的项目中,创建出更为丰富多样的3D图形效果。

    opengl纹理映射的例子。

    OpenGL纹理映射是一种在3D图形编程中广泛应用的技术,它允许我们将二维图像(通常称为纹理)贴附到3D模型的表面,以增加视觉细节和真实感。在本例中,我们将探讨如何利用Microsoft Foundation Class (MFC)库与OpenGL...

    OpenGL入门学习之十一——纹理的使用入门.pdf

    ### OpenGL入门学习之十一——纹理的使用入门 #### 一、纹理的概念与基本操作 **纹理**是OpenGL中一种非常重要的特性,它允许开发者在3D模型表面贴上图像,以此来增强场景的真实感和细节表现力。纹理的使用不仅...

    基于OpenGL的三维物体纹理贴图研究

    ### 基于OpenGL的三维物体纹理贴图研究 #### 1. 引言 在三维图形绘制领域,为了能够真实地再现复杂场景,仅依靠基本的几何形状往往是不够的。现实世界的物体表面通常具有丰富的纹理特征,这些纹理特征极大地增加了...

    OpenGL.rar_OPENGL 纹理_OPENGL光照_OpenGL光照纹理_opengl 光照

    OpenGL是一种广泛应用于游戏开发、图形渲染和科学可视化等领域...要深入学习和理解这些概念,你可以查看压缩包内的源代码、教程或示例,这将有助于你亲自动手实践OpenGL的纹理和光照技术,进一步提升你的图形编程能力。

    openGL.zip_OPENGL旋转圆锥_opengl_opengl圆柱_opengl圆锥_site:www.pudn.com

    这些函数包括设置颜色、坐标、纹理等。在OpenGL中,我们通常使用顶点数据来定义几何形状,比如圆锥、圆柱和球体。 1. **OpenGL旋转圆锥**: 圆锥的表示可以通过一组同心圆上的点(底面)和一个中心点(顶点)来...

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

    OpenGL函数实现纹理映射与三维旋转变换是计算机图形学中的关键技能,广泛应用于游戏开发、可视化工具和专业软件中。在MFC(Microsoft Foundation Classes)框架下进行OpenGL编程,可以构建用户友好的图形界面,并...

    在OpenGL中,使用纹理显示图形.rar_OPENGL 纹理_Opengl纹理_纹理OpenGL

    OpenGL是一种强大的图形库,用于创建2D和3D图形,被广泛应用于游戏开发、科学可视化、工程设计等领域。在OpenGL中,纹理是图形渲染的重要组成...通过阅读和学习这些代码,你将能够更好地理解OpenGL纹理工作的全过程。

    OpenGL绘制八大行星纹理贴图

    OpenGL是计算机图形学中的...通过学习和实践这些知识点,你将能够创建一个展示八大行星的OpenGL程序,每个行星都有其独特的纹理贴图,呈现出逼真的太阳系景象。同时,这也将帮助你深入理解3D图形渲染的核心原理和技术。

    OpenGL纹理贴图的实例+PPT原理介绍

    总的来说,OpenGL纹理贴图是提升3D图形质量的重要手段,通过学习和实践,可以创建出更加真实和生动的3D场景。这份"OpenGL纹理贴图的实例+PPT原理介绍"资料,对于理解和掌握这一技术将非常有帮助。通过实验第八课:...

    openglexercise01_opengl_基础openGL图形坐标变换、纹理映射_

    OpenGL支持一维、二维和三维纹理,但在实践中,最常用的是二维纹理。创建纹理涉及加载图像数据,然后使用glGenTextures生成纹理ID,glBindTexture绑定纹理,以及glTexImage2D或glTexSubImage2D上传纹理数据。为了将...

    OpenGL ES 纹理实例

    纹理是OpenGL ES中一种关键的视觉元素,它们可以理解为二维图像,用于装饰和丰富3D模型表面。在OpenGL ES中,纹理不仅可以提高渲染效率,还能实现复杂的视觉效果,如光照、反射和纹理映射。 首先,要使用OpenGL ES...

    opengl基本框架带纹理映射

    在“opengl基本框架带纹理映射”这个主题中,我们将深入探讨如何构建一个基本的OpenGL应用程序,并了解如何应用纹理映射来增强图形的表现力。 一、OpenGL框架构建 一个基础的OpenGL程序通常包括以下几个步骤: 1. ...

Global site tag (gtag.js) - Google Analytics