OpenGL笔记:纹理的初次使用

说明

纹理的代码写完后,一直出不来结果,原因是没有设置GL_TEXTURE_MIN_FILTER, 它的默认值为GL_NEAREST_MIPMAP_LINEAR, 因为这里我还没用到Mipmap,所以使用这个默认值,结果是错误的,关于mipmap后面再学习。

代码

#define FREEGLUT_STATIC
#include "gl/freeglut.h"
#include <vector>

#include <iostream>
#include <vector>

#define MY_PI_VALUE (3.141592653)


GLfloat fAngleBaseOnXAxis = 0.0; //角度
GLfloat fAngleBaseOnYAxis = 0.0; //角度
GLfloat fAngleStep = 5.0; //角度增加值
const float g_fAxisRange = 1000.0f;


void DrawBox()
{
	glEnable(GL_TEXTURE_2D);
	GLubyte myTexImg[4][4][3] = {
		{ { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 } },
		{ { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff } },
		{ { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 } },
		{ { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0x00, 0x00, 0xff } }
	};

	//GL_TEXTURE_MIN_FILTER的设置很重要,否则纹理出不来
	//The initial value of GL_TEXTURE_MIN_FILTER is GL_NEAREST_MIPMAP_LINEAR.
	//The initial value of GL_TEXTURE_MAG_FILTER is GL_LINEAR.
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, myTexImg);


	glBegin(GL_QUADS);

	double dSize = 500.0;

	//上
	glNormal3d(0, 0, 1.0);
	glTexCoord2d(0.0, 0.0);
	glVertex3d(0.0, 0.0, 0.0);
	glTexCoord2d(1.0, 0.0);
	glVertex3d(dSize, 0.0, 0.0);
	glTexCoord2d(1.0, 1.0);
	glVertex3d(dSize, dSize, 0.0);
	glTexCoord2d(0.0, 1.0);
	glVertex3d(0.0, dSize, 0.0);

	//下
	glNormal3d(0, 0, -1.0);
	glVertex3d(0.0, 0.0, -dSize);
	glVertex3d(0.0, dSize, -dSize);
	glVertex3d(dSize, dSize, -dSize);
	glVertex3d(dSize, 0.0, -dSize);
	
	//左
	glNormal3d(-1.0, 0.0, 0.0);
	glTexCoord2d(0.0, 0.0);
	glVertex3d(0.0, 0.0, 0.0);
	glTexCoord2d(1.0, 0.0);
	glVertex3d(0.0, dSize, 0.0);
	glTexCoord2d(1.0, 1.0);
	glVertex3d(0.0, dSize, -dSize);
	glTexCoord2d(0.0, 1.0);
	glVertex3d(0.0, 0.0, -dSize);
	
	//右
	glNormal3d(1.0, 0.0, 0.0);
	glVertex3d(dSize, 0.0, 0.0);
	glVertex3d(dSize, 0.0, -dSize);
	glVertex3d(dSize, dSize, -dSize);
	glVertex3d(dSize, dSize, 0.0);
	
	//前
	glNormal3d(0.0, -1.0, 0.0);
	glVertex3d(0.0, 0.0, 0.0);
	glVertex3d(0.0, 0.0, -dSize);
	glVertex3d(dSize, 0.0, -dSize);
	glVertex3d(dSize, 0.0, 0.0);
	
	//后
	glNormal3d(0.0, 1.0, 0.0);
	glVertex3d(0.0, dSize, 0.0);
	glVertex3d(dSize, dSize, 0.0);
	glVertex3d(dSize, dSize, -dSize);
	glVertex3d(0.0, dSize, -dSize);
	glEnd();
}


void OnDisplay()
{
	glEnable(GL_LIGHTING);
	glEnable(GL_DEPTH_TEST);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

	//光照
	glEnable(GL_LIGHT0);
	GLfloat fAmbients[] = { 0.1, 0.1, 0.1, 1.0 };
	GLfloat fDiffuse[] = { 0.9, 0.9, 0.9, 1.0 };
	GLfloat fSpecular[] = { 1.0, 1.0, 1.0, 1.0 };
	GLfloat fLightPos[] = { 0.0, 0.0, 1.0, 0.0 };
	glLightfv(GL_LIGHT0, GL_AMBIENT, fAmbients);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, fDiffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR, fSpecular);
	glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);


	glPushMatrix();
	//glTranslatef(100, 100, 0);
	glRotatef(fAngleBaseOnXAxis, 1.0, 0.0, 0.0);
	glRotatef(fAngleBaseOnYAxis, 0.0, 1.0, 0.0);

	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

	DrawBox();

	glPopMatrix();

	glFlush();
}


