日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

OpenGL(二十三) 各向异性纹理过滤

發(fā)布時(shí)間:2024/8/26 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 OpenGL(二十三) 各向异性纹理过滤 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果使用一般的紋理過(guò)濾,當(dāng)觀察方向跟模型表面不是相互垂直的的情況下,會(huì)出現(xiàn)紋理信息的丟失,表現(xiàn)為圖像看上去比較模糊,如下圖所示,遠(yuǎn)處場(chǎng)景的細(xì)節(jié)信息很差:



針對(duì)這種情況,可以采用同向異性過(guò)濾的方式處理紋理,在過(guò)濾紋理的時(shí)候,考慮到觀察角度不同,使紋理本身沿著模型表面傾斜的方向進(jìn)行延伸。


使用如下語(yǔ)句查詢當(dāng)前系統(tǒng)支持的最大同向異性過(guò)濾的數(shù)值,數(shù)值越大,表示沿著最大變化方向所采樣的紋理單元越多,顯示效果就越好:


GLfloat max_TexAni;    //查詢?cè)试S的各向異性數(shù)量
	glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_TexAni);

以“ GL_TEXTURE_MAX_ANISOTROPY_EXT ”為參數(shù)調(diào)用“glTexParameterf ”函數(shù),并設(shè)置同向異性過(guò)濾的數(shù)值,就可以使設(shè)置生效。以下是經(jīng)過(guò)同向異性過(guò)濾設(shè)置的顯示效果:

遠(yuǎn)處紋理的細(xì)節(jié)增強(qiáng)了很多。以下是工程代碼:

#define WindowWidth  400    
#define WindowHeight 400
#define WindowTitle  "OpenGL Mip紋理貼圖&&同向異性過(guò)濾"

#include <Windows.h>
#include "GL/glew.h"
#include <GL/freeglut.h>
#include <stdio.h>
#include <stdlib.h>

//定義紋理對(duì)象編號(hào)    
GLuint texGround;
GLuint texWall;
GLuint texSky;

#define BMP_Header_Length 54  //圖像數(shù)據(jù)在內(nèi)存塊中的偏移量    
static GLfloat angle = 0.0f;   //旋轉(zhuǎn)角度    
static GLfloat zPosition = 10;

// 函數(shù)power_of_two用于判斷一個(gè)整數(shù)是不是2的整數(shù)次冪    
int power_of_two(int n)
{
	if (n <= 0)
		return 0;
	return (n & (n - 1)) == 0;
}

/* 函數(shù)load_texture
   28.* 讀取一個(gè)BMP文件作為紋理
   29.* 如果失敗,返回0,如果成功,返回紋理編號(hào)
   30.*/
