通过纹理函数(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中纹理函数有帮助。
18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...
熟悉OpenGL MFC图形开发框架,实现OpenGL纹理映射与三维旋转变换。
调试通过的加载纹理函数,可以将jpg文件自动转为bmp文件加载
OpenGL由大量功能强大的图形函数组成,它集成了所有曲面造型、图形变换、光照、材质、纹理、像素操作、融合、反选择、雾化等复杂的计算机图形学算法。开发人员可以利用这些函数对整个三维图形轻松进行渲染,从而...
OpenGLES20是安卓源码树下的opengl开发例子工程,用eclipse建的工程,我在里面加上了地球和月亮的球体+纹理,还有用点精灵绘画的夜空星星。纯粹是工作之余学习记录,有需要的下载参考,我也是参考网上的帖子搞的。...
Nate Robin的OpenGL教程程序代码,它允许用户修改函数参数,以交互方式观察代码效果。包括坐标\模型变换、光照、雾和纹理,它们具有可移植性,并且使用了GLUT。
易语言OpenGL教程第36课渲染到纹理源码例程程序结合易语言OpenGL支持库,调用API函数实现纹理渲染效果。点评:易语言OpenGL教程第36课渲染到纹理源码仅供参考。@易语言难学吗。
第一章OpenGL使人们进入三维图形世界 第二章OpenGL基本理解 ...第十二章OpenGL纹理映射 第十三章OpenGL复杂图元建模 第十四章OpenGL光照模型 第十五章OpenGL的三个特殊效果处理 第十六章OpenGL显示列表
最新版OpenGL 2.1 Reference 函数速查手册CHM格式 ------------ 1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上...
虽然这个教程很小,不过觉得内容挺全的,一共分二大部分:Jeff Molofee的OpenGL教程和OPenGL基础图形编程教程,在Jeff Molofee的OpenGL教程里,你将学习第一个OPENGL三角形的生成、着色、转起来、向3D进军、纹理映射...
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绘制茶杯 要求: 任意茶杯模型 需求分析: 1、界面要求: 提供全屏和窗口两种显示模式,仅显示图形,界面简单。 2、功能要求: 提供基本的旋转操作,便于观察。 3、性能要求 ...
为了实现二次曲面的纹理映射在分析OpenGL纹理映射技术的基础上,详细讨论了球形曲面纹理坐标的生成和设置,然后利用OpenGL函数库,在VC++环境下,实现了雷达天线罩迷彩纹理贴图的效果展示,
用Cfree5做的基于 Assimp OpenGL Devil图像库做的3D模型读取...3.Assimp导入,OpenGL的3D模型读取,显示,用DevIL读取纹理进行贴图。 4.Dll的动态加载API函数。 5.拖动可见区域移动窗口。 6.保存HBITMAP到文件的代码。
易语言OpenGL教程第36课渲染到纹理源码例程程序结合易语言OpenGL支持库,调用API函数实现纹理渲染效果。点评:易语言OpenGL教程第36课渲染到纹理源码仅供参考。
使用C#调用Opengl函数库,实现纹理贴图功能。OpenGL函数库用的是第三方库CSGL。