【问题标题】:How to properly Apply Post processing effects when you have multiple cameras?当您有多个相机时,如何正确应用后期处理效果?
【发布时间】:2015-03-24 18:58:13
【问题描述】:

您好,当您在一帧中有 3 个摄像机处于活动状态时,我在应用后期效果时遇到了很多麻烦。

第一台相机 - 渲染游戏的游戏部分。 第二个摄像头 - GUI 层。 第三台相机 - 背景和动画。

在这里,我尝试在第一台相机上应用模糊和绽放等后期处理效果,效果很好,但是当后期效果启用 GUI 时出现问题,背景动画不可见,但我确信它们已被绘制。 如果我将所有摄像机作为输入渲染目标,那么我可以看到该场景中的所有对象。

不知道为什么会发生这种情况,谁能解释一下可能是什么原因,谢谢。 在这里,我正在添加 Opengl 调用日志以查看我到底在做什么。

问题在于 Stats_layer 和 HudPage_layer 启用后期效果后不显示。

 Marker: SceneBegin: ClearCamera


glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
glClearColor(0, 0, 0, 1) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, {1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({2.7457316, 0, 0, 0} {0, 0, 1.0001999, 1} {0, 1.8304877, 0, 0} {0, 0, -0.20001999, 0}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 

Marker: RenderGroup: ClearCamera - Opaque

Marker: RenderGroup: ClearCamera - Immediate

Marker: RenderGroup: ClearCamera - Transparent

Marker: RenderGroup: ClearCamera - Overlay

Marker: PostProcess: PMaterial_GodRays_RadialBlur__2


glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glColor4f(0, 0, 0, 1) 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, {0, 0, 0, 1}) 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, {0, 0, 0, 1}) 
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, {0, 0, 0, 1}) 
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0) 
glActiveTexture(GL_TEXTURE0) 
glDisable(GL_TEXTURE_2D) 
glBindTexture(GL_TEXTURE_2D, 0) 
glMatrixMode(GL_TEXTURE) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glUniform2fv(0, 1, {0.5, 0.49836433}) 
glUniform1fv(1, 1, {0.050000001}) 
glActiveTexture(GL_TEXTURE1) 
glBindTexture(GL_TEXTURE_2D, 88) [Context 1 - Texture 88: Context 1 - Texture 88] 
glUniform1i(2, 1) 
glBindBuffer(GL_ARRAY_BUFFER, 163) 
glEnableClientState(GL_VERTEX_ARRAY) 
glVertexPointer(3, GL_FLOAT, 32, 0x00000000) 
glEnableClientState(GL_NORMAL_ARRAY) 
glNormalPointer(GL_FLOAT, 32, 0x0000000C) 
glClientActiveTexture(GL_TEXTURE0) 
glEnableClientState(GL_TEXTURE_COORD_ARRAY) 
glTexCoordPointer(2, GL_FLOAT, 32, 0x00000018) 
glEnableVertexAttribArray(0) 
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 32, 0x00000000) 
glEnableVertexAttribArray(1) 
glVertexAttribPointer(1, 2, GL_FLOAT, FALSE, 32, 0x00000018) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 164) 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0x00000000) 
glDisableClientState(GL_VERTEX_ARRAY) 
glDisableClientState(GL_NORMAL_ARRAY) 
glClientActiveTexture(GL_TEXTURE0) 
glDisableClientState(GL_TEXTURE_COORD_ARRAY) 
glDisableVertexAttribArray(0) 
glDisableVertexAttribArray(1) 

Marker: SceneBegin: ClearCamera

