Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使在顶点着色器上只设置了三次,OpenGL如何在片段着色器上插值不同的变量?_Opengl_Glsl_Shader_Varying - Fatal编程技术网

即使在顶点着色器上只设置了三次,OpenGL如何在片段着色器上插值不同的变量?

即使在顶点着色器上只设置了三次,OpenGL如何在片段着色器上插值不同的变量?,opengl,glsl,shader,varying,Opengl,Glsl,Shader,Varying,由于顶点着色器在每个顶点上运行一次(即在三角形中运行3次),如果只指定了3次(如示例中所示),如何为每个片段计算可变变量 片段着色器: precision mediump float; varying vec4 v_Color; void main() { gl_FragColor = v_Color; } 顶点着色器: attribute vec4 a_Position; attribute vec4 a_Color; varying vec4 v_Color; void ma

由于顶点着色器在每个顶点上运行一次(即在三角形中运行3次),如果只指定了3次(如示例中所示),如何为每个片段计算可变变量

片段着色器:

precision mediump float;
varying vec4 v_Color;

void main() {
    gl_FragColor = v_Color;
}
顶点着色器:

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() {
    v_Color = a_Color;
    gl_Position = a_Position;
}

因此,问题是,这背后的系统如何知道,如何计算每个片段上的变量v_颜色,因为该着色器仅指定v_颜色3次(在三角形中)。

顶点着色器的所有输出都是逐顶点的。在顶点着色器中设置
v_Color
时,它会在当前顶点上设置它。当片段着色器运行时,它会读取基本体中每个顶点的
v_Color
值,并根据片段的位置在它们之间进行插值。

首先,假设每个顶点运行一次顶点着色器是错误的。使用索引渲染,基本体程序集通常可以基于顶点索引访问后期T&L缓存(以前顶点着色器调用的结果),以避免多次计算顶点。但是,新事物(如几何体着色器)很容易导致此问题


至于片段着色器如何获取其值,这通常在光栅化过程中完成。这些逐顶点属性将根据片段相对于用于构建基本体的顶点的距离沿基本体曲面(在本例中为三角形)插值。在DX11中,插值可以推迟到片段着色器本身运行(称为“拉动模型”插值),但传统上,这是在光栅化过程中发生的事情。

它在三个顶点之间插值,这意味着它是一个可变变量。您能告诉我,内部过程是如何进行的吗?它是如何测量距离的。(很抱歉我缺乏知识,但在互联网上找不到其他任何东西。)我对GLSL没有太多经验,我希望其他人能回答这个问题。但基本上,如果顶点彼此相距10个像素,那么顶点之间的每个像素将得到一个插值颜色,该颜色是另一种颜色的1/10,然后是2/10,3/10,等等。这相当于最近的
平滑中的
限定符;i、 e.顶点之间的透视校正线性插值。是。在顶点着色器中设置
v_Color
时,它会在顶点上设置它。当片段着色器运行时,它读取所有顶点的
v_Color
值,并根据片段的位置在它们之间进行插值。没有覆盖。如果实现缓存顶点着色器的输出,那么afaik会检测到第二次调用该顶点的顶点着色器不会产生任何不同的值,因此这一点是没有意义的。@ColonelThirtyTwo:后期t&L缓存的容量实际上是有限的,传统上是FIFO,这就是为什么以局部优化顺序(如条带顺序)提供顶点可以提高性能,即使您实际上没有将顶点用作条带(这主要节省了必须存储的索引数量)。几何体着色器引入了需要缓存的第二层数据,这会使情况变得更糟,但这主要影响GS的最大同时调用次数,并且引入细分时,GS后缓存的大小在很大程度上得到了解决。对,但这些不会影响最终渲染的图像。对于那些看起来刚刚开始学习OpenGL并且不太担心效率的人来说,这似乎是一个技术性的问题。@ColonelThirtyTwo:这显然是一个技术性的问题,与这个问题不太相关,这就是为什么我没有费心详细解释任何术语的原因。我只是有点动摇了一个事实,那就是这是一个错误的假设,并使用了适当的术语,以防有人想了解更多。要正确解释所有这些需要几页的内容;)