与FBO Ping Pong的OpenGL随机透明度

时间:2016-08-12 12:10:55

标签: c++ opengl glsl transparency

我的任务是在OpenGL中实现随机透明度。我可以使用功能齐全的环境,它显示网格和纹理。不幸的是,我对OpenGL完全不熟悉,我还不了解一些原则,比如什么时候才能将图像渲染成FBO。

无论如何,这是我的片段着色器中的代码,它应该丢弃可能为50%的片段:

uniform sampler2D myTexture;
uniform int time;

in vec4 color_varying;
in float light_varying;
in vec2 texcoord_varying;
out vec4 fragColor;`

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void main() {
    if (rand(vec2(texcoord_varying.x + time, texcoord_varying.y - time)) < 0.5) {
        discard;
    }
    (...)
}

接下来,我想将输出渲染到FBO1中,然后将其用作FBO2中的纹理。这可以通过FBO乒乓技术多次完成。在Stochastic Transparancy Source中显示,这最终会产生良好的透明效果。多数民众赞成我试图实现它:

glUseProgram(program_ID);
//Passing variables and stuff
//(...)

glBindVertexArray(VAO);
for (int i = 1; i <= 64; i++) {
    glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
    glActiveTexture(GL_TEXTURE0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUniform1i(time_ID, i);
    if (i > 1) {
        glBindTexture(GL_TEXTURE_2D, colorTexture2);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else glBindTexture(GL_TEXTURE_2D, texture_ID);
    glDrawArrays(GL_TRIANGLES, 0, vertexCount);

    glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
    glActiveTexture(GL_TEXTURE0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, colorTexture1);
    glGenerateMipmap(GL_TEXTURE_2D);
    glDrawArrays(GL_TRIANGLES, 0, vertexCount);
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearColor(1,1,1,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glDrawArrays(GL_TRIANGLES, 0, vertexCount);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
glUseProgram(0);

最后是如何初始化FBO和纹理:

glGenTextures(1, &colorTexture1);
glBindTexture(GL_TEXTURE_2D, colorTexture1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, viewWidth, viewHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glGenFramebuffers(1, &fbo1);
glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, colorTexture1, 0);

输出是一个Image,其中每隔一个像素丢失。如果我排除for循环,我仍然得到相同的结果,但所有像素都是黑色的。我不确定这是否属于逻辑或技术错误,但我希望有人可以在这里帮助我。不胜感激!

0 个答案:

没有答案