OpenGL片段着色器如何知道在纹理中采样哪个像素?

5

所以我有一个三角形:

而且我有一个顶点着色器:

uniform mat4 uViewProjection;
attribute vec3 aVertexPosition;
attribute vec2 aTextureCoords;
varying vec2 vTextureCoords;

void main(void) {
  vTextureCoords = aTextureCoords;
  gl_Position = uViewProjection * vec4(aVertexPosition, 1.0);
}

而且我有一个片段着色器:

precision mediump float;
uniform sampler2D uMyTexture;
varying vec2 vTextureCoords;

void main(void) {
  gl_FragColor = texture2D(uMyTexture, vTextureCoords);
}

我输入了三组交替的顶点和UV坐标:

# x,  y,    z,   s,   t
0.0,  1.0,  0.0, 0.5, 1.0
-1.0, -1.0, 0.0, 0.0, 0.0 
1.0, -1.0,  0.0, 1.0, 0.0

片元着色器如何知道要对像素A和像素B进行不同的绘制?有哪些变化?


你输入了一个纹理,对吧?你为什么期望它们是相同的呢?或者你是在问着色器在GPU上是如何工作的? - Jesus Ramos
@JesusRamos 我在问着色器是如何工作的,我不理解在着色器传递之间发生了什么变化以及是谁进行了变化。 - a paid nerd
看看@genpfault的回答。我本来也想这么说,但他比我先了 :) - Jesus Ramos
1
请查看这个不错的答案:https://dev59.com/v23Xa4cB1Zd3GeqPaAMY,在OpenGL可能会采样出你意料之外的值。 - Kimi
1个回答

7
我理解GL管线的光栅化阶段插值vTextureCoords跨越三角形面,对每个像素使用插值后的值运行片段着色器。

那么 vTextureCoords 会改变吗?所有的 varying 变量都会以某种方式被改变吗? - a paid nerd
是的,在片段着色器中所有的“varying”变量都会被插值后加载。 - genpfault
3
这个答案的进一步解释和动画演示可以在这里找到:http://greggman.github.com/webgl-fundamentals/webgl/lessons/webgl-how-it-works.html - a paid nerd
更新我的链接:http://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html - a paid nerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接