我试图制作一个基本的Rim Lighting着色器,但我认为我做错了。
这是我的代码:
顶点:
attribute vec3 AE_POSITION;
attribute vec2 AE_TEXCOORD;
attribute vec3 AE_NORMAL;
attribute vec3 AE_TANGENT;
uniform mat4 AE_MVP;
uniform mat4 AE_Model;
varying vec3 AE_WorldPosition;
varying vec3 AE_WorldNormal;
void main() {
AE_WorldPosition = (AE_Model * vec4(AE_POSITION, 1.0)).xyz;
AE_WorldNormal = normalize((AE_Model * vec4(AE_NORMAL, 1.0)).xyz);
gl_Position = AE_MVP * AE_Model * vec4(AE_POSITION, 1.0);
}
片段:
varying vec3 AE_WorldPosition;
varying vec3 AE_WorldNormal;
uniform vec3 AE_EyePos;
void main() {
vec3 v = normalize(AE_EyePos - AE_WorldPosition);
float rim = 1.0 - max(dot(v, AE_WorldNormal), 0.0);
rim = smoothstep(0.6, 1.0, rim);
vec3 finalRim = vec3(1.0, 0.0, 0.0) * vec3(rim);
gl_FragColor = vec4(finalRim, 1.0);
}
答案 0 :(得分:1)
如果我做得对,如果LinearLayout
靠近q=dot(camera_direction,surface_normal)
当你的例子有白色边框而不是整个表面调制红色时,不确定为什么不是白色
如果这是第二次渲染过程
然后你的图像已被渲染,所以要么扔掉而不是边缘碎片,要么添加源图像纹理并在片段中组合或使用透明度并组合。
如果这不是多次渲染
然后在哪里:0.0
,...表面?我会尝试这样的片段:
colors,textures,texcoords