texture 纹理(贴图)

纹理

纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。
这是两张照片叠加的效果
在这里插入图片描述
由下面两张叠加而成
在这里插入图片描述
在这里插入图片描述

源代码

在这里插入图片描述

shaders类在自定义着色器 中有完整的源代码。
下边我们使用stb_image.h来解析图片。

#define GLEW_STATIC // 这个一定要加不然报错 静态链接库#include<GL/glew.h>
#include<GLFW/glfw3.h>
#include<iostream>
#include "Shaders.h"#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"using namespace std;void processInput(GLFWwindow);void processInput(GLFWwindow *window) {//如果键盘输入esc 则触发 退出if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {// 设置 要求退出glfwSetWindowShouldClose(window, true);}
}// 逆时针方向绘制  默认情况下,逆时针的顶点连接顺序被定义为三角形的正
// 逆时针或顺时针都是相对于观察者方向的
// uv(st)坐标 u(s)为x轴 v(t)为y轴  是给图片定义的 范围都是0 - 1
float vertices[]{//     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,   // 右上0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,   // 右下-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,   // 左下-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f    // 左上
};
// 使用索引来减小画点的开销 (未用索引缓冲对象时,每个点都需要画一次(即使重复了))
unsigned int indices[]{0, 1, 2, //第一个三角形的索引2, 3, 0 //第二个三角形的索引
};int main() {// 初始化GLFWglfwInit();// 提示 我们使用的版本是3.3// 主版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// 次版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 简介glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow *window = glfwCreateWindow(800, 600, "Test window", NULL, NULL);if (window == NULL) {cout << "open window failed." << endl;// 终止 glfwglfwTerminate();}// 绑定window到上下文对象 创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了glfwMakeContextCurrent(window);glewExperimental = true;// GLEW_OK 0//init GLEWif (glewInit() != GLEW_OK) {cout << "glew init failed." << endl;// 终止 glfwglfwTerminate();return -1;}// OpenGL渲染窗口的尺寸大小// glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)glViewport(0, 0, 800, 600);// 设置剔除 (opegl默认正面背面都显示(不剔除))//glEnable(GL_CULL_FACE);// 剔除背面 GL_BACK 剔除正面 GL_FRONT//glCullFace(GL_BACK);// 线框模式//第一个参数表示我们打算将其应用到所有的三角形的正面和背面,第二个参数告诉我们用线来绘制//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//VAO对象unsigned int VAO;// 生成一个VAO对象 这个方法可以生成多个 由第一个参数决定glGenVertexArrays(1, &VAO);// 绑定 VAOglBindVertexArray(VAO);unsigned int VBO; //如果多个可以用 VBO[]数组 这个方法可以生成多个 由第一个参数决定glGenBuffers(1, &VBO);//将新创建的缓冲绑定到 GL_ARRAY_BUFFER目标上glBindBuffer(GL_ARRAY_BUFFER, VBO);// glBufferData 是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数// GL_STATIC_DRAW 数据不会或几乎不会改变。glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);unsigned int EBO;glGenBuffers(1, &EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);Shaders *shaders = new Shaders("./shaders/vertexSource.txt", "./shaders/fragmentSource.txt");// glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)// 从 0号栏位 开始 将数据每三个为一组 单位为float 每次跳6*float字节 偏移为0glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) 0);// 以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的//读取到0号栏位上glEnableVertexAttribArray(0);// 读取颜色属性 从 1号栏位 开始 将数据每三个为一组 单位为float 每次跳6*float字节 偏移为3个floatglVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) (3 * sizeof(float)));// 读取到1号栏位上glEnableVertexAttribArray(1);// 读取纹理坐标glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *) (6 * sizeof(float)));glEnableVertexAttribArray(2);// 纹理缓冲对象unsigned int TexBufferA;unsigned int TexBufferB;//创建纹理缓冲对象glGenTextures(1, &TexBufferA);// 绑定//glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, TexBufferA);//glActiveTexture(GL_TEXTURE3);// stb_image.h 使用int width, height, nrchannels;//  在OpenGl中 y轴的读取是与正常图片相反了 所以需要 设置 翻转(flip)垂直(vertically)加载(load) 为truestbi_set_flip_vertically_on_load(true);//获取图片的rgbunsigned char *data1 = stbi_load("container.jpg", &width, &height, &nrchannels, 0);cout<<width<<" "<<height<<endl;if (data1) {// 纹理可以通过glTexImage2D来生成glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data1);//直接在生成纹理之后调用glGenerateMipmap。这会为当前绑定的纹理自动生成所有需要的多级渐远纹理。 必须要有 glGenerateMipmap 否则无法显示纹理 glGenerateMipmap(GL_TEXTURE_2D);} else {cout << "load image failed." << endl;}//释放图像的内存stbi_image_free(data1);glBindTexture(GL_TEXTURE_2D,0);glGenTextures(1, &TexBufferB);glBindTexture(GL_TEXTURE_2D, TexBufferB);unsigned char *data2 = stbi_load("ground-texture.jpg", &width, &height, &nrchannels, 0);cout<<width<<" "<<height<<endl;if (data2) {// 纹理可以通过glTexImage2D来生成glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data2);//直接在生成纹理之后调用glGenerateMipmap。这会为当前绑定的纹理自动生成所有需要的多级渐远纹理。glGenerateMipmap(GL_TEXTURE_2D);} else {cout << "load image failed." << endl;}stbi_image_free(data2);glBindTexture(GL_TEXTURE_2D,0);//渲染循环 ,它能在我们让GLFW退出前一直保持运行。下面几行的代码就实现了一个简单的渲染循环://glfwWindowShouldClose 我们每次循环的开始前检查一次GLFW是否被要求退出while (!glfwWindowShouldClose(window)) {//自定义事件 当键盘触发esc 退出processInput(window);glClearColor(0.2, 0.3, 0.3, 1.0);// GL_COLOR_BUFFER_BIT 颜色,GL_DEPTH_BUFFER_BIT 深度 和 GL_STENCIL_BUFFER_BIT 模板// 清除前面的那一帧的颜色glClear(GL_COLOR_BUFFER_BIT);// 绑定 TextureBufferglActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, TexBufferA);glActiveTexture(GL_TEXTURE3);glBindTexture(GL_TEXTURE_2D, TexBufferB);// 绑定 VAOglBindVertexArray(VAO);shaders->use();// 如果只有单个纹理,则不需要以下操作,OpenGL会自动绑定glUniform1i(glGetUniformLocation(shaders->ID, "ourTexture1"), 0);glUniform1i(glGetUniformLocation(shaders->ID, "ourTexture3"), 3);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//可以不需要这个 绑定VAO的同时也会自动绑定EBO//glDrawElements函数从当前绑定到GL_ELEMENT_ARRAY_BUFFER目标的EBO中获取索引glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);//解绑VAOglBindVertexArray(0);glfwSwapBuffers(window);glfwPollEvents();}// 最后终止 glfwglfwTerminate();return 0;
}

