使用 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
并正确设置正面。请注意,并非所有从互联网上下载的模型都能正确执行此操作,因此您的输入模型的某些三角形绕组可能已断开。
片段着色器出现问题,如下图所示。
我不想渲染图像中红色的部分 我必须通过顺时针和逆时针剔除 我得到法线与相机位置的点积 如果它小于 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
并正确设置正面。请注意,并非所有从互联网上下载的模型都能正确执行此操作,因此您的输入模型的某些三角形绕组可能已断开。