当前位置: 首页 > 知识库问答 >
问题:

片段着色器是如何进行纹理处理的?

鲁德佑
2023-03-14

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

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

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

共有2个答案

林礼骞
2023-03-14

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

第二:你有texel、fragment和real_monitor_pixel。这些是不同的事情。假设这一行是关于将texel转换为fragment(或者转换为pixel idk)的:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

当文本小于片段(像素)时

席宜修
2023-03-14

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

因此,如果你把每个顶点的纹理坐标放入一个变化的,你不需要在那之后对它们做任何特殊的处理。

它可以像这样简单:

// 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版本中,属性将在中替换为变化的将在顶点着色器中替换为out,在片段着色器中替换为ingl_FragColor将被替换为自定义out vec4变量。文本2D()将被替换为纹理()

请注意,此片段着色器不执行任何手动插值。它只接收一个vec2 v_-texcoord,它是从当前片段所属的v_-texcoords个顶点插入的。

1。基本体指点、线、三角形或四边形

 类似资料:
  • 我正在写一个带有纹理的webgl程序。 只要图像没有加载,纹理2D-函数就会返回一个vec4(0.0, 0.0, 0.0, 1.0)。所以所有对象都是黑色的。 所以我想检查一下,我的取样器2D是否可用。 我已经尝试过: 但这当然没有意义,因为纹理可能是黑色的。 有人能帮我吗?我如何检查,我的纹理图像是否已经加载到片段着色器中?

  • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方

  • 我的目标是使用c和OpenGL进行简单的沙子模拟。现在我的计划是拥有一个2d像素颜色数组和一个相同大小的纹理。为了模拟沙子,我将根据沙子坐标和它必须移动的位置来更新数组。我正在考虑将2d像素阵列发送到片段着色器,并使用阵列上的颜色更新那里的纹理。问题是我找不到改变纹理上像素颜色的方法。 那么我如何改变纹理上特定坐标处像素的颜色呢?这样做真的可行吗?如果没有,还有什么办法?

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 我希望能够在GLSL片段着色器中组合两种纹理。我目前正在使用PyOpenGL,到目前为止我使用着色器所做的一切都很好。 当我尝试从片段着色器访问多个纹理时遇到困难,例如,以下着色器显示正确的纹理减去蓝色像素: 但是 导致空白屏幕。 我有一种感觉,问题可能在于我如何将纹理制服传递给着色器,但我一辈子都无法弄清楚为什么第一个纹理有效,而第二个纹理无效。下面是完整的程序。

  • 如何在平面上滚动纹理?所以我有一个平面有一个纹理,我可以使用一个着色器滚动左从右(无限)的纹理上?