GLuint load_texture(const char* file_name)
{
	GLint width, height, total_bytes;
	GLubyte* pixels = 0;
	GLuint last_texture_ID = 0, texture_ID = 0;

	// 打開(kāi)文件,如果失敗,返回    
	FILE* pFile = fopen(file_name, "rb");
	if (pFile == 0)
		return 0;

	// 讀取文件中圖象的寬度和高度    
	fseek(pFile, 0x0012, SEEK_SET);
	fread(&width, 4, 1, pFile);
	fread(&height, 4, 1, pFile);
	fseek(pFile, BMP_Header_Length, SEEK_SET);

	// 計(jì)算每行像素所占字節(jié)數(shù),并根據(jù)此數(shù)據(jù)計(jì)算總像素字節(jié)數(shù)    
	{
		GLint line_bytes = width * 3;
		while (line_bytes % 4 != 0)
			++line_bytes;
		total_bytes = line_bytes * height;
	}

	// 根據(jù)總像素字節(jié)數(shù)分配內(nèi)存    
	pixels = (GLubyte*)malloc(total_bytes);
	if (pixels == 0)
	{
		fclose(pFile);
		return 0;
	}

	// 讀取像素?cái)?shù)據(jù)    
	if (fread(pixels, total_bytes, 1, pFile) <= 0)
	{
		free(pixels);
		fclose(pFile);
		return 0;
	}

	// 對(duì)就舊版本的兼容,如果圖象的寬度和高度不是的整數(shù)次方,則需要進(jìn)行縮放    
	// 若圖像寬高超過(guò)了OpenGL規(guī)定的最大值,也縮放    
	{
		GLint max;
		glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
		if (!power_of_two(width)
			|| !power_of_two(height)
			|| width > max
			|| height > max)
		{
			const GLint new_width = 256;
			const GLint new_height = 256; // 規(guī)定縮放后新的大小為邊長(zhǎng)的正方形    
			GLint new_line_bytes, new_total_bytes;
			GLubyte* new_pixels = 0;

			// 計(jì)算每行需要的字節(jié)數(shù)和總字節(jié)數(shù)    
			new_line_bytes = new_width * 3;
			while (new_line_bytes % 4 != 0)
				++new_line_bytes;
			new_total_bytes = new_line_bytes * new_height;

			// 分配內(nèi)存    
			new_pixels = (GLubyte*)malloc(new_total_bytes);
			if (new_pixels == 0)
			{
				free(pixels);
				fclose(pFile);
				return 0;
			}

			// 進(jìn)行像素縮放    
			gluScaleImage(GL_RGB,
				width, height, GL_UNSIGNED_BYTE, pixels,
				new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);

			// 釋放原來(lái)的像素?cái)?shù)據(jù),把pixels指向新的像素?cái)?shù)據(jù),并重新設(shè)置width和height    
			free(pixels);
			pixels = new_pixels;
			width = new_width;
			height = new_height;
		}
	}

	// 分配一個(gè)新的紋理編號(hào)    
	glGenTextures(1, &texture_ID);
	if (texture_ID == 0)
	{
		free(pixels);
		fclose(pFile);
		return 0;
	}

	// 綁定新的紋理,載入紋理并設(shè)置紋理參數(shù)    
	// 在綁定前,先獲得原來(lái)綁定的紋理編號(hào),以便在最后進(jìn)行恢復(fù)    
	GLint lastTextureID = last_texture_ID;
	glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastTextureID);
	glBindTexture(GL_TEXTURE_2D, texture_ID);
	/*glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	130.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); */

	GLfloat max_TexAni;    //查詢?cè)试S的各向異性數(shù)量
	glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_TexAni);

	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_TexAni);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

	/* glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
	 140.    GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels); */

	gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);

	glBindTexture(GL_TEXTURE_2D, lastTextureID);  //恢復(fù)之前的紋理綁定    
	free(pixels);
	return texture_ID;
}


void Display(void)
{
	// 清除屏幕    
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// 設(shè)置視角    
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(65, 1, 1, 100);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0, 0, zPosition, 0, 0, 0, 0, 1, 0);
	glRotatef(angle, 0.0f, 1.0f, 0.0f); //旋轉(zhuǎn)    

	 // 繪制左側(cè)墻壁以及紋理    
	glBindTexture(GL_TEXTURE_2D, texWall);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-5.0f, -5.0f, 100.0f);
	glTexCoord2f(30.0f, 0.0f); glVertex3f(-5.0f, -5.0f, -100.0f);
	glTexCoord2f(30.0f, 2.0f); glVertex3f(-5.0f, 5.0f, -100.0f);
	glTexCoord2f(0.0f, 2.0f); glVertex3f(-5.0f, 5.0f, 100.0f);
	glEnd();

	//繪制右側(cè)墻  
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(5.0f, -5.0f, 100.0f);
	glTexCoord2f(30.0f, 0.0f); glVertex3f(5.0f, -5.0f, -100.0f);
	glTexCoord2f(30.0f, 2.0f); glVertex3f(5.0f, 5.0f, -100.0f);
	glTexCoord2f(0.0f, 2.0f); glVertex3f(5.0f, 5.0f, 100.0f);
	glEnd();

	//繪制地板  
	glBindTexture(GL_TEXTURE_2D, texGround);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-5.0f, -5.0f, 100.0f);
	glTexCoord2f(0.0f, 1.0f); glVertex3f(5.0f, -5.0f, 100.0f);
	glTexCoord2f(25.0f, 1.0f); glVertex3f(5.0f, -5.0f, -100.0f);
	glTexCoord2f(25.0f, 0.0f); glVertex3f(-5.0f, -5.0f, -100.0f);
	glEnd();

	//繪制頂層  
	glBindTexture(GL_TEXTURE_2D, texSky);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-5.0f, 5.0f, 100.0f);
	glTexCoord2f(0.0f, 3.0f); glVertex3f(5.0f, 5.0f, 100.0f);
	glTexCoord2f(35.0f, 3.0f); glVertex3f(5.0f, 5.0f, -100.0f);
	glTexCoord2f(35.0f, 0.0f); glVertex3f(-5.0f, 5.0f, -100.0f);
	glEnd();
	glutSwapBuffers();
}

