OpenGL--替换纹理图像的全部或一部分
来源:互联网 发布:数据库有几个事务 编辑:程序博客网 时间:2024/05/16 06:04
- 理论基础
和修改原有纹理相比,创建新纹理的开销更大。我们主要使用glTexSubImage*和glCopyTexSubImage*()来修改纹理,前者用于替换的纹理来源外部读取,后者替换的纹理来源自身帧缓冲区。
- 实例代码
#include "GLTools.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endif#define checkImageWidth 64#define checkImageHeight 64#define subImageWidth 45#define subImageHeight 45static GLubyte checkImage[checkImageHeight][checkImageWidth][4];static GLubyte subImage[subImageHeight][subImageWidth][4];static GLuint texName;//纹理数据(黑白相间的棋盘和蓝色区域)void makeCheckImages(void){ int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i&0x8)==0)^((j&0x8))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; checkImage[i][j][3] = (GLubyte) 255; } } for (i = 0; i < subImageHeight; i++) { for (j = 0; j < subImageWidth; j++) { subImage[i][j][0] = (GLubyte) 0; subImage[i][j][1] = (GLubyte) 0; subImage[i][j][2] = (GLubyte) 255; subImage[i][j][3] = (GLubyte) 255; } }}void init(void){ glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); makeCheckImages(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);}void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); glEnd(); glFlush(); glDisable(GL_TEXTURE_2D);}void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -3.6);}void keyboard (unsigned char key, int x, int y){ switch (key) { case 's': case 'S': //指定当前活动的纹理 glBindTexture(GL_TEXTURE_2D, texName); /*用subImage纹理替换原纹理的(12,12)至 (subImageWidth,subImageHeight)区域*/ glTexSubImage2D(GL_TEXTURE_2D, 0, 12, 12, subImageWidth, subImageHeight, GL_RGBA,GL_UNSIGNED_BYTE, subImage); glutPostRedisplay(); break; case 'r': case 'R': glBindTexture(GL_TEXTURE_2D, texName); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA,GL_UNSIGNED_BYTE, checkImage); glutPostRedisplay(); break; case 27: exit(0); break; default: break; }}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }
0 0
- OpenGL--替换纹理图像的全部或一部分
- 17.OpenGL--替换纹理图像的全部或一部分
- 替换矩阵的一部分
- 关于用作OpenGL纹理的图像有几点十分重要
- MyEclipse/Eclipse中把选中的一部分代码变成全部大写或小写快捷键
- OPENGL的纹理(转)
- opengl的纹理
- opengl纹理的使用
- Android OpenGL 纹理绘制图像---基础知识
- Android OpenGL 纹理绘制图像---JAVA实现
- Android OpenGL 纹理绘制图像---Native实现
- Android OpenGL 纹理绘制图像---总结
- string 将指定的字符或字符串全部替换成特定的字符或字符串
- 图像的纹理特征
- String的一部分替换为星号“*”
- String的一部分替换为星号“*”
- PS图片中字体或图像的颜色替换
- OpenGL使用OpenCV处理图像进行纹理映射的使用范例
- 题解nyoj skiing
- 读取Jar包内的资源或配置文件
- C#中判断空字符串的3种方法性能分析
- 在MySQL中存储图片路径
- DirectX 9.0c 学习笔记--镜像水面
- OpenGL--替换纹理图像的全部或一部分
- 深入理解IGMP协议
- hiho 编程之美2015资格赛(2月29日-模拟日期)
- FastDFS(1):Centos7 安装FastDFS+nginx module
- 第三章第七题(4)
- Prim算法求最小生成树
- 【cofface】MTK 67xx系列机型线刷recovery教程(基本通用)
- SQLite3 C语言API使用说明
- 行情软件的实现