OpenGL笔记:纹理的初次使用

news2024/9/21 20:51:58

说明

纹理的代码写完后,一直出不来结果,原因是没有设置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;
}

运行截图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm全网最新安装教程(附加activation code),支持2018-2023版本

官网地址Download PyCharm: Python IDE for Professional Developers by JetBrains 下载的话无脑下载安装即可&#xff01; 2018.2~2023版本用这个&#xff0c;最新的activation code码 2018.1以下版本用这个 老是审核不通过只能贴图片了&#xff08;T-T&#xff09;

pycharm右键执行,出现Run ‘Python tests in xxx‘的问题

1.问题描述 用pytest框架写了一个python的模块&#xff0c;右键执行时发现&#xff0c;执行的模块显示有问题&#xff0c;如下图所示 2.解决问题 Python tests这表示&#xff0c;当前运行的代码文件进入了pytest模式&#xff0c;pytest模式不同于run模式&#xff0c;因为运行…

基于SSM的论文管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Leetcode(面试题 08.01.)三步问题

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode(面试题 08.01.)三步问题相关的内容 一、题目分析 1.小孩可以上一阶&#xff0c;两阶&#xff…

Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举

Redis 主从挂载后的内核数据结构分析 主节点中&#xff0c;会通过 clusteNode 中的 slaves 来记录该主节点包含了哪些从节点&#xff0c;这个 slaves 是一个指向 *clusterNode[] 数组的数据结构从节点中&#xff0c;会通过 clusterNode 中的 slaveof 来记录该从节点属于哪个主…

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件&#xff0c;即HAP一个应用中的.hap文件合在一起称为一个Bundle&#xff0c;bundleName是应用的唯一标识 需要特别说明的是&…

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言&#xff1a; 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类&#xff0c;这个类获取到当前玩家的输入设备&#xff0c;输入…

ruby3.2.2 报错 undefined symbol: EC_GROUP_new_curve_GF2m

一、执行ruby -ropenssl -e puts OpenSSL::OPENSSL_VERSION 查看openssl版本时报错 ruby -ropenssl -e puts OpenSSL::OPENSSL_VERSION 这是因为ruby内的openssl版本是3.2.0版本的 而自openssl3.0以后已经废弃 EC_GROUP_new_curve_GF2m了 二、解决方案 指定ruby内的openssl…

内测分发平台是否支持敏捷开发和持续集成?

大家好&#xff0c;我是咕噜-凯撒。敏捷开发和持续集成是软件开发中非常重要的流程和方法。内测分发平台作为应用开发和测试的关键环节需要具备这种能力。下面我简单的介绍一下敏捷开发和持续集成和提供的功能。图片来源&#xff1a;news.gulufenfa.com 敏捷开发是一种迭代、协…

分析:为什么有些pdf打开之后无法编辑?

pdf文件大家应该都经常接触&#xff0c;但是不知道大家会遇到这种情况&#xff1a;有些PDF文件打开之后无法编辑&#xff1f;是什么原因呢&#xff1f;今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

智能优化算法应用:基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于猫群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猫群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【傻瓜级JS-DLL-WINCC-PLC交互】3.JS-DLL进行交互

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

ArrayList 和 HashMap 源码解析

1、ArrayList 1.1、ArrayList 构造方法 无参创建一个 ArrayList 数组默认为空数组 transient Object[] elementData; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; private int size; // 数组容量大小public ArrayList() {this.elementData DEFA…

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能&#xff08;AI&#xff09;在许多方面已经取得了重大进展&#xff0c;但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务&#xff0c;而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…

传智杯-题目1

运气 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; long long n, k, an…

你要的fiddler快捷键全部在这里了,学最全的快捷键,做最快的IT程序员

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

Flask教程入门

1.学习Flask之前&#xff0c;首先需要对URL进行一定的了解。 URL的一些知识&#xff1a; 1.URL只能包含ASCII码里面一些可显示的字符&#xff0c;如A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;&&#xff0c;#&#xff0c;%&#xff0c;&#xff1f;&#xff0c;/等字符…

前端量子纠缠 效果炸裂 multipleWindow3dScene

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…