纹理

1|0纹理坐标

float texCoords[] = { 1.0f, 1.0f, //右上 1.0f, 0.0f, //右下 0.0f, 1.0f, //左上 0.0f, 0.0f //左下 };

2|0纹理环绕方式

把纹理坐标设置在(0,0)到(1,1)之外,会产生循环铺满

3|0纹理过滤

邻近过滤:选择离纹理坐标最近的像素(默认)
线性过滤:线性插值

4|0加载纹理

下载stb_image之后放到项目文件夹里,然后头文件

#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h"

加载图片:

int width, height, nrChannels; unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0); //path if (data) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture" << std::endl; }

5|0生成纹理

纹理也是ID引用的

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

然后在顶点上面加纹理坐标,加到最后之后

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2);

在顶点shader里面,加第三个layout

#version 330 core layout (location=0) in vec3 aPos; layout (location=1) in vec3 aColor; layout (location=2) in vec2 aTexCoord; out vec4 color; out vec2 TexCoord; void main() { gl_Position = vec4(aPos, 1.0f); color = vec4(aColor, 1.0f); TexCoord = aTexCoord; }

片段着色器加uniform采样器

#version 330 core in vec4 color; in vec2 TexCoord; out vec4 fragColor; uniform sampler2D ourtexture; void main() { fragColor = texture(ourtexture, TexCoord) * color; }

注意顶点坐标一定要仔细检查对应对,要不纹理会乱
一定要在加载图片之前glBindTexture与GL_TEXTURE_2D

6|0纹理单元

一个纹理的默认纹理单元是0,它是默认的激活纹理单元
随后需要active并把这个纹理加入texture_2D里

glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1);

然后说明哪个纹理对应哪个纹理单元:
ourShader.setInt("texture2", 1);
sampler传入的是一个int,也就是纹理单元几


__EOF__

本文作者Liujiahang
本文链接https://www.cnblogs.com/IamIron-Man/p/16613408.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   IamIron-Man  阅读(173)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示