`
tiankefeng0520
  • 浏览: 146856 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习十八:多重细节层

 
阅读更多

在动态场景中,当一个纹理对象迅速地远离观察点时,纹理图像必须随着背投影的图像一起缩小,为了实现这个效果,OPENGL必须对纹理图像进行过渡,适当地对它进行缩小,使他不会产生令人不舒服的视觉感受。
OpenGL mipmap 预先设置好不同分辨率的纹理图像,根据被贴图的物体的大小确定采用哪种分辨率的纹理图像,达到平滑过渡的效果

 

使用mipmap必须提供全系列的大小为2的整数次方的纹理图像,其范围从最大值直到1*1,例如最大值为64*16的纹理单元还必须提供32*8,16*4,8*2,4*1,2*1,1*1的纹理单元。他们的分辨率为,0,1,2,3,4,5,6
另外使用mipmap还需要选择一种适当的过滤模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)

 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);//黄
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 16, 16, 0,GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage16);//紫
glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage8);//红
glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 0,GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage4);//绿
glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage2);//蓝
glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage1);//白

 

 

mipmap层控制

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);//最高分辨率层
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);//最低分辨率层

mipmap细节层参数控制  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);

对于32*32的纹理图像来说,包含16*16,8*8,4*4,2*2,1*1. min可以简单的认为是起始分辨率(最大值) max是结束分别率(最大值)

 

上面方法如果要创建一个64*16的纹理,必须创建7个纹理图形,并进行分别绑定,很繁琐,当然OpenGL提供了一些方法,让这一切变得简单
 方法1:OPENGL 1.4 以后
 glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);

方法2: OPENGL1.1
 gluBuild2DMipmaps(GL_TEXTURE_2D,  GL_RGBA, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);

方法3:OPENGL3.0
glGenerateMipmap(GL_TEXTURE_2D)
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);

 

#include "header.h"

GLubyte mipmapImage32[32][32][4];
GLubyte mipmapImage16[16][16][4];
GLubyte mipmapImage8[8][8][4];
GLubyte mipmapImage4[4][4][4];
GLubyte mipmapImage2[2][2][4];
GLubyte mipmapImage1[1][1][4];

#ifdef GL_VERSION_1_1
static GLuint texName;
#endif

void makeImages(void)
{
   int i, j;
    
   for (i = 0; i < 32; i++) {
      for (j = 0; j < 32; j++) {
         mipmapImage32[i][j][0] = 255;
         mipmapImage32[i][j][1] = 255;
         mipmapImage32[i][j][2] = 0;
         mipmapImage32[i][j][3] = 255;
      }
   }
   for (i = 0; i < 16; i++) {
      for (j = 0; j < 16; j++) {
         mipmapImage16[i][j][0] = 255;
         mipmapImage16[i][j][1] = 0;
         mipmapImage16[i][j][2] = 255;
         mipmapImage16[i][j][3] = 255;
      }
   }
   for (i = 0; i < 8; i++) {
      for (j = 0; j < 8; j++) {
         mipmapImage8[i][j][0] = 255;
         mipmapImage8[i][j][1] = 0;
         mipmapImage8[i][j][2] = 0;
         mipmapImage8[i][j][3] = 255;
      }
   }
   for (i = 0; i < 4; i++) {
      for (j = 0; j < 4; j++) {
         mipmapImage4[i][j][0] = 0;
         mipmapImage4[i][j][1] = 255;
         mipmapImage4[i][j][2] = 0;
         mipmapImage4[i][j][3] = 255;
      }
   }
   for (i = 0; i < 2; i++) {
      for (j = 0; j < 2; j++) {
         mipmapImage2[i][j][0] = 0;
         mipmapImage2[i][j][1] = 0;
         mipmapImage2[i][j][2] = 255;
         mipmapImage2[i][j][3] = 255;
      }
   }
   mipmapImage1[0][0][0] = 255;
   mipmapImage1[0][0][1] = 255;
   mipmapImage1[0][0][2] = 255;
   mipmapImage1[0][0][3] = 255;
}
   int a;
      GLboolean b=0;
void init(void)
{    
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_FLAT);

   glTranslatef(0.0, 0.0, -3.6);
   makeImages();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

#ifdef GL_VERSION_1_1
   glGenTextures(1, &texName);
   glBindTexture(GL_TEXTURE_2D, texName);
#endif
   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_MIPMAP_NEAREST);
   //方法3:
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);
   glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 16, 16, 0,
	   GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage16);
   glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 8, 8, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage8);
   glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage4);
   glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA, 2, 2, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage2);
   glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA, 1, 1, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage1);

   // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
	//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
  // 方法1:OPENGL 1.4 以后
	/*glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);*/

  // 方法2: OPENGL1.1
	   //gluBuild2DMipmaps(GL_TEXTURE_2D,  GL_RGBA, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, mipmapImage32);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 1);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glEnable(GL_TEXTURE_2D);

   //glGetTexLevelParameteriv(GL_TEXTURE_RESIDENT,0,texName,&a);

   glAreTexturesResident(1,&texName,&b);

     glEnable(GL_TEXTURE_2D);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#ifdef GL_VERSION_1_1
   glBindTexture(GL_TEXTURE_2D, texName);
#endif
   glBegin(GL_QUADS);
   glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
   glTexCoord2f(0.0, 8.0); glVertex3f(-2.0, 1.0, 0.0);
   glTexCoord2f(8.0, 8.0); glVertex3f(2000.0, 1.0, -6000.0);
   glTexCoord2f(8.0, 0.0); glVertex3f(2000.0, -1.0, -6000.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, 30000.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (500, 500);
   glutInitWindowPosition (50, 50);
   glutCreateWindow (argv[0]);
   glewInit();
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;     
}

 

 

  • 大小: 8.8 KB
  • 大小: 9.6 KB
分享到:
评论

相关推荐

    opengl多重纹理绘制太阳

    在绘制太阳时,可能需要两个或更多的纹理来分别表示太阳的表面细节、耀斑或者大气层的效果。通过巧妙地混合这些纹理,可以创建出具有深度和层次感的太阳图像。 在描述中提到的半透明效果(Transparency)是通过调整...

    OpenGL入门学习之十一——纹理的使用入门.pdf

    2. **多重细节层次**:一般设置为0,除非你需要使用多重纹理细节。 3. **内部格式**:此参数用于指定纹理的数据格式。在早期版本的OpenGL中,可以使用整数(例如3表示RGB);但在后续版本中推荐使用`GL_RGB`或`GL_...

    java openGL 开发库

    OpenGL是用于创建2D和3D图形的强大编程接口,它被广泛应用于游戏开发、科学可视化、工程设计等领域。在Java环境中开发OpenGL应用,通常会借助特定的开发库,其中一个常用的库就是JOGL(Java Bindings for OpenGL)。...

    opengl红宝书(theRedBook)

    《OpenGL编程指南》,通常被称为“OpenGL红宝书”,是学习OpenGL图形编程的权威参考资料。这本书由OpenGL专家联盟撰写,详细介绍了OpenGL的各种特性和使用方法,是计算机图形学领域的重要教材。 OpenGL是一个跨语言...

    OPENGL ES 3.0编程指南.pdf

    OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和...通过深入学习此教程,读者可以掌握OpenGL ES 3.0的核心概念和技术,为开发高质量的3D图形应用打下坚实基础。

    OpenGL编程指南(第四版)中文版

    《OpenGL编程指南(第四版)中文版》是一本由OpenGL体系结构审核委员会著,邓郑祥翻译的经典OpenGL学习书籍。本书被称为OpenGL编程的“红宝书”,因其全面、权威的内容和清晰的语言而广受欢迎。作为第三版的升级版,...

    OpenGL ES API CHM

    OpenGL ES API CHM文件包含的详细信息可能还包括错误码、常量定义、函数参数说明、示例代码等,对于开发者来说是学习和开发的重要参考资料。通过此CHM文件,开发者不仅可以了解各个函数的用途和用法,还能深入理解...

    opengl编程指南(红宝书),加源码,html格式,有超清彩图

    OpenGL编程指南,通常被称为“红宝书”,是学习和深入理解OpenGL图形库的重要参考资料。这本书以其详尽的解释、丰富的示例代码以及高质量的图表,为开发者提供了全面的OpenGL编程知识。在这里,我们将深入探讨OpenGL...

    OpenGL 开发库

    OpenGL 开发库是一种广泛应用的图形库,主要用于在各种操作系统上创建和操纵2D与3D图形。它提供了一个标准化的接口...学习和掌握OpenGL,可以让开发者创造出令人惊叹的视觉效果,并与图形硬件紧密协作,提升程序性能。

    学OpenGL编3D游戏

    8. **帧缓冲对象**:除了默认的帧缓冲,OpenGL还支持自定义帧缓冲对象(FBO),用于实现离屏渲染、后期处理效果或多重采样抗锯齿。 9. **混合与透明度**:OpenGL的混合模式允许处理半透明物体,通过`glBlendFunc`...

    Advanced Methods in Computer Graphics - With Examples in OpenGL

    ### 高级计算机图形学方法——OpenGL实例解析 #### 一、引言 随着计算机图形学领域的迅速发展,各种算法和技术被广泛应用于建模、动画、可视化、实时渲染及游戏引擎设计等多个方面。《高级计算机图形学方法——...

    OpenGL 编程指南 第七版 高清版

    ### OpenGL编程指南第七版知识点概览 #### 一、OpenGL简介 ...通过以上内容的学习,读者可以深入理解OpenGL的核心概念和技术细节,并能够运用这些知识解决实际问题,开发出高质量的图形应用程序。

    OpenGL Advanced Programming Technique

    ### OpenGL高级编程技术详解 #### 一、OpenGL概述与核心概念 OpenGL(Open Graphics Library)是一种...通过学习本书,读者能够掌握OpenGL的核心技术和最新进展,从而在实际项目中发挥更大的创造力和解决问题的能力。

    OpenGL基础图形编程

    在提供的资源中,"OpenGL基础图形编程.chm"可能是关于OpenGL编程的参考手册或教程,涵盖了许多基础概念和技术细节。而"淘宝皇冠名店大全.html"文件似乎与OpenGL编程主题不直接相关,可能是误放入压缩包中的其他文档...

    OpenGL编程指南(原书第7版)中文扫描版

    通过学习本书,不仅可以掌握OpenGL的基本原理和技术细节,还能深入了解如何利用OpenGL来创建高质量的图形应用程序。对于希望深入研究图形编程技术的开发者来说,这本书无疑是不可或缺的参考资料。

    Vulkan编程指南.pdf

    ### Vulkan编程指南知识点详解 #### 一、Vulkan简介与起源 **Vulkan**是一种跨平台的图形和计算API(应用...通过学习这些内容,开发者可以深入理解Vulkan的工作原理,并掌握使用该API进行高性能图形渲染的技术细节。

    FireText

    虽然FireText项目可能不包含当今CG领域的高级技术,但它代表了早期计算机图形学的实践,对于学习和理解基本的OpenGL编程以及火焰特效的实现原理具有一定的历史价值。如果你对这个项目感兴趣,可以通过解压并研究源...

    glium:Rust语言的安全OpenGL包装器

    glium是Rust编程语言中一个著名的开源库,它的主要目标是为开发人员提供一个安全、类型安全且高效的OpenGL接口。这个库旨在让Rust程序员能够轻松地与现代OpenGL进行交互,同时避免了直接操作底层C/C++ API时可能出现...

    glfw-3.3源码.zip

    glfw最初由Nicolas Ouellet在2008年创建,作为一个轻量级的库,它提供了与操作系统交互的抽象层,让开发者可以专注于图形编程,而无需关心底层细节。glfw具有以下主要特性: 1. **跨平台性**:glfw支持Windows、...

Global site tag (gtag.js) - Google Analytics