第一张图是GL_NEAREST没开启各向异性的,第二张图开启了各向异性变的比较不那么斑驳了,其他效果可自行测试。

// Tunnel.cpp
// Demonstrates mipmapping and using texture objects
// OpenGL SuperBible
// Richard S. Wright Jr.
#pragma comment(lib,"gltools.lib")
#include <GLTools.h>
#include <GLShaderManager.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLFrame.h>
#include <GLMatrixStack.h>
#include <GLGeometryTransform.h>#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endifGLShaderManager       shaderManager;          // Shader Manager
GLMatrixStack       modelViewMatrix;        // Modelview Matrix
GLMatrixStack       projectionMatrix;       // Projection Matrix
GLFrustum           viewFrustum;            // View Frustum
GLGeometryTransform transformPipeline;      // Geometry Transform PipelineGLBatch             floorBatch;
GLBatch             ceilingBatch;
GLBatch             leftWallBatch;
GLBatch             rightWallBatch;GLfloat             viewZ = -65.0f;// Texture objects
#define TEXTURE_BRICK   0
#define TEXTURE_FLOOR   1
#define TEXTURE_CEILING 2
#define TEXTURE_COUNT   3
GLuint  textures[TEXTURE_COUNT];
const char *szTextureFiles[TEXTURE_COUNT] = { "brick.tga", "floor.tga", "ceiling.tga" };///
// Change texture filter for each texture object
void ProcessMenu(int value)
{GLfloat fLargest;GLint iLoop;for (iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++){glBindTexture(GL_TEXTURE_2D, textures[iLoop]);switch (value){case 0:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);break;case 1:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);break;case 2:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);break;case 3:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);break;case 4:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);break;case 5:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);break;case 6:glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);break;case 7:glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);break;}}// Trigger RedrawglutPostRedisplay();
}//
// This function does any needed initialization on the rendering
// context.  Here it sets up and initializes the texture objects.
void SetupRC()
{GLbyte *pBytes;GLint iWidth, iHeight, iComponents;GLenum eFormat;GLint iLoop;// Black backgroundglClearColor(0.0f, 0.0f, 0.0f, 1.0f);shaderManager.InitializeStockShaders();// Load texturesglGenTextures(TEXTURE_COUNT, textures);for (iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++){// Bind to next texture objectglBindTexture(GL_TEXTURE_2D, textures[iLoop]);// Load texture, set filter and wrap modespBytes = gltReadTGABits(szTextureFiles[iLoop], &iWidth, &iHeight,&iComponents, &eFormat);// Load texture, set filter and wrap modesglTexParameteri(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_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);glGenerateMipmap(GL_TEXTURE_2D);// Don't need original texture data any morefree(pBytes);}// Build GeometryGLfloat z;floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);for (z = 60.0f; z >= 0.0f; z -= 10.0f){floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);floorBatch.Vertex3f(-10.0f, -10.0f, z);floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);floorBatch.Vertex3f(10.0f, -10.0f, z);floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);}floorBatch.End();ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);for (z = 60.0f; z >= 0.0f; z -= 10.0f){ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f);ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f);ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f);ceilingBatch.Vertex3f(-10.0f, 10.0f, z);ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f);ceilingBatch.Vertex3f(10.0f, 10.0f, z);}ceilingBatch.End();leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);for (z = 60.0f; z >= 0.0f; z -= 10.0f){leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);leftWallBatch.Vertex3f(-10.0f, -10.0f, z);leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);leftWallBatch.Vertex3f(-10.0f, 10.0f, z);leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);}leftWallBatch.End();rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);for (z = 60.0f; z >= 0.0f; z -= 10.0f){rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);rightWallBatch.Vertex3f(10.0f, -10.0f, z);rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);rightWallBatch.Vertex3f(10.0f, 10.0f, z);rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);}rightWallBatch.End();
}///
// Shutdown the rendering context. Just deletes the
// texture objects
void ShutdownRC(void)
{glDeleteTextures(TEXTURE_COUNT, textures);
}///
// Respond to arrow keys, move the viewpoint back
// and forth
void SpecialKeys(int key, int x, int y)
{if (key == GLUT_KEY_UP)viewZ += 0.5f;if (key == GLUT_KEY_DOWN)viewZ -= 0.5f;// Refresh the WindowglutPostRedisplay();
}/
// Change viewing volume and viewport.  Called when window is resized
void ChangeSize(int w, int h)
{GLfloat fAspect;// Prevent a divide by zeroif (h == 0)h = 1;// Set Viewport to window dimensionsglViewport(0, 0, w, h);fAspect = (GLfloat)w / (GLfloat)h;// Produce the perspective projectionviewFrustum.SetPerspective(80.0f, fAspect, 1.0, 120.0);projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);}///
// Called to draw scene
void RenderScene(void)
{// Clear the window with current clearing colorglClear(GL_COLOR_BUFFER_BIT);modelViewMatrix.PushMatrix();modelViewMatrix.Translate(0.0f, 0.0f, viewZ);shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_FLOOR]);floorBatch.Draw();glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_CEILING]);ceilingBatch.Draw();glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_BRICK]);leftWallBatch.Draw();rightWallBatch.Draw();modelViewMatrix.PopMatrix();// Buffer swapglutSwapBuffers();
}//
// Program entry point
int main(int argc, char *argv[])
{gltSetWorkingDirectory(argv[0]);// Standard initialization stuffglutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(800, 600);glutCreateWindow("Anisotropic Tunnel");glutReshapeFunc(ChangeSize);glutSpecialFunc(SpecialKeys);glutDisplayFunc(RenderScene);// Add menu entries to change filterglutCreateMenu(ProcessMenu);glutAddMenuEntry("GL_NEAREST", 0);glutAddMenuEntry("GL_LINEAR", 1);glutAddMenuEntry("GL_NEAREST_MIPMAP_NEAREST", 2);glutAddMenuEntry("GL_NEAREST_MIPMAP_LINEAR", 3);glutAddMenuEntry("GL_LINEAR_MIPMAP_NEAREST", 4);glutAddMenuEntry("GL_LINEAR_MIPMAP_LINEAR", 5);glutAddMenuEntry("Anisotropic Filter", 6);glutAddMenuEntry("Anisotropic Off", 7);glutAttachMenu(GLUT_RIGHT_BUTTON);GLenum err = glewInit();if (GLEW_OK != err) {fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));return 1;}// Startup, loop, shutdownSetupRC();glutMainLoop();ShutdownRC();return 0;
}

【OpenGL】各向异性过滤案例相关推荐

  1. OpenGL Mip贴图、各向异性过滤(七)

    1.Mip贴图 Mip贴图简介: 纹理对象可以从不同的视点距离进行观察.在一个动态的场景中,当贴了纹理的物体远离视点运动时,屏幕像素与纹理纹素之间的比率会变得非常低(屏幕像素/纹理纹素),因此纹理的采 ...

  2. C++ Opengl纹理过滤和光照实例源码

    C++ Opengl纹理过滤和光照实例源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8. ...

  3. 图形学笔记(八)着色2 —— 纹理映射、重心坐标、双线性插值、Mipmap、三线性插值、各向异性过滤、纹理的应用(环境贴图、法线贴图等)

    图形学笔记(七)着色 -- Blinn-Phone 反射模型.着色频率.渲染管线.GPU 图形学笔记(九)几何 --几何表示方法(CSG.距离函数.水平集 .点云.网格(obj格式)).贝塞尔曲线(面 ...

  4. 采用各向异性过滤的前后对比及心得 (附图)

    前些天导入了一个MESH模型,刚开始就觉得哪不太对,效果太差了,于是 把关于书上关于渲染及纹理的几章好好看了一下,把所有的采样方式都做一遍,看看几种的效果对比, 刚开始用的是MIPMAP过滤,可是发现 ...

  5. OpenGL之“隧道”的多层纹理渲染与各向异性过滤渲染效果的对比

    效果展示 绘制流程 定义变量 GLShaderManager shaderManager; // 着色器管理器 GLMatrixStack modelViewMatrix; // 模型视图矩阵 GLM ...

  6. Stream filter过滤案例

    package com.gblfy.gxts;import com.google.common.collect.Lists; import lombok.AllArgsConstructor; imp ...

  7. 初识OpenGL (-)纹理过滤(Texture Filtering)

    1. OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel)映射到纹理坐标. 纹理坐标 不依赖于分辨率(Resolution),它可以是任意浮点值, 给模型顶点设置的那个数组 ...

  8. OpenGL纹理过滤以及纹理Wrapping mode

     在三维动态场景中,如果一个纹理对象迅速地远离观察点而去,此时纹理图像必须随被投影的图像一起缩小,否则很产生抖动或者闪烁的现象.为了避免产生抖动或者闪烁,OpenGL必须对纹理图像进行过滤,适当的 ...

  9. 敏感词过滤案例(Filter过滤器)

    敏感词汇过滤 需求 对UserCRUD_case案例中录入的数据进行敏感词汇的过滤 敏感词汇参考<敏感词汇.txt> 若是敏感词汇,则替换为*** 分析 在进行过滤前后,所获取的reque ...

  10. OpenGL 纹理过滤和 mip 贴图

    一.概念 1. 纹理过滤 当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤. 纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXT ...

最新文章

  1. 李超线段树(Li-Chao Segment Tree)
  2. 8个概念告诉你人工智能
  3. 响应微信公众平台公众号菜单单击事件
  4. Serverless 工程实践|自建 Apache OpenWhisk 平台
  5. bq4050读固件_stm32f767 实现模拟SMBUS驱动bq4050
  6. PL/SQL批处理语句:BULK COLLECT 和 FORALL
  7. Java获取数据类型
  8. numpy-ufunc函数
  9. 弃用微软 C++ 编译器,Win 版 Chrome 改用 Clang
  10. web前端开发 —— 一个对联效果
  11. 最小生成树-Prim算法的Python实现
  12. mybatis mapper配置 bigint_Mybatis-plus 入门
  13. python3.4连接mysql5.7数据库增删改查
  14. 南阳理工acm24素数距离问题
  15. 蓝牙(Android使用)基本原理
  16. ocf heartbeat mysql_Heartbeat CRM模式
  17. Leetcode 1208. 尽可能使字符串相等(终于解决,晚安)
  18. 多元线性回归及案例(Python)
  19. 【随心所记】矩阵A的行列式不等于0,是A可逆的充要条件吗?答:是这样的
  20. RSS阅读器简单介绍

热门文章

  1. 台式计算机有线无线网卡设置,电脑无线网卡如何使用 电脑外置无线网卡详细使用图文教程...
  2. 睡眠伤害计算机硬件吗,电脑高手告诉您,电脑不关机只睡眠到底伤不伤硬盘?...
  3. 分享一个无意间发现的躺赚网络创业小项目!
  4. 【MySQL】数据库基础_frank_fuckppt
  5. HTML系列之多媒体视频标签 video
  6. itext设置字体间距_微信公众号文章字体怎么修改?行间距、字间距一般设置多少?...
  7. C盘AppData文件占用83.7G?
  8. 全球语种谱系图,看看机器翻译需要跨越的大山
  9. 程序设计大赛WBS图
  10. ddns动态域名注册