glsl中如何获取当前片段的贴图颜色?

How to get the color of the texture of the current fragment in glsl?

问题

我正在尝试为我的游戏制作着色器。在片段着色器中,我不想设置片段的颜色而是添加到它。我该怎么做?我是新手,如有任何错误,请见谅。

代码

varying vec3 vN;
varying vec3 v; 
varying vec4 color;
#define MAX_LIGHTS 1 
void main (void) 
{ 
   vec3 N = normalize(vN);
   vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0);
   
   for (int i=0;i<MAX_LIGHTS;i++)
   {
      vec3 L = normalize(gl_LightSource[i].position.xyz - v); 
      vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0) 
      vec3 R = normalize(-reflect(L,N)); 
   
      vec4 Iamb = gl_LightSource[i].ambient; 
      vec4 Idiff = gl_LightSource[i].diffuse * max(dot(N,L), 0.0);
      Idiff = clamp(Idiff, 0.0, 1.0); 
      vec4 Ispec = gl_LightSource[i].specular * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess);
      Ispec = clamp(Ispec, 0.0, 1.0); 
   
      finalColor += Iamb + Idiff + Ispec;
   }
    gl_FragColor = color * finalColor ; 
}

提前致谢!

您无法获取正在写入的片段的颜色。在简单的场景中(比如你的场景),你可以做的是启用混合并设置 blending functions 以实现加法混合。

对于更复杂的逻辑,您可以创建一个帧缓冲区对象,为其附加一个纹理,将您的输入(例如场景)渲染到该纹理,然后切换到另一个帧缓冲区(或默认的“屏幕”缓冲区)并进行渲染),这样您就可以从纹理中对场景进行采样并在顶部添加照明。 Read how to do this in detail on WebGLFundamentals.com