首页 > 其他分享 >OpenGL(VS2022)---(5)

OpenGL(VS2022)---(5)

时间:2024-12-05 11:04:09浏览次数:8  
标签:2D Texture1 OpenGL TEXTURE 纹理 --- VS2022 GL 着色器

前言

对纹理的简单实现现在应该都理解了,不知道你们有没有考虑过一个问题,每一次都要重新创建一个工程,明明只是修改一部分代码,却要重新配置,能不能复制一个工程再重命名直接修改吗?

如果有考虑过这个问题的小伙伴就会发现,原文件A,复制文件改名为B,修改B的内容,会发现A也被改了,这就让人很苦恼

这章学习更加全面的纹理,并解决这个苦恼

VS2022复制重命名新工程,且不影响原工程

1.先将文件Texture2复制一份

2.将Texture-副本,右击->重命名,改名为Texture1(自己决定)

3.打开texture1发现内部任然是Texture2

4.点开Texture2.sln

5.右击解决方案->重命名Texture1->关闭,就变成了这个样子

6.这里,把所有Texture2改成Texture1(我喜欢完全统一)

5.进入Texture1文件夹,找到这个文件,用记事本打开

6.打开方式选择记事本->打开后点击编辑->替换->将Texture2替换为Texture1->点击全部替换->叉掉框->保存再退出

7.再把这个文件的文件名改为Texture1,暂且只需要改这一个文件

8.再重新打开该项目->点击确定->点开解决方案资源管理器

9.右击Texture2,找到并点击移除,点击确定

10.右击解决方案->添加->现有项目(一定是没有现有项目,不是现有项)

添加的是这个解决方案文件

11.openGL使用的是x64,点击项目->属性->配置管理器->按照图示选择->关闭,确定->运行,完成后回到文件中依次打开

12.Debug中,删除含有Texture2的两个文件

留下这两个即可

13.打开Texture1文件

最后结果如下:

14.再打开Texture1文件中的Debug,将含有texture2的全部删除

结果如下

15.再重新打开Texture1.sln这个工程运行就没错误警告了,并且和Texture2没关系了,不信可以两个工程都打开

纹理其他样式

换汤不换药的换一个图片做另一个纹理我们就不讲了,我们讲一下两个图片做混合纹理和纹理的一部分参数

混合纹理

这里就不放所有的代码,你们可以参考官网代码理解起来是一样的

我们知道我们真正开始纹理的地方是

unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

这里开始的,这是我们定义了一个图片做纹理,两个图片呢是不是应该有区分,我们就用texture0和texture1区分两个图片分别对应的纹理吧

