openGL之纹理 :第二课

news2024/9/23 7:32:16
#include "glew.h"
#include "glfw3.h"
#include "SOIL2.h"

//如何解析输入的数据流 0,1,2 分三部分
GLchar * vertextSrc = " #version 330 core \n \
						layout (location = 0) in vec3 position; \
						layout (location = 1) in vec3 color; \
						layout (location = 2) in vec2 texcoord;\
						out vec3 outcolor; \
						out vec2 outtexcoord; \
						void main(){gl_Position = vec4(position, 1.0f);outcolor = color;outtexcoord = texcoord;}";


// texture 是纹理接口 返回纹理颜色, texture(参数1=采样器, 参数2=纹理坐标)
// sampler2D 纹理采样器
GLchar * fragmentSrc = "#version 330 core \n \
					   in vec3 outcolor;\
					   in vec2 outtexcoord;\
					   out vec4 color; \
					   uniform sampler2D ourTexture;\
					   void main(){ \
						color = texture(ourTexture, outtexcoord) *vec4(outcolor,1.0f) ; \
						}";
//

int main()
{
	glfwInit();
	GLFWwindow* window = glfwCreateWindow(500,600,"Texture", NULL,NULL);

	glfwMakeContextCurrent(window);

	glewInit();



	GLfloat arrays[] = {
		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, 0.0f, 0.0f,	   0.0f, 1.0f
	};

	GLuint  earrays[] = {
		0,1,3,
		1,2,3
	};


	//创建数组缓冲对象
	GLuint VAO, VBO, EBO;
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	glGenBuffers(1, &EBO);


	glBindVertexArray(VAO);
	glBindBuffer(GL_ARRAY_BUFFER,VBO);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	

	//GPU 开辟开辟缓存存放数据
	glBufferData(GL_ARRAY_BUFFER, sizeof(arrays), arrays, GL_STATIC_DRAW);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(earrays), earrays, GL_STATIC_DRAW);

	//如何解析数据到顶点着色器,  8 个数据作为一个步长
	glVertexAttribPointer(0, 3,GL_FLOAT,false, 8* sizeof(GLfloat),(GLvoid*)0); //第一个输入变量的解析规则 layout(location=0)
	glVertexAttribPointer(1, 3, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); // layout(location = 1)
	glVertexAttribPointer(2, 2, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); // ...


	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);
	glEnableVertexAttribArray(2);

	//glDeleteBuffers(VBO);
	//glDeleteBuffers(EBO);
	glBindVertexArray(0);

	//创建着色器程序
	GLuint Vertexshader, fragmentShader, programShader;
	Vertexshader = glCreateShader(GL_VERTEX_SHADER);
	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	programShader = glCreateProgram();

	GLint succeed;
	char info[512];

	glShaderSource(Vertexshader,1,&vertextSrc,(GLint*)0);
	glCompileShader(Vertexshader);
	glGetShaderiv(Vertexshader, GL_COMPILE_STATUS, &succeed);
	if (!succeed)
	{
		glGetShaderInfoLog(Vertexshader, 512, NULL, info);
	}

	glShaderSource(fragmentShader, 1, &fragmentSrc, (GLint*)0);
	glCompileShader(fragmentShader);
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &succeed);
	if (!succeed)
	{
		glGetShaderInfoLog(fragmentShader, 512, NULL, info);
	}

	glAttachShader(programShader,Vertexshader);
	glAttachShader(programShader, fragmentShader);
	glLinkProgram(programShader);

	glDeleteShader(Vertexshader);
	glDeleteShader(fragmentShader);

	//创建纹理对象
	GLuint texture;
	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);//绑定应用该纹理对象

	//设置该纹理的纹理环绕方式和纹理过滤方式
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);//x 轴纹理渲染方式,重复渲染
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); // y轴纹理渲染方式

	//纹理过滤:纹理像素映射到纹理坐标上的过程中做的纹理像素处理, 定义一个点(点所在的像素颜色区域,返回颜色值的规则)
	// GL_NEAREST: 邻近过滤 ,返回所在点的当前固定颜色值,整体看起来颜色分明,像素点一样
	// GL_LINEAR: 线性过滤, 返回所在点的(单位面积内的综合颜色值),整体看起来比较模糊,线性过度染色
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);//缩小过滤方式
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);


	int width, height;
	unsigned char* image = SOIL_load_image("E:/container.jpg", &width, &height, 0, SOIL_LOAD_RGB);
	//利用图片和纹理对象生成图片纹理
	glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, width, height, 0,GL_RGB, GL_UNSIGNED_BYTE, image);
	//设置渐远纹理
	glGenerateMipmap(GL_TEXTURE_2D);

	//销毁图片资源和取消绑定该纹理对象
	SOIL_free_image_data(image);
	glBindTexture(GL_TEXTURE_2D, 0);





	while (!glfwWindowShouldClose(window))
	{
		glfwPollEvents();

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

		
		glBindTexture(GL_TEXTURE_2D, texture);
		glUseProgram(programShader);
		glBindVertexArray(VAO);
	
		glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
		glBindVertexArray(0);

		glfwSwapBuffers(window);

	}

	glfwTerminate();


	return 0;
}

