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;
}

运行截图

在这里插入图片描述

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

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

相关文章

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中&#xff0c;都是直接在Ubuntu中进行验证的&#xff0c;对于嵌入式Linux系统来说&#xff0c;也是可以直接移植的&#xff0c;只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中&#xff0c;编写的应用程序通常需要…

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器&#xff1a; 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux&#xff1a; [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

nginx https 一个端口代理多个前端项目

打包修改 &#xff01;&#xff01;&#xff01;注意&#xff1a;第一个location root 调用的项目不用修改 打包路径&#xff0c;直接用 ‘/’&#xff0c;其他项目或者需加 /mobile 路径 worker_processes 1; events {worker_connections 1024; } http {include mime.…

K8S集群中PLEG问题排查

一、背景 k8s集群排障真的很麻烦 今天集群有同事找我&#xff0c;节点报 PLEG is not healthy 集群中有的节点出现了NotReady&#xff0c;这是什么原因呢&#xff1f; 二、kubernetes源码分析 PLEG is not healthy 也是一个经常出现的问题 POD 生命周期事件生成器 先说下PL…

for for in for of 的区别

for是JavaScript中最基本的循环语句&#xff0c;它可以用于遍历数组和对象中的元素&#xff0c;语法如下&#xff1a; for (初始化; 判断条件; 增量) {// 循环体 }其中&#xff0c;初始化是循环开始前执行的语句&#xff0c;判断条件是判断循环是否可以继续的条件&#xff0c;…

Pybullet -------[ 1 ]

1. p.addUserDebugText() 这个函数允许在仿真环境中动态添加文本&#xff0c;用于调试和可视化。你可以指定文本的内容、位置、颜色、大小等属性。 p.addUserDebugText(text, textPosition, textColorRGB[1,1,1], textSize1, lifeTime0, parentObjectUniqueId0,parentLinkInde…

机器视觉双目测宽仪具体有什么优势?

双目测宽仪是机器视觉原来制造而成的智能宽度检测设备&#xff0c;广泛应用于板材类产品的宽度检测。通过测宽仪的使用&#xff0c;实时了解产品宽度品质&#xff0c;进行超差提示&#xff0c;减少废品的生产。 双目测宽仪优势 测量软件界面显示&#xff1a;产品规格、标称宽…

MATLAB算法实战应用案例精讲-【图像处理】FPGA

目录 前言 算法原理 FPGA 是什么 FPGA的定义以及和GPU的类比 FPGA 有什么用 1)通信领域

Android控件全解手册 - 任意View缩放平移工具-源码

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

详细介绍如何使用 PaddleOCR 进行光学字符识别-(含源码及讲解)

阅读巨大的文档可能会非常累并且非常耗时。您一定见过许多软件或应用程序,只需单击图片即可从文档中获取关键信息。这是通过一种称为光学字符识别 (OCR) 的技术来完成的。光学字符识别是近年来人工智能领域的重点研究之一。光学字符识别是通过理解和分析图像的基本模式来识别图…

竞赛选题 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享…

yolov8-pose姿势估计,站立识别

系列文章目录 基于yolov8-pose的姿势估计模式,实现站姿,坐姿,伏案睡姿识别,姿态动作识别接口逻辑作参考。本文以学习交流,分享,欢迎留言讨论优化。 yoloPose-姿势动作识别 系列文章目录前言一、环境安装二、使用yolov8-pose1.导入模型,预测图像三.姿势动作识别之站立总…

unity实时保存对象的位姿,重新运行程序时用最后保存的数据给物体赋值

using UnityEngine; using System.IO; // using System.Xml.Serialization; public class SaveCoordinates : MonoBehaviour {public GameObject MainObject;//读取坐标private float x;private float y;private float z;private Quaternion quaternion;private void Start(){/…

如何使用torchrun启动单机多卡DDP并行训练

如何使用torchrun启动单机多卡DDP并行训练 这是一个最近项目中需要使用的方式&#xff0c;新近的数据集大概在40w的规模&#xff0c;而且载入的原始特征都比较大&#xff08;5&#xff5e;7M&#xff09;&#xff0c;所以准备尝试DistributedDataParallel&#xff1b; 主要目…

Qt 自定义标题栏

在Qt中&#xff0c;如果你想要自定义窗口的标题栏&#xff0c;你可以通过覆盖窗口的windowTitleChanged信号来实现。然而&#xff0c;直接修改Qt的标题栏可能会带来一些问题&#xff0c;因为Qt的设计是尽量使窗口系统的行为标准化。 以下是一个基本的示例&#xff0c;如何在Qt…

Java中的集合

Java中的集合 java.util 包中的集合 Java 集合框架提供了各种集合类&#xff0c;用于存储和管理对象。以下是 Java 集合框架中常见的集合类&#xff1a; List 接口表示一个有序的集合&#xff0c;其中的元素可以重复。List 接口有以下实现类&#xff1a; ArrayList&#xff1…

人工智能_机器学习053_支持向量机SVM目标函数推导_SVM条件_公式推导过程---人工智能工作笔记0093

然后我们再来看一下支持向量机SVM的公式推导情况 来看一下支持向量机是如何把现实问题转换成数学问题的. 首先我们来看这里的方程比如说,中间的黑线我们叫做l2 那么上边界线我们叫l1 下边界线叫做l3 如果我们假设l2的方程是上面这个方程WT.x+b = 0 那么这里 我们只要确定w和…

<Linux> 文件理解与操作

目录 前言&#xff1a; 一、关于文件的预备知识 二、C语言文件操作 1. fope 2. fclose 3. 文件写入 3.1 fprintf 3.2 snprintf 三、系统文件操作 1. open 2. close 3. write 4. read 四、C文件接口与系统文件IO的关系 五、文件描述符 1. 理解文件描述符 2. 文…

时延抖动和通信的本质

先从网络时延抖动的根源说起。 信息能否过去取决于信道容量&#xff0c;而信道利用率则取决于编码。这是香农定律决定的。 考虑到主机处理非常快&#xff0c;忽略处理时延&#xff0c;端到端时延就是信息传播时延&#xff0c;但现实中通信信道利用率非常不均匀&#xff0c;统…