【问题标题】:Render inverted scene to framebuffer将反转场景渲染到帧缓冲区
【发布时间】:2016-02-08 19:16:25
【问题描述】:

我需要一些帮助来将反转场景渲染到帧缓冲区。我想做一个镜面效果。 我有什么结果: 初始化帧缓冲区:

GLuint FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glReadBuffer(GL_NONE);

将场景绘制到帧缓冲区:

    mView = camera.getViewMatrix();
    mProjection = perspective(45.0f, 4.0f / 3.0f, 0.1f, 300.0f) * scale(mat4(1.0f), vec3(1.0f, -1.0f, 1.0f)); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName);
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glCullFace(GL_FRONT);
    glEnable(GL_CULL_FACE);
    mWorld = rotate(mWorld, -15.0f, vec3(1, 0, 0));
    mWorld = rotate(mWorld, -30.0f, vec3(0, 1, 0));
    cubemap.Draw(mView, mProjection, mWorld);
    glDisable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glUseProgram(program);
    mWorld = translate(mat4(1.0f), vec3(0, -10, 0));
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f))));
    cannon.Draw(program);

    mWorld = mat4(1.0f);
    mWorld = translate(mat4(1.0f), vec3(50, -10, 0));
    mWorld = rotate(mWorld, 90.0f, vec3(0, 1, 0));
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f))));
    cannon.Draw(program);

    mWorld = mat4(1.0f);
    mWorld = translate(mat4(1.0f), vec3(0, -10, 50));
    mWorld = rotate(mWorld, 140.0f, vec3(0, 1, 0));
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f))));
    cannon.Draw(program);

    glDisable(GL_DEPTH_TEST);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

我看到了一些使用 glScalef(1.0, -1.0, 1.0) 反转场景的教程。 glScalef 用于旧版本的 opengl。如何在新版本的 opengl 中反转场景? 为了这个效果,我在 scale(mat4(1.0f), vec3(1.0, -1.0, 1.0)) 上乘以投影矩阵。对吗?

【问题讨论】:

  • "如何在新版本的 opengl 中反转场景?"例如在着色器中

标签: c++ opengl glsl shader mirror


【解决方案1】:

这是用 GLSL 编写的顶点着色器。

void main(void)
{
   // Clean up inaccuracies
   vec2 Pos = sign(gl_Vertex.xy);

   gl_Position = vec4(Pos.xy, 0.0, 1.0);
   // Image-space
   gl_TexCoord[0].xy = vec2(-Pos.x, Pos.y) * 0.5 + 0.5; // x texture coord is inverted       
}

Pos 指的是用于帧缓冲区输出的屏幕对齐四边形。

片段着色器

uniform sampler2D framebufferSampler;

void main(void)
{
   gl_FragColor = texture2D(framebufferSampler, gl_TexCoord[0].xy);
}

可以绘制屏幕对齐的四边形

glBegin(GL_QUADS)
{
    glVertex2f(-1.0f, -1.0f);
    glVertex2f(1.0f, -1.0f);
    glVertex2f(1.0f, 1.0f);
    glVertex2f(-1.0f, 1.0f);
}
glEnd();

或使用顶点数组。

GLfloat vertices[] = {
    -1.0f, -1.0f,
    1.0f, -1.0f,
    1.0f, 1.0f,
    -1.0f, 1.0f
};

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(2, GL_FLOAT, 0, (void*)vertices);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);

用于包裹到四边形的纹理,是具有先前渲染内容的帧缓冲区信息(多通道着色器技术)。

您也可以使用其他 2D 纹理坐标或图像来代替帧缓冲区和屏幕对齐四边形。

原图。

倒置的图像。

更多信息可以在Learn OpenGL找到。

【讨论】:

  • 当您使用已弃用的 OpenGL 时,我会说这是一个非常糟糕的例子。因为甚至不清楚 OP 是否正在使用它。
  • @Vallentin:你的意思是“已弃用”。
  • 不推荐使用它不应该使用和不推荐使用它不再起作用。
  • @Vertigo:每个场景帧缓冲区都可以用作纹理,并且可以放置在任意表面上。
  • @Vertigo:您可以将相机放置在任意点。读取帧缓冲区内容并将其放置到纹理中。比将表面放置在要显示的位置。附加到它的纹理。比将相机放置在适当的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多