OpenGL学习例程精析(3d纹理)

  • 代码分析
    • glPixelStorei
  • 完整代码
  • 最终效果

代码分析

3d纹理的配置要比2d纹理复杂一些

glPixelStorei

glPixelStorei(GL_UNPACK_ALIGNMENT, 1)

让字节对齐从默认的4字节对齐改成1字节对齐(选择1的话,无论图片本身是怎样都是绝对不会出问题的,以效率的牺牲为代价)
涉及到cpu把纹理传给gpu要按照像素的方式,这样提取出来就是整齐的rgba格式

PACK —— 把像素从一堆X的状态转变到规则的状态(把一堆泥土装载进一个花盆,把散散的货物装上货柜,或者把一堆各样的文件打包成一个rar压缩包,等等);
UNPACK —— 把像素从规则的状态转变到一堆X的状态(把花盆里的泥倒出来,把货柜中的货物卸载到盐田港,或者解压压缩包,等等)。

从本地内存向GPU的传输(UNPACK),包括各种glTexImage、glDrawPixel;从GPU到本地内存的传输(PACK),包括glGetTexImage、glReadPixel等

完整代码

#include <GL/glut.h>
#include <GL/glext.h>
#include <stdlib.h>
#include <stdio.h>#ifdef GL_VERSION_1_2
#define iWidth 16
#define iHeight 16
#define iDepth 16static GLubyte image[iDepth][iHeight][iWidth][3]; //深度,高度,宽度+3个颜色通道
static GLuint texName;/*  Create a 16x16x16x3 array with different color values in
*  each array element [r, g, b].  Values range from 0 to 255.
*/
PFNGLTEXIMAGE3DPROC glTexImage3D;  //定义一个glTexImage3D指针void makeImage(void)     //造纹理
{int s, t, r;for (s = 0; s < 16; s++)for (t = 0; t < 16; t++)for (r = 0; r < 16; r++) {image[r][t][s][0] = (GLubyte) (s * 17);image[r][t][s][1] = (GLubyte) (t * 17);image[r][t][s][2] = (GLubyte) (r * 17);}
}void init(void)
{    glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);      //两点之间的着色模式为片状,另一个参数可以写为,GL_SMOOTH这样绘制出来的就是渐变效果//glShadeModel(GL_SMOOTH);   glEnable(GL_DEPTH_TEST);   //启用深度测试makeImage();                //产生纹理glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glGenTextures(1, &texName);glBindTexture(GL_TEXTURE_3D, texName);glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);//q是一个缩放因子,相当于顶点坐标中的w。实际应用在纹理读取中的坐标应该是s/q,t/q,r/q。默认情况下,q是1.0。通常情况下貌似没什么用,但是在一些产生纹理坐标的高级算法比如阴影贴图中//s、t、r分别相当于普通坐标系中的x、y、z三个方向。分别对应glTexImage3D中的参数width、height、depth。glTexImage3D = reinterpret_cast< PFNGLTEXIMAGE3DPROC>( ::wglGetProcAddress( "glTexImage3D") );  //使能glTexImage3D指针glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, iWidth, iHeight,iDepth, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glEnable(GL_TEXTURE_3D);}void display(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glBegin(GL_QUADS);glTexCoord3f(0.0, 0.0, 0.0); glVertex3f(-2.25, -1.0, 0.0);glTexCoord3f(0.0, 1.0, 0.0); glVertex3f(-2.25, 1.0, 0.0);glTexCoord3f(1.0, 1.0, 1.0); glVertex3f(-0.25, 1.0, 0.0);glTexCoord3f(1.0, 0.0, 1.0); glVertex3f(-0.25, -1.0, 0.0);glTexCoord3f(0.0, 0.0, 1.0); glVertex3f(0.25, -1.0, 0.0);glTexCoord3f(0.0, 1.0, 1.0); glVertex3f(0.25, 1.0, 0.0);glTexCoord3f(1.0, 1.0, 0.0); glVertex3f(2.25, 1.0, 0.0);glTexCoord3f(1.0, 0.0, 0.0); glVertex3f(2.25, -1.0, 0.0);glEnd();glFlush();
}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, -4.0);
}void keyboard(unsigned char key, int x, int y)
{switch (key) {case 27:exit(0);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();glutReshapeFunc(reshape);glutDisplayFunc(display);glutKeyboardFunc (keyboard);glutMainLoop();return 0;
}
#else
int main(int argc, char** argv)
{fprintf (stderr, "This program demonstrates a feature which is not in OpenGL Version 1.0 or 1.1.\n");fprintf (stderr, "If your implementation of OpenGL has the right extensions,\n");fprintf (stderr, "you may be able to modify this program to make it run.\n");return 0;
}
#endif

最终效果

效果图如下:

OpenGL学习例程精析(3d纹理)相关推荐

  1. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

  2. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...

  3. OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

    /* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */#include <windows.h> ...

  4. 计算机图形学与opengl C++版 学习笔记 第5章 纹理贴图

    目录 5.1 加载纹理图像文件 5.2 纹理坐标 5.3 创建纹理对象 5.4 构建纹理坐标 5.5 将纹理坐标载入缓冲区 5.6 在着色器中使用纹理:采样器变量和纹理单元 5.7 纹理贴图:示例程序 ...

  5. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  6. OpenGL学习入门之3D光照机器人

    OpenGL学习入门之3D光照机器人 // myopengl.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include " ...

  7. OpenGL ES绘制3D纹理贴图

    最近看了<疯狂android讲义>的图形相关的内容,结合自己的理解,整理了一下. 下图是做出来的3D纹理贴图效果,手指在屏幕滑动时,图片可以随之转动. 要实现一个纹理贴图,很简单,大致需要 ...

  8. OpenGL学习笔记——纹理贴图

    简单地说,纹理就是矩形的数据数组.例如,颜色数据.亮度数据.颜色和alpha数据.纹理数组中的单个值常常称为纹理单元(texel).纹理贴图之所以复杂,是因为矩形的纹理可以映射到非矩形的区域,并且必须 ...

  9. 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料

    目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...

  10. OpenGL学习之二 -- 初探

    OpenGL学习之二 -- 初探 前言 1. Xcode搭建OpenGL环境 1. 1 搭建步骤 1. 2 写一个最简单的openGL测试代码 1. 3 源码下载 2. 图形API简介 3. Open ...

最新文章

  1. 看菲菲详解如何快速获取linux命令帮助
  2. IIS短文件/文件夹泄露漏洞
  3. iOS网络编程开发-数据加密
  4. 第四章:条件语句(if)和循环结构(while)
  5. python实例方法、类方法、静态方法的区别_Python 实例方法、类方法、静态方法的区别与作用...
  6. 王道机试指南读后总结-1
  7. 创建mysql用户并在单个数据库上赋权
  8. 山西特岗考试计算机专业真题,山西特岗教师招聘考试模拟题_信息技术选择题...
  9. 使用WIN32汇编语言实现一个基本windows窗口的过程分析
  10. 亿图图示输入文字后画面自动缩小
  11. STM8L开发环境配置
  12. 3D游戏编程与设计作业五
  13. python库源码分析_python第三方库Faker源码解读
  14. 【C++内存管理-从平地起到万丈高楼】引言
  15. 百度地图之标注物聚合
  16. 7-2 然后是几点 (15 分)
  17. 单片机时钟周期、状态周期、机器周期、指令周期的理解
  18. com.netflix.client.ClientException: Load balancer does not have available server for client: userser
  19. VMware安装mac的流程及unlocker 报错 、出现的一些问题解决方案整理
  20. react hook + stamen store + pug实现纯函数无痛版react开发体验

热门文章

  1. 4核处理器_最新版的MAC mini配M1处理器你会买吗?
  2. 前端js中文转拼音(例:张三转为ZhangSan)
  3. HDU-6357Hills And Valleys(用最长可重复公共子序列求最长非递减子序列)
  4. 相机标定后得到相机视域,并根据相机视域求取摄像机位置和摄像机方位角
  5. java实现添加微信好友_使用java生成微信随机加好友的链接
  6. 编译原理:cminus_compiler-2021-fall Lab3
  7. 社区角色(Kubernetes社区Maintainer是什么角色?)
  8. HMI-29-【运动模式】转速表实现及中心油耗仪表实现
  9. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  10. Chrome 浏览器翻译停服!改Hosts也失效!还有这些解决方案