使用 GLSL 的透明着色器

Transparent Shader using GLSL

片段着色器出现问题,如下图所示。

我不想渲染图像中红色的部分 我必须通过顺时针和逆时针剔除 我得到法线与相机位置的点积 如果它小于 0 我设置一个透明片段 否则丢弃 farging 这是着色器

#version 100

precision mediump float;

varying float  lightDiffuse;

void main()
{
    float light = ( 1.0 - lightDiffuse) * 0.5;
    vec3 lightColor = vec3(0.0,1.0,1.0);
    vec3 diffuseColor = lightColor * light ;

    vec4 c;
    if(lightDiffuse <0.0 )
    {
        // back faces, opaque
        // front faces, very transparent
        c  = vec4(diffuseColor, 0.2);
    }
    else
    {
        discard;
    }

    gl_FragColor = c;
}

#version 100
#define lowp
#define mediump
#define highp

attribute vec4 vertex;
attribute vec3 normal;

uniform mat4 normalMatrix;
uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelView;
uniform vec3 camera_world_position;

varying highp float lightDiffuse;

void main()
{      
    gl_Position = modelViewProjectionMatrix * vertex;

    vec3 norm = normal;
    norm *=-1.0;
    lightDiffuse = dot(normalize(vec3(norm.x, norm.y, norm.z)), normalize(camera_world_position));
}

这里是 material 脚本

material 44267_1508405690_0##carpaint
{
    technique
    {
        pass
        {

            cull_hardware anticlockwise
            scene_blend alpha_blend
            vertex_program_ref char_shader2_vs100 
            {
                param_named_auto modelViewProjectionMatrix worldviewproj_matrix
                param_named_auto normalMatrix inverse_transpose_world_matrix
                param_named_auto modelView worldview_matrix
                param_named_auto camera_world_position camera_position

            }
            fragment_program_ref char_shader2_fs100
            {

            }
        }


   pass
        {

            cull_hardware clockwise

            vertex_program_ref char_shader2_vs100 
            {
                param_named_auto modelViewProjectionMatrix worldviewproj_matrix
                param_named_auto normalMatrix inverse_transpose_world_matrix
                param_named_auto modelView worldview_matrix
                param_named_auto camera_world_position camera_position

            }
            fragment_program_ref char_shader2_fs100
            {

            }
        }


    }
}

如果你想剔除被遮挡的三角形,分配一个深度缓冲区并使用深度测试,这就是它的存在。

不要在片段着色器中进行正面测试,这不是必需的而且非常昂贵,只需启用 GL_CULL_FACE 并正确设置正面。请注意,并非所有从互联网上下载的模型都能正确执行此操作,因此您的输入模型的某些三角形绕组可能已断开。