glBindFramebufferEXT(GL_FRAMEBUFFER, 3) 
glClearColor(0, 0, 0, 1) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, {1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({2.7457316, 0, 0, 0} {0, 0, 1.0001999, 1} {0, 1.8304877, 0, 0} {0, 0, -0.20001999, 0}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 


Marker: RenderGroup: ClearCamera - Opaque

Marker: RenderGroup: ClearCamera - Immediate

Marker: RenderGroup: ClearCamera - Transparent

Marker: RenderGroup: ClearCamera - Overlay

Marker: PostProcess: PMaterial_GodRays_RadialBlur__3


glBindFramebufferEXT(GL_FRAMEBUFFER, 3) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glColor4f(0, 0, 0, 1) 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, {0, 0, 0, 1}) 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, {0, 0, 0, 1}) 
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, {0, 0, 0, 1}) 
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0) 
glActiveTexture(GL_TEXTURE0) 
glDisable(GL_TEXTURE_2D) 
glBindTexture(GL_TEXTURE_2D, 0) 
glMatrixMode(GL_TEXTURE) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glUniform2fv(0, 1, {0.5, 0.49836433}) 
glUniform1fv(1, 1, {0.1}) 
glActiveTexture(GL_TEXTURE1) 
glBindTexture(GL_TEXTURE_2D, 87) [Context 1 - Texture 87: Context 1 - Texture 87] 
glUniform1i(2, 1) 
glBindBuffer(GL_ARRAY_BUFFER, 163) 
glEnableClientState(GL_VERTEX_ARRAY) 
glVertexPointer(3, GL_FLOAT, 32, 0x00000000) 
glEnableClientState(GL_NORMAL_ARRAY) 
glNormalPointer(GL_FLOAT, 32, 0x0000000C) 
glClientActiveTexture(GL_TEXTURE0) 
glEnableClientState(GL_TEXTURE_COORD_ARRAY) 
glTexCoordPointer(2, GL_FLOAT, 32, 0x00000018) 
glEnableVertexAttribArray(0) 
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 32, 0x00000000) 
glEnableVertexAttribArray(1) 
glVertexAttribPointer(1, 2, GL_FLOAT, FALSE, 32, 0x00000018) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 164) 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0x00000000) 
glDisableClientState(GL_VERTEX_ARRAY) 
glDisableClientState(GL_NORMAL_ARRAY) 
glClientActiveTexture(GL_TEXTURE0) 
glDisableClientState(GL_TEXTURE_COORD_ARRAY) 
glDisableVertexAttribArray(0) 
glDisableVertexAttribArray(1) 


Marker: SceneBegin: STATS_LAYER

wglMakeCurrent(0x8C0119F2, 0x00010000) 
glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
glViewport(0, 0, 640, 960) 
glScissor(0, 0, 640, 960) 
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, {1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({1, 0, 0, 0} {0, 0, 0.0066666668, 0} {0, 0.66666669, 0, 0} {0, 0, -0.33333334, 1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 


Marker: RenderGroup: STATS_LAYER - Opaque
Marker: RenderGroup: STATS_LAYER - Immediate
Marker: RenderGroup: STATS_LAYER - Transparent
Marker: RenderGroup: STATS_LAYER - Overlay
Marker: SceneBegin: HUDPAGE_LAYER

wglMakeCurrent(0x8C0119F2, 0x00010000) 
glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, {1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 
glMatrixMode(GL_PROJECTION) 
glLoadMatrixf({1, 0, 0, 0} {0, 0, 0.0066666668, 0} {0, 0.66666669, 0, 0} {0, 0, -0.33333334, 1}) 
glMatrixMode(GL_MODELVIEW) 
glLoadMatrixf({1, 0, 0, 0} {0, 1, 0, 0} {0, 0, 1, 0} {0, 0, 0, 1}) 


Marker: RenderGroup: HUDPAGE_LAYER - Opaque
Marker: RenderGroup: HUDPAGE_LAYER - Immediate
Marker: RenderGroup: HUDPAGE_LAYER - Transparent

【问题讨论】:

  • 你用的是什么游戏引擎?有相关代码吗?
  • @rpattiso 是的,它是一个专有引擎,但我实际上可以给你一些 opengl 日志
  • 这和 Lua 有什么关系?
  • @kamiccolo 包装器是用 lua 编写的,因此添加了一个标签。如果没有必要,请随时告诉我。

标签: c++ ios camera game-engine


【解决方案1】:

上述问题的问题在于我一次/在应用后期处理之前绘制对象的方式。

例如,如果我有 2 次通过:

  1. 不透明。
  2. 透明。

那么我应该在不透明通道中绘制不透明对象,在后面的通道中绘制透明对象。

但出于某种原因(我是菜鸟!)我在透明通道中绘制不透明对象。

我必须进行大量调试才能找到根本问题。 我想如果我们想做图形,在你开始添加效果和东西之前,我们已经把东西按正确的顺序排列了。

虽然吸取了教训(希望我可以通过制作一个示例项目来解释这种情况,从而尽快发布带有代码的答案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2015-05-16
    • 2013-11-11
    相关资源
    最近更新 更多