为什么基本的镜面反射着色是流体,而不是锯齿状的?

Why is basic specular shading fluid, and not jagged?

简单的问题,我刚刚让我的第一个镜面反射着色器开始工作,并且查看了数学,我忍不住认为每条边之间的角度应该导致 "specularity" 到 spike/become 参差不齐。但它完全 fluid/spherical.

想法是计算顶点法线的角度,但只有这么多,而且 "specular shade" 结果仍然完全均匀。

我看不出 gpu 如何仅根据顶点法线知道片段的角度。

编辑: 垂直着色器

#version 400 core

layout ( location = 0 ) in vec3 vertex_position;
layout ( location = 2 ) in vec2 tex_cord;
layout ( location = 3 ) in vec3 vertex_normal;

uniform mat4 transform; //identity matrix
uniform mat3 lmodelmat; //inverse rotation

out vec2 UV;
out vec3 normal;

void main()
{
  UV=tex_cord;
  normal=normalize(vertex_normal*lmodelmat);  //normalize to keep brightness

  gl_Position=transform*vec4(vertex_position,1.0);
}

和碎片

#version 400 core

in vec2 UV;
in vec3 normal;

uniform sampler2D mysampler;
uniform vec3 lightpos; //lights direction

out vec4 frag_colour;

in vec3 vert2cam; //specular test

void main()
{
  //skip invis frags
  vec4 alphatest=texture(mysampler,UV);
  if(alphatest.a<0.00001)discard; 

  //diffuse'ing fragment
  float diffuse=max(0.1,dot(normal,lightpos));

  //specular'izing fragment
  vec3 lpnorm=normalize(lightpos);  //vector from fragment to light
  vec3 reflection=normalize(reflect(-lpnorm,normal)); //reflection vector
  float specularity=max(0,dot(lpnorm,reflection));
  specularity=pow(specularity,50);

  frag_colour=alphatest*diffuse+specularity;
}

答案:插值

对于渲染器,这将等同于平均曲线,而不是锯齿状边缘(平坦阴影)

无代码.etc.很难准确回答你的问题,但假设一个简单的矢量着色器 - >片段着色器管道。矢量着色器将为每个顶点 运行。它通常会设置标记为 'varying' 的设置参数(例如纹理坐标)。

每 3 个顶点将被分组以形成多边形,片段着色器 运行 确定多边形内每个点的颜色。顶点着色器设置的 'varying' 参数将根据片段与多边形 3 条边的距离进行插值(参见:重心插值)。

例如:

gl_FragColor = texture2D(myUniformSampler, vec2(myTextureCoord.s,myTextureCoord.t));

将为每个像素正确采样纹理。假设您使用的是逐片段光照,则可能会根据您在顶点着色器中设置的值为每个片段着色器插值这些值。如果你为每条边设置相同的法线,你会得到不同的效果。

编辑(基于您添加的代码):

out vec2 UV;
out vec3 normal;
out vec3 color;

在顶点着色器中按顶点设置。每三个顶点定义一个多边形。然后片段着色器为多边形内的每个点(例如像素)运行 以确定颜色等。每个点。

这些参数的值:

in vec3 color; /// <<-- You don't seem to be actually using this
in vec2 UV;
in vec3 normal;

在片段着色器中根据多边形上的点与每个顶点 'drawn' 的距离进行插值(参见:重心插值)。因此,法线在顶点着色器定义的顶点之间变化。

如果对于由三个顶点定义的给定多边形,您将法线设置为全部面向同一方向,您将获得不同的效果。