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
问题
我正在尝试为我的游戏制作着色器。在片段着色器中,我不想设置片段的颜色而是添加到它。我该怎么做?我是新手,如有任何错误,请见谅。
代码
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