c++ - OpenGL-¿Cómo crear una orden de transparencia independiente?
graphics glsl (3)
Estoy usando algo similar a esa respuesta vinculada por el comentario de @RetoKoradi, pero obtuve modelos transparentes de doble capa con texturas (vidrio con superficie interna y externa) con maquinaria completamente sólida y cosas alrededor.
Para tales escenas, también estoy usando el enfoque de múltiples pasos y la clasificación Z se realiza mediante la secuencia de configuración de la cara frontal.
- renderizar todos los objetos sólidos
-
renderizar todos los objetos transparentes
Esta es la parte difícil que primero configuré
glGetIntegerv(GL_DEPTH_FUNC,&depth_funct); glDepthFunc(GL_ALWAYS); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_CULL_FACE);
Obtuve las capas de geometría almacenadas por separado (interior exterior), por lo que la clasificación Z se realiza así:
-
glFrontFace(GL_CW);
caras posteriores de la capa externa conglFrontFace(GL_CW);
-
glFrontFace(GL_CW);
caras posteriores de la capa interna conglFrontFace(GL_CW);
-
glFrontFace(GL_CCW);
caras frontales de la capa interna conglFrontFace(GL_CCW);
-
glFrontFace(GL_CCW);
caras frontales de la capa externa conglFrontFace(GL_CCW);
Y finalmente restaurar
glDisable(GL_BLEND); glDepthFunc(depth_funct);
-
-
renderizar todos los objetos sólidos nuevamente
Está lejos de ser perfecto, pero lo suficiente para mis propósitos se ve así:
He estado trabajando en un motor de juegos con fines educativos y me encontré con este problema que parece que no puedo encontrar una respuesta para:
El canal alfa solo funciona para objetos que ya han sido dibujados antes del objeto que tiene el canal alfa (por ejemplo: en una escena con 3 objetos, digamos un gato, un perro y una botella (transparente). Tanto el gato como el perro están detrás de la botella; el perro se saca primero, la botella segunda, el gato tercero. solo el perro se verá a través de la botella).
Aquí hay una imagen de este problema:
Usé C ++ para el motor, Win32 API para el editor y GLSL para sombrear:
// some code here
vec4 alpha = texture2D(diffuse, texCoord0).aaaa;
vec4 negalpha = alpha * vec4(-1,-1,-1,1) + vec4(1,1,1,0);
vec4 textureComponentAlpha = alpha*textureComponent+negalpha*vec4(1,1,1,0);//(texture2D ( diffuse, texCoord0 ) ).aaaa;
gl_FragColor = (textureComponentAlpha + vec4(additiveComponent.xyz, 0)) * vec4(lightingComponent.xyz, 1);
En C ++:
glEnable(GL_ALPHA_TEST);
glDepthFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Supongo que tiene algo que ver con la forma en que se realiza la prueba alfa, o algo así.
¿Alguien podría ayudarme a arreglar esto, por favor?
No estoy completamente seguro de que esto ayudará a su situación, pero ¿tiene habilitada la combinación y alfa? Como en :
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
No puedo animarlo lo suficiente como para echar un vistazo a este artículo de NVidia y la publicación de blog relacionada de Morgan McGuire.
Esto es bastante fácil de implementar y tiene excelentes resultados en general.