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

时间:2017-07-14 23:45:23

标签: c++ opengl

我正在学习opengl,我认为我非常了解片段着色器。我的直觉是片段着色器被应用到每个像素一次,但最近在处理纹理时,我对它们的确切工作方式感到困惑。

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

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

2 个答案:

答案 0 :(得分:0)

自动插入所有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,它是在v_texcoord个顶点内插的,包含一个原始 1 当前片段所属的顶点。

1。 原语表示点,线,三角形或四边形。

答案 1 :(得分:0)

首先:在核心环境中你仍然可以使用gl_FragColor。

第二:你有texel,fragment和real_monitor_pixel。这些是不同的 的东西。 说这一行是关于将纹素转换为片段(或像素idk一样):

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

当texel小于片段(像素)时