void OnEventSpecialKey(int key, int x, int y)
{
	if (key == GLUT_KEY_LEFT)
	{
		//绕y轴顺时针
		fAngleBaseOnYAxis -= fAngleStep;

	}
	else if (key == GLUT_KEY_RIGHT)
	{
		//绕y轴逆时针
		fAngleBaseOnYAxis += fAngleStep;
	}
	else if (key == GLUT_KEY_UP)
	{
		//绕x轴顺时针
		fAngleBaseOnXAxis -= fAngleStep;
	}
	else if (key == GLUT_KEY_DOWN)
	{
		//绕x轴逆时针
		fAngleBaseOnXAxis += fAngleStep;
	}

	//XXX:此处是不是这样调用呢?
	//OnDisplay();
	glutPostRedisplay();
}


void OnReshape(int nWidth, int nHeight)
{
	if (nWidth == 0) nWidth = 1;
	if (nHeight == 0) nHeight = 1;

	glViewport(0, 0, nWidth, nHeight);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (nWidth > nHeight)
	{
		glOrtho(-g_fAxisRange * nWidth / nHeight, g_fAxisRange * nWidth / nHeight,
			-g_fAxisRange, g_fAxisRange, -g_fAxisRange, g_fAxisRange);
	}
	else
	{
		glOrtho(-g_fAxisRange, g_fAxisRange, -g_fAxisRange * nHeight / nWidth,
			g_fAxisRange * nHeight / nWidth, -g_fAxisRange, g_fAxisRange);
	}

	glMatrixMode(GL_MODELVIEW);
}



int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitWindowSize(400, 400);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutCreateWindow("Texture");
	glutDisplayFunc(OnDisplay); //必须在glutCreateWindow之后,否则设置会失败
	glutReshapeFunc(OnReshape);
	glutSpecialFunc(OnEventSpecialKey);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-g_fAxisRange, g_fAxisRange, -g_fAxisRange, g_fAxisRange, -g_fAxisRange, g_fAxisRange);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0, 0, 0, 0, 0, -1, 0, 1, 0); //俯视图
	//gluLookAt(0, 0, 0, 0, 1, 0, 0, 0, 1); //主视图
	//gluLookAt(0, 0, 0, 0, -1, 0, 0, 0, -1);
	//gluLookAt(0, 0, 0, 1, -1, -1, 0, 1, 0);

	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	glutMainLoop();

	return 0;
}

运行截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/199474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Paragon NTFS16Mac读写外置移动硬盘专业工具

Paragon NTFS for Mac16是一款非常不错的Mac读写工具&#xff0c;解决了大部分Mac电脑用户无法读取移动硬盘的困扰&#xff0c;Paragon NTFS for 16版一直是Mac OS平台上最受欢迎的NTFS硬盘格式读取工具&#xff0c;有了NTFS for Mac &#xff0c;安装了双系统的Mac用户可以在O…

从Android面试题目溯源-1、创建线程有那几种方式

概念 程序执行流的最小单位&#xff0c;处理器调度调度和分派的基本单位。 如何理解这个概念 如下图&#xff0c;可以简单类比吉他&#xff0c;六根弦代表六个线程&#xff0c;每个线程独立且单独运行&#xff0c;且持有上一个音的状态&#xff0c;每根手指可类比为一个CPU的…

C#开发的OpenRA游戏之属性SelectionDecorations(12)

C#开发的OpenRA游戏之属性SelectionDecorations(12) 前面分析了显示选择框的指示器类SelectionBoxAnnotationRenderable,它的作用就是画一个四个角的方角。 这个类是在属性SelectionDecorations里调用的,如下: protected override IEnumerable<IRenderable> Rende…

企业如何选择安全又快速的大文件传输平台

在现代信息化社会&#xff0c;数据已经成为各个行业的重要资源&#xff0c;而数据的传输和交换则是数据价值的体现。在很多场合&#xff0c;企业需要传输或接收大文件&#xff0c;例如设计图纸、视频素材、软件开发包、数据库备份等。这些文件的大小通常在几百兆字节到几十个字…

交流负载的原理与应用

