OpenGL (二): 纹理绘制

本文详细介绍了OpenGL中的Texture纹理绘制,包括纹理坐标映射、Shader中的实现、纹理混合以及纹理过滤。通过代码示例解析了如何将图片信息加载到Shader、如何处理纹理超出图形范围的情况以及如何优化图像显示效果。
摘要由CSDN通过智能技术生成

前言

我个人不喜欢"纹理"这个翻译, 所以之后使用 Texture 来替代.
一个几何图案的 Texture 即为与它相绑定的图片, 从上一篇博客可以知道, Fragment Shader 负责计算一个图形的颜色, 而一个图片实际上就是一个颜色复杂的方形, 所以 OpenGL 中 Texture 是由 Fragment Shader 来完成的. 具体的流程是:

  1. 将图片信息加载到 Shader 中
  2. Vertex Shader 将 Texture 图片与几何图形的各个顶点相映射, 并将坐标传递给 Fragment Shader
  3. Fragment Shader 根据该坐标从图片中取样, 从而得到图片对应位置的像素值 (即颜色)

部分代码

如果读过上一篇博客应该能够对 OpenGL 的使用进行自己的简单封装, 所以从本篇博客开始, 只贴部分代码.
.vs 后缀表示这是一个 Vertex Shader
.fs 后缀表示这是一个 Fragment Shader

texture.vs

#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoord;

out vec2 _texCoord;

void main() {
   
    _texCoord = texCoord;
    gl_Position = vec4(position, 1.0);
}

其中 texCoord 表示该顶点对应的 Texture 坐标.
Texture 坐标定义为: 左下角为 ( 0, 0 ), 右上角为 ( 1, 1 )

texture.fs

#version 330 core

out vec4 outColor;

in vec2 _texCoord;
uniform sampler2D tex;

void main() {
   
    outColor = texture(tex, _texCoord);
}

其中 tex 变量表示的是该 Texture 的图片数据, texture(tex, _texCoord) 表示取该图片的该坐标的像素值.

main.cpp ( 部分 )

    float vertices[20] = {
   
       -0.5f, -0.5f, 0.f, 0.f, 0.f,
       -0.5f, 0.5f,  0.f, 0.f, 1.f,
        0.5f, 
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值