我的任务是在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循环,我仍然得到相同的结果,但所有像素都是黑色的。我不确定这是否属于逻辑或技术错误,但我希望有人可以在这里帮助我。不胜感激!