gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:53 26 4
gpt4 key购买 nike

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

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

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

最佳答案

所有变化的变量都会自动插入。

因此,如果您将每个顶点的纹理坐标放入一个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。 基元表示点、线、三角形或四边形。

关于c++ - 片段着色器究竟如何用于纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45112997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com