OpenGL学习二十:纹理函数
来源:互联网 发布:post请求数据加密 编辑:程序博客网 时间:2024/04/30 23:46
通过纹理函数(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细节层的偏移量
f表示新的片段值
c表示用GL_TEXURE_ENV_COLOR分配的颜色值
如果没有下标,表示最终计算所得的颜色 GL_REPLACEGL_MODULATEGL_DECALGL_ALPHAC=Cf A=AsC=Cf A=AsAf未定义GL_LUMINANCEC=Cs A=AfC=CfCs A=Af未定义GL_LUMINANCE_ALPHAC=Cs A=AsC=CfCs A=AsAf未定义GL_INTENSITYC=Cf A=CsC=CfCs A=AsAf未定义GL_RGBC=Cs A=AfC=CfCs A=AfC=Cs A=AfGL_RGBAC=Cs A=AsC=CfCs A=AsAfC=Cf(1-As)+CsAs A=AfGL_BLEND,GL_ADD 纹理函数 GL_BLENDGL_ADDGL_ALPHAC=Cf A=AfAsC=Cf A=AsAfGL_LUMINANCEC=Cf(1-Cs)+CcCs A=AfC=Cf+Cs A=AfGL_LUMINANCE_ALPHAC=Cf(2-Cs)+CcCs A=AfAsC=Cf+Cs A=AsAfGL_INTENSITYC=Cf(3-Cs)+CcCs A=Af(1-As)+AcAsC=Cf+Cs A=Af+AsGL_RGBC=Cf(4-Cs)+CcCs A=AfC=Cf+Cs A=AfGL_RGBAC=Cf(5-Cs)+CcCs A=AfAsC=Cf+Cs A=AfAs
#include "header.h"#definecheckImageWidth 16#definecheckImageHeight 16GLubyte 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();}
0 0
- OpenGL学习二十:纹理函数
- OpenGL学习二十一:纹理坐标
- OpenGL学习二十三:多重纹理
- OpenGL: 纹理映射函数
- OpenGL学习笔记:纹理
- OpenGL纹理学习总结
- OPENGL学习笔记整理(二):纹理知多少?
- OpenGL学习二十二:纹理坐标自动生成
- OpenGL--纹理组合器函数
- OpenGL学习十六:纹理绑定
- OpenGL学习十七:纹理贴图
- OpenGL学习十九:纹理过滤
- OpenGL学习笔记4:纹理
- Opengl学习程序之纹理
- OpenGL学习笔记4:纹理
- 【OpenGL】学习笔记之常用函数(二)
- Android OpenGL ES(二)纹理
- Android OpenGL ES 应用(二) 纹理
- VIM中精确跳转至Linux内核接口定义
- VIM阅读LinuxKernel
- 你不知道的JavaScript用法,Hacker是这样写JS的
- 2014 想做一个全新的自己
- cocos2d-x-2.2.0版本的CocoStudio的GUI绑定到lua
- OpenGL学习二十:纹理函数
- 史上最全Linux提权后获取敏感信息方法
- 物联网 毕业设计——社交物联网系统的思考
- mysqlnd cannot connect to MySQL 4.1+ using old authentication
- kNN:最近邻分类器
- JQuery TextArea的取值与赋值问题
- 21个常用的PHP函数代码段
- 详解Objective-C runtime
- 各种字符串Hash函数