Opengl es 使用GLSL的透明着色器

Opengl es 使用GLSL的透明着色器,opengl-es,shader,opengl-es-2.0,Opengl Es,Shader,Opengl Es 2.0,我有一个碎片着色器的问题,你可以在下图中看到 我不想渲染图像中的红色部分 我必须通过顺时针和逆时针选择的通道 我得到了法线和相机位置的点积 如果小于0,则设置一个透明片段 否则丢弃碎片 这是着色器 #version 100 precision mediump float; varying float lightDiffuse; void main() { float light = ( 1.0 - lightDiffuse) * 0.5; vec3 lightColor

我有一个碎片着色器的问题,你可以在下图中看到

我不想渲染图像中的红色部分 我必须通过顺时针和逆时针选择的通道 我得到了法线和相机位置的点积 如果小于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;
}
这是材料脚本

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\u CULL\u FACE
并正确设置正面即可。请注意,并非所有从internet下载的模型都正确,因此您可能有一个输入模型,其中一些三角形的绕组断裂。

。。。有什么问题吗?“你说你在做什么,但你没有说你有什么问题。”尼古拉斯在照片中,我看到两张脸重叠。。我想放弃那种效果。。我只是想看看我的眼睛看什么,而不是看到两个面在图像中重叠。您描述的算法仅在顶点的法线为平面法线时有效。如果有平滑网格,则顶点法线不一定与面法线相同。另外,如果一个顶点在多个面上使用,您也会遇到问题。@BDL那么这个问题的解决方案是什么?感谢您的输入,例如,您可以使用几何体着色器并计算真实面法线。或者,由于您只是在模拟背面消隐,请启用真正的背面消隐。
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
            {

            }
        }


    }
}