在这里插入图片描述

注意点

1.检验着色器编译有没有通过,vec3转vec4有没有正确
2.创建EBO(元素缓存对象)时的绑定数据和加载数据的枚举为 E_ELEMENT_ARRAY_BUFFER
3.使能顶点数组的指定属性
glEnableVertexAttribArray(0);
使能第一个属性:位置
glEnableVertexAttribArray(1);
使能第二个属性:颜色
glEnableVertexAttribArray(2);
使能第三个属性:纹理坐标

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

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

相关文章

MySQL-进阶

存储引擎 MySQL体系结构 连接层: 最上层是一些客户端和连接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层: 第二层架构主要完成大多数的核心服务功能&…

新的centos7.9安装jenkins(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 接上一节文章。 这个版本默认git也安装好了,所以全局配置这个不需要了。 maven安装3.9.3版本…

C++基础(4)——类与对象(默认成员函数)

目录 1.拷贝构造函数: 1.1 为什么要引入拷贝构造: 1.2 拷贝构造函数的定义及特性: 1.3 什么类可以不用编写拷贝构造: 2. 赋值运算符重载: 2.1 为社么要引入运算符重载: 2.2运算符重载的定义以及特性…

EasyExcel 注解fillForegroundColor

EasyExcel 注解fillForegroundColor 对应的颜色值 /** * 样式的数据类 * * author leiyiDong **/ Data // 头背景设置成红色 IndexedColors.RED.getIndex() HeadStyle(fillPatternType FillPatternType.SOLID_FOREGROUND, fillForegroundColor 10) // 头字体设置成20 Hea…

qml ParticleSystem3D使用介绍

在 Qt Quick 3D 中,ParticleSystem3D 是用来创建和控制3D粒子系统的元素。粒子系统是图形编程中用于模拟液体、烟雾、火、星空等现象的技术,它通过生成大量小粒子来模拟这些效果。ParticleSystem3D 提供了一个框架,允许开发者定义粒子的各种属性,如生命周期、速度、颜色、大…

Vue3+vite 处理静态资源,解决服务器不显示动态循环img问题

注意: vue2webpack中,通常使用require来动态渲染静态资源。但在vue3vite中,不支持require语法,因此使用require会报undefined,所以官方推荐使用import来动态渲染静态资源。 实现方式动态渲染静态资源 vue2webpack 使…

GitHub桌面版

GitHub桌面版 一、GitHub 桌面版二、clone 仓库三、更新仓库 一、GitHub 桌面版 二、clone 仓库 三、更新仓库

Netty Review - 探索ByteBuf的内部机制

文章目录 概念ByteBuf VS Java NIO BufferByteBuf实现类HeapByteBuf vs DirectByteBufPooledByteBuf vs UnpooledByteBuf其他 ByteBuf的实现机制 概念 ByteBuf是Netty中用于处理二进制数据的缓冲区 Netty的ByteBuf是一个可用于高效存储和操作字节数据的数据结构。与传统的Byt…

OpenStack云计算平台-计算服务

目录 一、计算服务概览 二、安装并配置控制节点 1、先决条件 2、安全并配置组件 3、完成安装 三、安装和配置计算节点 1、安全并配置组件 2、完成安装 四、验证操作 一、计算服务概览 使用OpenStack计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施即服务…

新的预测模型的局部评价指标-pAUROCc

新的预测模型的局部评价指标-pAUROCc Background 局部评价主要是用在不平衡数据上,其合理性:1.局部评价比全局评价敏感,更容易区分模型的优劣;2.临床决策曲线(DCA)可知,模型使用过程中&#x…

【SpringCloud】从单体架构到微服务架构

今天来看看架构的演变过程 一、单体架构 从图中可以看到,所有服务耦合在一起,数据库存在单点,一旦其中一个服务出现问题时,整个工程都需要重新发布,从而导致整个业务不能提供响应 这种架构对于小项目而言是没有什么…

bclinux aarch64 ceph 14.2.10 云主机 性能对比FastCFS vdbench

部署参考 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph 14.2.10 aarch64 非集群内 客户端 挂载块设备-CSDN博客 FastCFS vdbench数据参考 bclinux aarch64 openeuler 20.03 …

C++初阶 | [五] 内存管理

摘要:new and delete,定位new,(C内存管理的方式),malloc/free和new/delete的区别,内存泄漏 关于内存: 栈又叫堆栈——非静态局部变量/函数参数/返回值等等,栈是向下增长…

Modbus RTU协议及modbus库函数使用

一、与Modbus TCP的区别 在一般工业场景使用modbus RTU的场景还是更多一些,modbus RTU基于串行协议进行收发数据,包括RS232/485等工业总线协议。 与modbus TCP不同的是RTU没有报文头MBAP字段,但是在尾部增加了两个CRC检验字节(CRC…

红队攻防实战之内网穿透隐秘隧道搭建

别低头,皇冠会掉;别流泪,贱人会笑。 本文首发于先知社区,原创作者即是本人 0x00 前言 构建内网隐蔽通道,从而突破各种安全策略限制,实现对目标服务器的完美控制。 当我们从外网成功获得攻击点的时候&…

【性能优化】JVM调优与写出JVM友好高效的代码

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统,通过Git可以方便地管理代码的版本和协作开发。在使用Git时,常见的操作之一就是通过git clone命令将远程仓库克隆…

ky10 server sp3 解决/boot/grub2/grub.cfg 找不到

现象 /boot/grub2 目录下不存在grub.cfg 配置文件 解决 执行下面脚本即可 yum install -y grub2 grub2-mkconfig -o /boot/grub2/grub.cfg 执行完成第一条命令 执行完成第二条命令 查看效果 已经生成这个文件了

Visual Studio 2019 C# System.BadImageFormatException 解决方法

文章目录 1.DLL文件缺失或不匹配原因解决方法 2.系统环境变量Path下内容过多原因解决方法 3.位数错误原因解决方法 分析几种可能因素 1.DLL文件缺失或不匹配 原因 检查对应Debug路径下的DLL文件是否有缺失 解决方法 将对应的DLL文件放到Debug文件夹里面,检查冗余…

成为AI产品经理——模型构建过程(上)

目录 一、背景 1.对内 2.对外 二、模型构建过程 1.模型设计 2.特征工程 ① 数据清洗 ② 特征提取 数值型数据 标签/描述类数据特征 非结构化数据(处理文本特征) 网络关系型数据 ③ 特征选择 ④ 训练集/测试集 一、背景 虽然产品经理不…