unsigned int texture0,texture1;
glGenTextures(1, &texture0);
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture0);
int width, height, nrChannels;
unsigned char* data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
if (data)
{
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
	glGenerateMipmap(GL_TEXTURE_2D);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
	float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
else
{
	std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

glBindTexture(GL_TEXTURE_2D, texture1);
data = stbi_load("sun.png", &width, &height, &nrChannels, 0);
if (data)
{
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
	glGenerateMipmap(GL_TEXTURE_2D);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
	float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
else
{
	std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

大部分代码是熟悉的,但是在判断数据的内部多了几行代码,这就是我们的部分参数,你可以选择暂且注释掉,没有大的影响后面再讲

这样就结束了吗,我们对于着色器不需要更改吗?当然要改

顶点着色器是不变的,依旧向其他着色器输入数据,但是片段着色器需要输出的却不再是一张图的,所有需要改变片段着色器的输出

#version 330 core
out vec4 FragColor;
in vec2 myTexture;
uniform sampler2D ourTexture0;
uniform sampler2D ourTexture1;
void main()
{
   FragColor = mix(texture(ourTexture0, myTexture),texture(ourTexture1, myTexture),0.4);
}

因为有两个纹理,所以这里也需要两个纹理对应起来,输出的是混合的,而0.4是对于后面哪张纹理图片的透明度,这样在片段着色器的两个纹理有对应吗,并没有绑定到着色器的纹理单元,并且uniform的值默认给0,无论如何对应,两个纹理单元的值都是0,那么我需要给纹理单元和着色器中的对应,并且给着色器的纹理单元值(这段代码在窗口渲染内部在循环里)

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture1);
ourshader.setInt("ourTexture0", 0);
ourshader.setInt("ourTexture1", 1);

最后运行就可以得到一个混合的纹理样式

效果

部分参数

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
	float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

这段代码主要的就是一个函数,而这个函数不过是改了不同的参数

在官网文档中有这么一段介绍

如果你想要看其他样式,我想你也会修改了

最后两个设置的放大和缩小是否具有颗粒感(我的话来说就是锯齿,是平滑的还是含有锯齿的)

看看官网的介绍

最后两行中设置可以是对于多级纹理来的,官网也有介绍

并且有个注意点:

这个多级渐远纹理是给缩小时使用的

如果你想尝试当然是可以的(建议自己尝试看看什么样子的都是,我是尝试过的哦),下一讲则要开始正式了解矩阵坐标,慢慢走向3D立体了

标签:2D,Texture1,OpenGL,TEXTURE,纹理,---,VS2022,GL,着色器
From: https://blog.csdn.net/weixin_54193640/article/details/144186791

相关文章

  • 来学习typescript 吧! --4 数组类型
    1.类型[]letarr1:number[]=[1,2,3]letarr2:string[]=['a','b','c']letarr3:(number|string)[]=[1,'a',2,'b'] 2.Array<类型>数组泛型letarr4:Array<number>=[1,2,3]letarr5:Array&l......
  • C语言项目实现--数字游戏
    数字游戏根据用户选择,完成以下功能解一元二次方程;判断指定年份是否是闰年;判断某一数字是否是水仙花数简单了解:一元二次方程:仅注意观察▲即可闰年:普通润年:能被4整除但不能被100整除的年份世纪润年:能被400整除的世纪年(即以00结尾的年份)eg.1900可以被4整除(475),但不......
  • Qt - Json数据解析
     json数据格式:{"name":"Alice","age":30,"isStudent":false,"courses":[{"courseName":"Mathematics","credits":3,"ins......
  • 01-什么是C语言
    一、什么是C语言C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。1、语言人和人交流的语言:汉语、英语、日语、等等。人和计算机交流语言(计......
  • C语言笔记--文件操作
    为什么使用文件使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。什么是文件磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),......
  • vxe-table 全键盘操作,按键编辑方式设置,覆盖方式与追加方式
    vxe-table全键盘操作,按键编辑方式设置,覆盖方式与追加方式;通过keyboard-config.editMode设置按键编辑方式;支持覆盖方式编辑和追加方式编辑按键编辑方式<template><div><vxe-radio-groupv-model="gridOptions.keyboardConfig.editMode"><vxe-radio-buttonla......
  • mysql在线DDL工具--pt-online-schema-change 详细介绍
    pt-online-schema-change详细介绍简介pt-online-schema-change-无锁表修改表结构工具,这里无锁表也不是绝对的,在交互原表与中间表表名的时候也会有元数据锁,只不过时间很短语法pt-online-schema-change[OPTIONS]DSN#给表actor.sakila添加一个列pt-online-schema-change......
  • 74.《真的有用!!!----free图片尺寸和大小的代码实现》
    想必你碰到这些情况:哈哈大部分我们都会去干嘛呢?作为计算机学者啊肯定会想到一些这些坑爹收费的垃圾东西我们自己搞搞其实这不就是我们经常写过的文件上传下载业务吗参考:https://www.cnblogs.com/gaodiyuanjin/p/18410900结合博客园博主与统义灵码结合图片插件依赖......
  • XCVU13P板卡设计原理图:509-基于XCVU13P的4路QSFP28光纤PCIeX16收发卡
     一、板卡概述     基于XCVU13P的4路QSFP28光纤PCIeX16收发卡。该板卡要求符合PCIe3.0标准,包含一片XCVU13P-2FLGA2014I、4组64-bit/8GBDDR4;4路QSFP284X光纤,每路光纤支持4X25Gbps,双向;支持32路IO。板卡工作温度范围0到60℃,板卡设计加工包含散热装置,支持服务器风冷散热......
  • 来学习typescript 吧! --3 对象、接口类型
     1、ObjectObject类型是所有Object类的实例的类型。由以下两个接口来定义:Object接口定义了Object.prototype原型对象上的属性ObjectConstructor接口定义了Object构造函数上的属性Object接口包含很多属性,如:constructor、hasOwnProperty、isPrototypeOf、propertyIsEn......