顶点着色器如何工作?

How vertex shader works?

我是初学者,我尝试通过画正方形来画圆。但是失败了!这是我的顶点着色器:

#define RADIUS 0.5
#define WHITE vec4(1.0,1.0,1.0,1.0)
#define RED vec4(1.0,0.0,0.0,1.0)
attribute vec2 a_position;
varying vec4 v_color; //defines color in fragment shader
....
void main(){
    gl_Position = a_position;
    v_color = (a_position[0]*a_position[0]+a_position[1]*position[1]<RADIUS*RADIUS) ? RED : WHITE;
}

它没有按我的意愿工作。为什么?

简而言之:不是这样的!

顾名思义,vertex 着色器中的代码对每个 vertex 执行一次。因此,如果您绘制一个正方形,则顶点着色器仅针对您为绘制调用指定的 4 个顶点执行。

您在着色器代码中的表达式需要针对每个 片段 执行(至少对于本次讨论,您可以假设片段与像素相同)。您想要评估每个像素是在圆内还是在圆外。因此,逻辑需要在片段着色器中。

要使其正常工作,最简单的方法是将原始位置传递给片段着色器。片段着色器中可用的位置有一个内置变量(gl_FragCoord),但它以像素为单位,这使您的计算更加复杂。

所以你的顶点着色器看起来像这样:

attribute vec2 a_position;
varying vec2 v_origPosition;
...
void main() {
    gl_Position = a_position;
    v_origPosition = a_position;
}

您在顶点着色器中拥有的大部分内容随后进入片段着色器:

...
varying vec2 v_origPosition;
...
void main() {
    gl_FragColor = (dot(v_origPosition, v_origPosition) < RADIUS * RADIUS) ? ...