void SpecialKey(GLint key, GLint x, GLint y)
{
	if (key == GLUT_KEY_UP)
	{
		zPosition += 1.0f;
	}
	if (key == GLUT_KEY_DOWN)
	{
		zPosition -= 1.0f;
	}
	if (key == GLUT_KEY_LEFT)
	{
		angle += 0.5f;
	}
	if (key == GLUT_KEY_RIGHT)
	{
		angle -= 0.5f;
	}
	glutPostRedisplay();
}

int main(int argc, char* argv[])
{
	// GLUT初始化    
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WindowWidth, WindowHeight);
	glutCreateWindow(WindowTitle);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);    // 啟用紋理    
	texGround = load_texture("ground.bmp");  //加載紋理    
	texWall = load_texture("wall.bmp");
	texSky = load_texture("sky.bmp");
	glutDisplayFunc(&Display);   //回調(diào)函數(shù)    
	glutSpecialFunc(&SpecialKey);
	glutMainLoop(); //循環(huán)調(diào)用    
	return 0;
}


總結(jié)

以上是生活随笔為你收集整理的OpenGL(二十三) 各向异性纹理过滤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品乱| 毛片久久久久久久 | 日韩婷婷 | 大奶在线观看 | 少妇又紧又深又湿又爽视频 | 亚洲一区二区福利视频 | 日批在线观看 | 亚洲欧美电影 | 中文文字幕一区二区三三 | 亚洲午夜久久久久久久国产 | 国产在线播 | 毛片网站免费在线观看 | 国产中文字幕三区 | 欧美激情性做爰免费视频 | 亚洲va国产va天堂va久久 | 91精品国产99 | 国产亚洲制服欧洲高清一区 | av动漫天堂| 国产男男网站 | 久久影音先锋 | 欧美在线观看一区 | 朝桐光一区二区三区 | 日韩在线观看视频一区二区三区 | 欧美高清一区 | 日本不卡影院 | 稀缺呦国内精品呦 | 国产人成一区二区三区影院 | 黄视频在线观看免费 | 中文字幕理伦片免费看 | a网站在线观看 | 中文在线а√在线8 | 7x7x7x人成影视 | 国产精品毛片一区二区三区 | 天堂精品一区 | 成人黄色免费观看 | 国产对白自拍 | 夜夜嗨av一区二区三区免费区 | 久久久久久艹 | 欧美日韩少妇精品 | 六月婷婷综合 | 色偷偷免费视频 | 亚色一区 | 亚洲伦理在线观看 | 亚洲精品视频久久久 | 午夜视频福利在线观看 | 亚欧成人精品一区二区 | 免费成人黄 | 在线观看国产精品入口男同 | 久久影业| 波多野结衣电影免费观看 | 黄色a级免费 | 麻豆久久久午夜一区二区 | 亚洲自拍成人 | 日韩中文字幕在线看 | 国产成人在线视频免费观看 | 日韩日b视频 | 亚洲伦理一区二区 | 国产在线视频你懂的 | 久久av片| 国内自拍在线观看 | 草草在线观看视频 | 中国男人操女人 | 久草91 | 亚洲成人黄色 | 久久成人18免费观看 | 能看毛片的网站 | 亚洲美女精品 | 3344av| 欧美一级夜夜爽 | 久久夜夜操 | 免费看女生裸体视频 | 欧美怡红院一区二区三区 | 成人三级视频 | 6680新视觉电影免费观看 | 在线国产中文字幕 | 屁屁影院一区二区三区 | 国产私拍视频 | 国产又粗又长视频 | 国产这里只有精品 | 草草地址线路①屁屁影院成人 | 午夜剧场免费在线观看 | 日韩专区在线 | 97超碰自拍 | youjizz麻豆| 午夜av免费 | 亚洲av成人无码一二三在线观看 | 免费毛片网站 | 自拍偷自拍亚洲精品播放 | 欧美日韩大陆 | 国产精品成人网站 | 亚洲综合在线一区二区 | 成人网在线视频 | 日本不卡123| 久久av无码精品人妻系列试探 | 亲切的金子片段 | 国产极品美女高潮无套在线观看 | 久久视频精品在线 | 久久精品伦理 | 久久婷婷一区 |