c++ opengl graphics glsl

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.

  1. renderizar todos los objetos sólidos
  2. 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 con glFrontFace(GL_CW);
    • glFrontFace(GL_CW); caras posteriores de la capa interna con glFrontFace(GL_CW);
    • glFrontFace(GL_CCW); caras frontales de la capa interna con glFrontFace(GL_CCW);
    • glFrontFace(GL_CCW); caras frontales de la capa externa con glFrontFace(GL_CCW);

    Y finalmente restaurar

    glDisable(GL_BLEND); glDepthFunc(depth_funct);

  3. 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);