使用GLSL的透明着色器

时间:2017-11-19 16:09:28

标签: opengl-es shader opengl-es-2.0

我遇到片段着色器问题,如下图所示。

enter image description here

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

#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 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
            {

            }
        }


    }
}

1 个答案:

答案 0 :(得分:0)

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

不要在片段着色器中进行测试,这不是必需且非常昂贵,只需启用GL_CULL_FACE并正确设置正面。请注意,并非所有从互联网上下载的模型都能正确使用,因此您可能会有一个输入模型,其中包含一些三角形的断线。