交流负载是指能够消耗交流电能的设备或系统&#xff0c;在电力系统中&#xff0c;交流负载是不可或缺的一部分&#xff0c;它们将电能转化为其他形式的能量&#xff0c;以满足人们生产和生活的需求。交流负载的原理与应用涉及到许多方面&#xff0c;包括电气工程、电子技术、自…

数据库系统概述之国产数据库

当今世界&#xff0c;数据已成为重要的生产要素&#xff0c;数据库管理系统更是广泛应用于信息化行业各领域&#xff0c;国内数据库产业能否健康可持续的发展&#xff0c;在很大程度上影响着国民经济发展和网络空间安全。 当前&#xff0c;国产数据库行业竞争非常激烈&#xf…

Docker 安装kafka 并创建topic 进行消息通信

Apache Kafka是一个分布式流处理平台&#xff0c;用于构建高性能、可扩展的实时数据流应用程序。本文将介绍如何使用Docker容器化技术来安装和配置Apache Kafka。 一、使用镜像安装 1、kafka安装必须先安装Zookpper 2、下载镜像 docker pull wurstmeister/kafka 3、查看下载…

万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC

@[toc] 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

Leetcode—1670.设计前中后队列【中等】

2023每日刷题&#xff08;四十三&#xff09; Leetcode—1670.设计前中后队列 实现代码 erase(iterator position)在删除vector中的元素后&#xff0c;会将该元素的后面所有元素都往前挪一位。因此&#xff0c;原先的迭代器指向的元素就不是原来那个了&#xff0c;而是它的后…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c; 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…

网络聊天室项目

服务器端 #include <myhd.h>//传输结构体 struct cli {char type; // L/C/Qchar name[20];char text[128]; }; int main(int argc, const char *argv[]) {if(argc!3){printf("请输入ip地址和端口号\n");return -1;}//1、创建用于通信的套接字文件描述符in…

Kubernetes Dashboard 涉及的一些常规技巧

Kubernetes Dashboard 提供了一个GUI形式的K8S集群管理工具&#xff0c;通过它我们能很容易的观察到集群资源消耗情况、服务器运行状态以及针对Pod的相关观察与操作&#xff1b; Dashboard 的相关配置 Dashboard 提供了通过配置启动命令行参数来控制其相关行为的能力&#xf…

Docker—共享应用程序

现在您已经构建了一个映像&#xff0c;可以共享它。要共享Docker映像&#xff0c;您必须使用Docker注册表。默认注册表是Docker Hub&#xff0c;是您使用的所有图像的来源。 Docker ID&#xff08;Docker标识&#xff09; Docker ID允许您访问Docker Hub&#xff0c;这是世界上…

Hive安装与配置

你需要掌握&#xff1a; 1.Hive的基本安装&#xff1b; 2.Mysql的安装与设置&#xff1b; 3.Hive 的配置。 注意&#xff1a;Hive的安装与配置建立在Hadoop已安装配置好的情况下。 hadopp安装与配置 Hive 的基本安装 从 官网 下载Hive二进制包&#xff0c;下载好放在/op…

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如: 我们在编写CI/…

卓越进行时 | 西安交通大学校友莅临赛宁网安参观考察

近日&#xff0c;为了深入贯彻网络安全强国战略建设&#xff0c;积极发挥网络安全企业的先进作用&#xff0c;推动校企合作与协作共赢。西安交通大学领导携校友会来到赛宁网安网络安全卓越中心进行参观考察&#xff0c;为进一步的校企合作和产业孵化奠定基础。 活动期间&#…

Maven——Maven使用基础

1、安装目录分析 1.1、环境变量MAVEN_HOME 环境变量指向Maven的安装目录&#xff0c;如下图所示&#xff1a; 下面看一下该目录的结构和内容&#xff1a; bin&#xff1a;该目录包含了mvn运行的脚本&#xff0c;这些脚本用来配置Java命令&#xff0c;准备好classpath和相关…

C语言数据结构之顺序表(上)

前言&#xff1a; ⭐️此篇博文主要分享博主在学习C语言的数据结构之顺序表的知识点时写的笔记&#xff0c;若有错误&#xff0c;还请佬指出&#xff0c;一定感谢&#xff01;制作不易&#xff0c;若觉得内容不错可以点赞&#x1f44d;收藏❤️&#xff0c;这是对博主最大的认可…

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};