使用 GLSL 的透明着色器

艾哈迈德其他人

我在使用片段着色器时遇到了问题,如下图所示。

在此处输入图片说明

我不想渲染图像中红色的部分我必须通过顺时针和逆时针剔除,如果它小于 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
            {

            }
        }


    }
}
实体像素

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章