前言
对纹理的简单实现现在应该都理解了,不知道你们有没有考虑过一个问题,每一次都要重新创建一个工程,明明只是修改一部分代码,却要重新配置,能不能复制一个工程再重命名直接修改吗?
如果有考虑过这个问题的小伙伴就会发现,原文件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