GLSL Shader问题

时间:2015-07-22 18:58:29

标签: opengl glsl shader

我试图制作一个基本的Rim Lighting着色器,但我认为我做错了。

应该看起来像这样: Rim Light Correct

但是我得到了这个: Rim Light Wrong

这是我的代码:

顶点:

            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);
            }

1 个答案:

答案 0 :(得分:1)

  1. 如果我做得对,如果LinearLayout靠近q=dot(camera_direction,surface_normal)

    ,则应添加红色

    当你的例子有白色边框而不是整个表面调制红色时,不确定为什么不是白色

  2. 如果这是第二次渲染过程

    然后你的图像已被渲染,所以要么扔掉而不是边缘碎片,要么添加源图像纹理并在片段中组合或使用透明度并组合。

  3. 如果这不是多次渲染

    然后在哪里:0.0,...表面?我会尝试这样的片段:

    colors,textures,texcoords