shaders

顶点着色器

#version 330 core                                      
// 0号栏位读取顶点坐标
layout (location = 0) in vec3 aPos;                    
//1号栏位读取颜色颜色
layout (location = 1) in vec3 aColor;
// 2号栏位读取 纹理坐标
layout (location = 2) in vec2 aTexCoord;
out vec4 vertexColor;
out vec2 TexCoord;
void main()
{                                                      
//  gl_Position 是固定的名称 用来保存 顶点坐标的gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);vertexColor = vec4(aColor.x,aColor.y,aColor.z,1.0);TexCoord = aTexCoord;
}                                                      

片元着色器

#version 330 core                          
out vec4 FragColor;                        
//uniform vec4 outColor;                     
in vec4 vertexColor;
// 获取顶底着色器过来的纹理坐标
in vec2 TexCoord;
uniform sampler2D ourTexture1;
uniform sampler2D ourTexture3;
void main()
{                                          //FragColor = vertexColor;// 采样纹理的颜色 第一个参数是纹理采样器 是cpu传过来的 第二个参数的对应的纹理坐标FragColor  = mix(texture(ourTexture1,TexCoord) , texture(ourTexture3,TexCoord),0.55);
}                                          

stb_image.h 代码

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

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

相关文章

如何进行防SQL注入?

1、过滤掉一些常见的数据库操作关键字&#xff1a;select,insert,update,delete,and,*等 或者通过系统函数&#xff1a;addslashes(需要被过滤的内容)来进行过滤。 2、在PHP配置文件中 Register_globalsoff;设置为关闭状态 //作用将注册全局变量关闭。 比如&#xff1a;接收POS…

微信开发4——PHP实现PC扫码授权登陆获取用户信息

首先须要申请,必须企业,个体工商户,媒体等&#xff0c;微信开放平台申请地址 https://open.weixin.qq.com/&#xff0c;要交300多的费用才能开通 1&#xff0c;编写入口&#xff1a;微信开放平台的扫码登陆开放的接口可以自动生成PC扫码页面&#xff0c;你得到了官方通过审核的…

计算机组成原理和体系结构----软考(到处copy)

计算机组成原理和体系结构数据的表示n进制转十进制十进制转n进制 使用短除法二进制转八进制和十六进制原码、反码、补码以及移码浮点数运算计算机结构计算机体系结构分类 - FlynnCISC 和 RISC流水线流水线计算流水线时间计算流水线吞吐率计算流水线的加速比计算流水线的效率计算…

一个笔试题

题目&#xff1a;输入一个数N&#xff0c;计算1、2、3、...、N这N个数进行排列组合&#xff0c;使得这个数列任意两个相邻数之和为素数&#xff0c;求结果T&#xff0c;T为这样的数列的个数&#xff1b; private static final Map<Integer, Boolean> SUSHU new HashMap&…

Ubuntu16.04安装Hadoop+Spark+pyspark大数据python开发环境

一&#xff0c;安装jdk1.8.0.144 下载地址&#xff1a;www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html Ubuntu配置jdk运行环境 export HADOOP_HOME/usr/local/hadoop export CLASSPATH$($HADOOP_HOME/bin/hadoop classpath):$CLASSPA…

C# 分割字符串方法

