以2D表面为例展示纹理贴图,用opengl设置一个2D纹理,颜色存储在32*32*3的数组中,对应的纹理坐标为0<=s, t<=1.0. 画出几个正方形表面,分别以GL_CLAMP(纹理坐标大于1或小于0都被规范到1和0),GL_REPEAT(类似平铺,超过0或1的部分忽略整数位进行贴图),GL_MODULATE(纹理颜色与对象颜色相乘), GL_REPLACE(纹理颜色替换对象颜色)几种形式进行贴图。

 #include <GLUT/GLUT.h>

 GLsizei winWidht = , winHeight = ;

 void init (void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-, , -, );
} void xyCoords (void)
{
glBegin(GL_LINES);
glColor3f(0.0, 0.0, 0.0);
glVertex2i(-, );
glVertex2i(, );
glVertex2i(, -);
glVertex2i(, );
glEnd();
} void lineTextureMapping (void)
{
GLint k;
GLubyte texLine []; for (k = ; k <= ; k +=) {
texLine [*k] = ;
texLine [*k+] = ;
texLine [*k+] = ;
texLine [*k+] = ;
} for (k = ; k <= ; k +=) {
texLine [*k] = ;
texLine [*k+] = ;
texLine [*k+] = ;
texLine [*k+] = ;
} glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage1D(GL_TEXTURE_1D, , GL_RGBA, , , GL_RGBA, GL_UNSIGNED_BYTE, texLine);
glEnable(GL_TEXTURE_1D); glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);
glTexCoord1f(0.25);
glVertex2f(-4.5, 4.0);
glTexCoord1f(1.0);
glVertex2f(-4.5, -4.0);
glEnd(); glDisable(GL_TEXTURE_1D);
} void surfaceTextureMapping (void)
{
GLint k, j;
GLubyte texArray [][][]; for (k = ; k < ; k++) {
for (j = ; j < ; j++) {
texArray [k][j][] = - k*j/;
texArray [k][j][] = + k*j/;
texArray [k][j][] = ;
texArray [k][j][] = ;
}
} glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, , GL_RGBA, , , , GL_RGBA, GL_UNSIGNED_BYTE, texArray);
glEnable(GL_TEXTURE_2D); glColor3f(0.5, 0.5, 0.5); // 与纹理值相乘,因此会发暗
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(0.0, 0.0);
glTexCoord2f(3.0, 0.0);
glVertex2f(3.0, 0.0);
glTexCoord2f(3.0, 3.0);
glVertex2f(3.0, 3.0);
glTexCoord2f(0.0, 3.0);
glVertex2f(0.0, 3.0);
glEnd(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor3f(0.5, 0.5, 0.5); // 替换为纹理颜色,则不会像前一个图案那样发暗
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(-4.0, -4.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(-1.0, -4.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(-1.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex2f(-4.0, -1.0);
glEnd();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // 不允许纹理坐标超过1,因此小于0的设为0,大于1的设为1
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(-4.0, 0.0);
glTexCoord2f(, 0.0);
glVertex2f(-1.0, 0.0);
glTexCoord2f(, );
glVertex2f(-1.0, 3.0);
glTexCoord2f(0.0, );
glVertex2f(-4.0, 3.0);
glEnd();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glDisable(GL_TEXTURE_2D);
} void displayFcn (void)
{
glClear(GL_COLOR_BUFFER_BIT); // lineTextureMapping();
surfaceTextureMapping();
xyCoords(); glFlush();
} void winReshapeFcn (GLint newWidth, GLint newHeight)
{
glViewport(, , newWidth, newHeight);
} int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(winWidht, winHeight);
glutInitWindowPosition(, );
glutCreateWindow("texture mapping"); init();
glutDisplayFunc(displayFcn);
glutReshapeFunc(winReshapeFcn);
glutMainLoop(); return ;
}

[图形学] Chp18 OpenGL表面纹理函数的更多相关文章

  1. 用OpenGL进行立方体表面纹理贴图

    一.目的 掌握OpenGL中纹理对象的创建.绑定与使用方法. 二.简单介绍 1,连接静态库 #pragma comment(lib, "glut32.lib") #pragma c ...

  2. OpenGL的API函数使用手册

    (一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.aux.glut.wgl.glx.a ...

  3. OpenGL ES: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...

  4. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  5. OpenGL中glRotatef()函数究竟对矩阵做了什么

    OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...

  6. android ndk调用OpenGL 实现纹理贴图Texture

    android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39  CSDN博客 原文  http://blog.csdn.net/chrisfxs/a ...

  7. OpenGL常用的函数

    OpenGL常用的函数 1. void glBegin(GLenummode) void glEnd(void) 参数说明: mode:创建图元的类型.可以是以下数值 GL_POINTS:把每一个顶点 ...

  8. [图形学] Chp17 OpenGL光照和表面绘制函数

    这章学了基本光照模型,物体的显示受到以下效果影响:全局环境光,点光源(环境光漫反射分量,点光源漫反射分量,点光源镜面反射分量),材质系数(漫反射系数,镜面反射系数),自身发光,雾气效果等.其中点光源有 ...

  9. 【计算机图形学】openGL常用函数

    OpenGL常用函数   glAccum 操作累加缓冲区   glAddSwapHintRectWIN 定义一组被 SwapBuffers拷贝的三角形   glAlphaFunc允许设置alpha检测 ...

随机推荐

  1. React之组件通信

    组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...

  2. Libsvm使用资料

    原理: 1. pluskid(张弛原)的支持向量机教程(人家现在都是大牛了) http://blog.pluskid.org/?page_id=683 2. JerryLead机器学习教程 http: ...

  3. MySQL数据库安全策略

    1. 删除所有MySQL中的用户(包括root用户): mysql> delete from mysql.user root可以保留,然后修改为其他用户 2. 为管理员root用户设置密码 : ...

  4. poj2104(划分树模板)

    poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...

  5. javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)

    javaCV图像处理系列: 一.javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 二.javaCV图像处理之2:实时视频添 ...

  6. debian将默认中文改成英文

    $ sudo export LANG=en_US.UTF-8 $ sudo dpkg-reconfigure locales

  7. 解决ionic2各种坑文章收集

    小白最近打算用ionic2做一个APP,无奈没有大神指点,一路坎坷遇到数不清的坑(主要是墙的问题).这里整理一些大神的帖子链接,用以指路. 新建/打包: Ionic2+Angular2创建项目打包An ...

  8. 最新开源DBLayer,原来数据库操作可以这么简单

    DBLayer,我最近开源的数据库轻量级orm框架,目前支持sqlserver.mysql.oracle, 特别做了分页的封装. 这个框架从七八年前开始逐渐升级而来,也经历了不少项目,希望可以将大家从 ...

  9. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

  10. python web -- flask

    Flask是一个简洁的 Python_web 框架. 零. virtualenv 虚拟环境配置. $ easy_install pip $ pip install virtualenv $ virtu ...