片段着色器究竟如何用于纹理?

How exactly does fragment shader work for texturing?

本文关键字:用于 纹理 何用于 究竟 片段      更新时间:2023-10-16

我正在学习opengl,我认为我几乎了解片段着色器。我的直觉是片段着色器只应用于每个像素一次,但最近在处理纹理时,我对它们的工作原理感到困惑。

首先,片段着色器通常采用一系列纹理坐标,因此如果我有一个四边形,片段着色器将采用四边形 4 个角的纹理坐标。现在我不明白的是采样过程,即获取纹理坐标并在该纹理坐标处获得适当颜色值的过程。具体来说,由于我只提供 4 个纹理坐标,opengl 如何知道对颜色值之间的坐标进行采样。

当您考虑到顶点着色器直接进入片段着色器并且顶点着色器按顶点应用时,此任务变得更加混乱。这意味着在任何给定时间,片段着色器只知道对应于单个顶点的纹理坐标,而不是组成四边形的整个 4 个坐标。因此,当它一次只有一个纹理坐标可用时,它如何确切地知道对适合屏幕上形状的值进行采样?

所有varying变量都是自动插值的。

因此,如果您将每个顶点的纹理坐标放入varying中,之后您无需对它们执行任何特殊操作。

它可以像这样简单:

// Vertex
#version 330 compatibility
attribute vec2 a_texcoord;
varying vec2 v_texcoord;
void main()
{
v_texcoord = a_texcoord;
}
// Fragment
uniform vec2 u_texture;
varying vec2 v_texcoord;
void main()
{
gl_FragColor = texture2D(u_texture, v_texcoord);
}

免责声明:我使用了旧的 GLSL 语法。在较新的 GLSL 版本中,attribute将替换为invarying将替换为顶点着色器中的out和片段着色器中的ingl_FragColor将替换为自定义out vec4变量。texture2D()将替换为texture()

请注意,此片段着色器不执行任何手动插值。它只接收一个vec2 v_texcoord,从包含原始1电流片段所属的顶点v_texcoords进行插值。

1.基元是指点、线、三角形或四边形。

first:在核心上下文中,您仍然可以使用gl_FragColor。

第二:你有纹素,碎片和real_monitor_pixel。这些是不同的 事情。 假设这一行是关于将纹素转换为片段(或完全转换为像素IDK)的:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

当纹素小于片段(像素)时