单个字符分割 string s"abcdeabcdeabcde"; string[] sArrays.Split(c); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 多个字符分割 string s"abcdeabcdeabcde string[] sArray1s.Split(new char[3]{c,d,e})…

使用IntelliJ IDEA和Maven管理搭建+Web+Tomcat开发环境

使用IntelliJ IDEA和Maven管理搭建WebTomcat开发环境 使用IntelliJ IDEA和Maven管理搭建WebTomcat开发环境 前言&#xff1a;原来一直使用Eclipse&#xff0c;换工作后使用IDEA&#xff0c;初识IDEA发现&#xff0c;哇&#xff0c;它的快捷键可真多啊&#xff0c;但是一路用下…

SpringBoot部署项目到Linux上传文件路径问题

SpringBoot部署项目到Linux上传文件路径问题 使用项目相对路径上传到话会上传到linux服务器到/tmp 临时文件目录中&#xff0c;但是问题是还会报异常 Caused by: java.io.FileNotFoundException: /tmp/tomcat.8223985333111777969.80/work/Tomcat/localhost/ROOT/file:/projec…

Android权限Uri.parse总结

Android权限Uri.parse的详细资料刚整理了份Android权限Uri.parse的资料1&#xff0c;调web浏览器Uri myBlogUri Uri.parse("http://xxxxx.com");returnIt new Intent(Intent.ACTION_VIEW, myBlogUri);2&#xff0c;地图Uri mapUri Uri.parse("geo:38.899533,…

一起玩Docker之1——Ubuntu配置安装Docker运行环境并安装(Ubuntu、Centos)镜像

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&am…

SpringBoot执行器端点Actuator Endpoint

比较常用的Endpoint URL作用/actuator/health健康检查/actuator/beans查看容器中所有的Bean/actuator/mapping查看Web的URL映射/actuator/env查看环境信息 默认/actuator/health和/actuator/info是可以通过Web访问&#xff0c;其他的需要解禁 在配置文件中可以设置可以访问哪…

EOF标准输入

Linux中&#xff0c;在新的一行的开头&#xff0c;输入Ctrl-d&#xff0c;就代表EOF&#xff08;如果在一行的中间按下Ctrl-d&#xff0c;表示输出“标准输入”的缓存区&#xff0c;这时需要按两次&#xff09;。另外Ctrl-z表示中断进程&#xff0c;在后台挂起&#xff0c;用fg…

玩玩机器学习3——TensorFlow基础之Session基本运算、占位符和变量的使用

通过TensorFlow的矩阵和常量的"加减乘除"运算&#xff0c;讲一下Session、变量以及占位符的使用 目录 Session创建会话与运算 变量的使用 占位符的使用 Session创建会话与运算 #session的使用&#xff0c;介绍两种启动Session的方式&#xff0c;进行矩阵乘法运算…

域内禁止不明东西连接DHCP

今天在Windows论坛看到一大牛版主分享的经验&#xff0c;赶紧挺好&#xff0c;就赶紧记下来。 http://bbs.51cto.com/thread-967999-1.html 再补充一点点 域内查看其他pc的 MAC 地址 同一网段的 直接 ping一下 对方 ip地址 然后 arp -a 一下 不通网段的 可以先在 dhc…

SpringBoot中mybatis配置多数据源

首先需要创建多个数据库 简单的user表 CREATE TABLE user (id int NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,age int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8;导入项目依赖 <dependencies><dependency&g…

玩玩机器学习4——TensorFlow基础之激活函数

激活函数&#xff08;activation function&#xff09;运行时激活神经网络中某一部分神经元&#xff0c;将激活信息向后传入下一层的神经网络。神经网络之所以能解决非线性问题&#xff08;如语音、图像识别&#xff09;&#xff0c;本质上就是激活函数加入了非线性因素&#x…

centos更改MySQL数据库目录位置

http://barrelfish.blog.163.com/blog/static/130650826201010204911893/ MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步&#xff1a;1、home目录下建立data目录cd /homemkdir data2、把MySQL服务进程停掉&#xff1a; mysqladm…

玩玩机器学习5——构造单层神经网络解决非线性函数(三次函数)的曲线拟合

使用TensorFlow构造了一个隐藏层和输出层的神经网络&#xff0c;做非线性曲线的拟合 import tensorflow as tf import matplotlib.pyplot as plt import numpy as npnp.random.seed(1) x np.linspace(-1, 1, 100)[:, np.newaxis] #创建一个新维度 noise np.random.normal(0,…

分享:假如浏览器和搜索引擎不再支持外部链接跳转,优化何去何从呢?

分享&#xff1a;假如浏览器和搜索引擎不再支持外部链接跳转&#xff0c;优化何去何从呢&#xff1f; 当我们的浏览器和搜索引擎不再支持外部链接跳转&#xff0c;我们的优化何去何从呢&#xff1f; 其实这是一个假设。 如果真有那么一天。 那么&#xff0c;搜索引擎也许只要…

HTML网页使用CDN的jquery.qrcode.min.js生成页面二维码(直接可以复制使用)

HTML页面代码 <!DOCTYPE html> <html> <head><title></title><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"generator" content"pandoc" /><meta n…