通过纹理函数(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图形编程技能的人来说都是一份宝贵的学习资料。
2.GLUT中的函数:如glutInit、glutCreateWindow、glutDisplayFunc等,用于初始化和管理窗口。 3.GLU(OpenGL Utility Library):提供了高级图形函数,如投影、平移、旋转等辅助功能。 4.GLUT和GLU中的函数如...
本程序提供了二维纹理生成的代码示例,非常适合初学者学习和理解OpenGL的纹理操作。 首先,要生成二维纹理,你需要了解以下几个关键步骤: 1. **加载纹理图像**:通常,我们从文件中加载图像数据,如.jpg、.png或....
在本实例中,我们将深入探讨如何在Qt环境下...通过学习和实践这个项目,你可以掌握OpenGL纹理映射、Qt的OpenGL集成、以及事件驱动的用户交互设计。同时,了解如何组织和管理Qt项目的源代码和构建过程也是相当重要的。
首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像属性。在OpenGL中,纹理可以被看作是存储在GPU内存中的图像,可以在渲染过程中快速访问。通过将...
学习和理解OpenGL纹理技术对于开发游戏、可视化软件或其他图形密集型应用至关重要。通过实践这样的示例,开发者能够更好地掌握如何在实际项目中高效地利用纹理来提升图形表现力。此外,对于三维纹理的理解,也有助于...
通过学习这些资源,开发者可以深入理解OpenGL纹理贴图和镂空效果的实现方法,并将其应用到自己的项目中。 总之,OpenGL的纹理贴图技术和镂空效果是提升3D图形表现力的重要手段。通过理解和掌握这些概念,开发者可以...
OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的精简版本...通过研究这些资源,你可以深入学习如何在OpenGL ES环境中实现这两种纹理技术,并应用于自己的项目中,创建出更为丰富多样的3D图形效果。
OpenGL纹理映射是一种在3D图形编程中广泛应用的技术,它允许我们将二维图像(通常称为纹理)贴附到3D模型的表面,以增加视觉细节和真实感。在本例中,我们将探讨如何利用Microsoft Foundation Class (MFC)库与OpenGL...
### OpenGL入门学习之十一——纹理的使用入门 #### 一、纹理的概念与基本操作 **纹理**是OpenGL中一种非常重要的特性,它允许开发者在3D模型表面贴上图像,以此来增强场景的真实感和细节表现力。纹理的使用不仅...
### 基于OpenGL的三维物体纹理贴图研究 #### 1. 引言 在三维图形绘制领域,为了能够真实地再现复杂场景,仅依靠基本的几何形状往往是不够的。现实世界的物体表面通常具有丰富的纹理特征,这些纹理特征极大地增加了...
OpenGL是一种广泛应用于游戏开发、图形渲染和科学可视化等领域...要深入学习和理解这些概念,你可以查看压缩包内的源代码、教程或示例,这将有助于你亲自动手实践OpenGL的纹理和光照技术,进一步提升你的图形编程能力。
这些函数包括设置颜色、坐标、纹理等。在OpenGL中,我们通常使用顶点数据来定义几何形状,比如圆锥、圆柱和球体。 1. **OpenGL旋转圆锥**: 圆锥的表示可以通过一组同心圆上的点(底面)和一个中心点(顶点)来...
OpenGL函数实现纹理映射与三维旋转变换是计算机图形学中的关键技能,广泛应用于游戏开发、可视化工具和专业软件中。在MFC(Microsoft Foundation Classes)框架下进行OpenGL编程,可以构建用户友好的图形界面,并...
OpenGL是一种强大的图形库,用于创建2D和3D图形,被广泛应用于游戏开发、科学可视化、工程设计等领域。在OpenGL中,纹理是图形渲染的重要组成...通过阅读和学习这些代码,你将能够更好地理解OpenGL纹理工作的全过程。
OpenGL是计算机图形学中的...通过学习和实践这些知识点,你将能够创建一个展示八大行星的OpenGL程序,每个行星都有其独特的纹理贴图,呈现出逼真的太阳系景象。同时,这也将帮助你深入理解3D图形渲染的核心原理和技术。
总的来说,OpenGL纹理贴图是提升3D图形质量的重要手段,通过学习和实践,可以创建出更加真实和生动的3D场景。这份"OpenGL纹理贴图的实例+PPT原理介绍"资料,对于理解和掌握这一技术将非常有帮助。通过实验第八课:...
OpenGL支持一维、二维和三维纹理,但在实践中,最常用的是二维纹理。创建纹理涉及加载图像数据,然后使用glGenTextures生成纹理ID,glBindTexture绑定纹理,以及glTexImage2D或glTexSubImage2D上传纹理数据。为了将...
纹理是OpenGL ES中一种关键的视觉元素,它们可以理解为二维图像,用于装饰和丰富3D模型表面。在OpenGL ES中,纹理不仅可以提高渲染效率,还能实现复杂的视觉效果,如光照、反射和纹理映射。 首先,要使用OpenGL ES...
在“opengl基本框架带纹理映射”这个主题中,我们将深入探讨如何构建一个基本的OpenGL应用程序,并了解如何应用纹理映射来增强图形的表现力。 一、OpenGL框架构建 一个基础的OpenGL程序通常包括以下几个步骤: 1. ...