如何在有多个摄像头时正确应用后期处理效果?

时间:2015-02-23 12:43:53

标签: c++ ios camera game-engine

嗨,当你在一帧中有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

1 个答案:

答案 0 :(得分:0)

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

  

例如,如果我有2次传球:

     
    
        
  1. 不透明。
  2.     
  3. 透明。
  4.        

然后我应该在不透明传递中绘制不透明对象,在后者中绘制透明对象。

但出于某种原因(Noob me!)我正在透明传递中绘制不透明物体。

我必须做很多调试才能找到root问题。 我想如果我们想要制作图形,我们会在开始添加效果和内容之前按顺序放置东西。

虽然学到了一些教训(希望我能通过制作示例项目来解释情况,尽快发布代码答案)。