3D непрозрачные полигоны с OpenGL и взвешенным OIT
У меня проблемы с получением непрозрачных полигонов, чтобы они не были прозрачными. Я использую формулу с этого сайта:
Взвешенный заказ Независимая прозрачность
Вот мой код:
int programShader = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self changeFrustumX:0 y:0 w:512 h:512];
// Opaque stuff goes here?
// Make everything transparent
glEnable(GL_BLEND);
for (int i = 0; i < 2; i++)
{
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID[i]);
if (i == 0)
{
// The transparency colors
glClearColor(0.0, 0.0, 0.0, 1.0);
glBlendFunc(GL_ONE, GL_ONE);
glClear(GL_COLOR_BUFFER_BIT);
programShader = colorPassShader;
}
else if (i == 1)
{
// The transparency mask
glClearColor(1.0, 1.0, 1.0, 1.0);
glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT);
programShader = maskPassShader;
}
glUseProgram(programShader);
// Yellow is supposed to be opaque
[self setProgram:programShader
modelView:modelViewArray2
projection:frustumArray
vertices:yellowVertices
colors:yellowColors
textures:NULL];
// Blue not opaque
[self setProgram:programShader
modelView:modelViewArray2
projection:frustumArray
vertices:blueVertices
colors:blueColors
textures:NULL];
// Red not opaque
[self setProgram:programShader
modelView:modelViewArray2
projection:frustumArray
vertices:redVertices
colors:redColors
textures:NULL];
}
// get back to the default framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Transparent objects rendering
glClearColor(0.75, 0.75, 0.75, 1.0);
// Original blend
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT);
[self changeOrthoX:0 y:0 w:512 h:512];
glUseProgram(combineShader);
glActiveTexture(GL_TEXTURE1);
// Display the color from the framebuffer
glBindTexture(GL_TEXTURE_2D, renderTextureID[0]);
// Colors
glUniform1i(glGetUniformLocation(combineShader, "sAccumulation"), 1);
glActiveTexture(GL_TEXTURE2);
// Display the color from the framebuffer
glBindTexture(GL_TEXTURE_2D, renderTextureID[1]);
// Mask
glUniform1i(glGetUniformLocation(combineShader, "sReveal"), 2);
[self setProgram:combineShader
modelView:modelViewArray3
projection:orthogonalArray
vertices:combineVertices
colors:NULL
textures:combineTextures];
// Opaque objects rendering
glDisable(GL_BLEND);
Я не смог заставить работать несколько glFragData[n], и, насколько я понимаю, OpenGL ES не поддерживает больше одного. Желтый многоугольник должен быть полностью непрозрачным, но на фотографиях это не так. Как мне сделать его непрозрачным, а все остальное прозрачным? Также, как мне создать полупрозрачные полупрозрачные полигоны?
Вот картинка, которую я сгенерировал: