Articles of 帧缓冲

Starcraft2中的成就系统

我正在玩星际争霸2,我对它是如何devise的着迷。 所以可以说你打了一场1v1排名的比赛,你在头320秒内抽了10名海军陆战队员。 你会得到一个成就。 我想知道下面的成果系统是如何devise的? 是的,它分析基于帧的重放文件,但是如何? 现在有1000个成就。

多个渲染目标,多个片段着色器

我渲染一个场景的正常和深度图像。 然后我想重用这两个图像在第二个片段着色器中进行进一步的纹理/image processing。 我使用了附有3个纹理的帧缓冲器。 2为正常和深度纹理和一个应该包含最终处理的图像。 问题是,我不能得到前两个图像到第二个片段着色器使用它们作为纹理采样器。 这里是我的代码:首先我创建一个fbo并附加3个纹理。 // create FBO glGenFramebuffers(1, &Framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, Framebuffer); glGenTextures(1, &renderedNormalTexture); //glBindTexture, glTexImage2D, glTexParameteri … left out for clarity glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedNormalTexture, 0); glGenTextures(1, &renderedDepthTexture); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, renderedDepthTexture, 0); glGenTextures(1, &edgeTexture); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, edgeTexture, 0); ndbuffers[0] = GL_COLOR_ATTACHMENT0; ndbuffers[1] = GL_COLOR_ATTACHMENT1; ndbuffers[2] = GL_COLOR_ATTACHMENT2; glDrawBuffers(3, ndbuffers); 片段着色器1:这是第一个输出2个纹理到位置0和1的片段着色器 […]

OpenGL / SDL2如何用窗口调整渲染区域的大小?

调用SDL_SetWindowSize ,渲染的区域不会随着窗口而改变,所以如果窗口变大,则会在顶部和右侧留下黑色区域。 我正在调整OpenGL视口到新的窗口尺寸。 我正在绘制的所有东西都可以正确缩放,但当窗口变大时会被切断。 我一直在寻找解决scheme整天,我发现所有创建一个新的OpenGL上下文,但这会导致崩溃,除非我重新加载所有我的graphics数据,这似乎只是为了调整窗口大小。 它是默认的帧缓冲区,需要resize? 根据OpenGL wiki , 所有默认的帧caching图像会自动resize,以适应输出窗口的大小。 所以如果默认的framebuffer被resize,为什么只渲染到相同的小区域? 我可以初始化它到尽可能大的分辨率,然后缩小它,但不会导致OpenGL处理​​窗口外的一堆碎片?

在Unity中获取相机的帧caching

有没有办法“logging”摄像头的显示而不是在屏幕上显示? 例如,如果我想将摄像机的帧块stream到外部应用程序。

在给定位置渲染立方体纹理上的2D纹理

我想模仿天空中的移动太阳。 到目前为止,我所能做的就是计算太阳的确切位置,即从照相机在世界上的位置到太阳的3D方向vector。 天空是6面与一些立方体贴图纹理纹理的立方体。 天空盒的位置不断被设置在相机的位置,所以相机总是在立方体的中心。 现在,我有一个简单的太阳2D纹理,我想使用上述的方向vector渲染到立方体贴图纹理上。 你能介绍一下我怎么能做到这一点? 我的推理是我需要绑定立方体贴图的帧缓冲区,然后用正确的太阳纹理渲染太阳网格。 但是,如何在这里指定太阳的位置,使其与我之前计算的方向vector相匹配? 另一个问题是,如果太阳的一部分应该被渲染在立方体纹理的一个面上而其他部分在立方体纹理的另一面上,那么是否会有问题呢? 先谢谢你。

OpenGL(lwjgl)帧缓冲区对象GL_COLOR_ATTACHMENT不被写入

我目前正在为我的游戏引擎开发一个延迟渲染器,我必须从我的着色器输出多个纹理到我的GBuffer。 我一直在努力从片段着色器获取多个输出。 我正在使用OpenGL 3.3。 我的框架缓冲区类允许通过绑定多个纹理和接收来自GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1,GL_COLOR_ATTACHMENT2等等的input来实现多个颜色缓冲区。GL_COLOR_ATTACHMENT0可以工作,但是使用任何不同的颜色附件会产生空的纹理。 我看了很多例子,但是找不到我的代码出了什么问题。 任何想法,为什么这个设置可能不工作将是非常有益的。 帧缓冲区创建代码: import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.*; import static org.lwjgl.opengl.GL14.*; import static org.lwjgl.opengl.GL20.*; import static org.lwjgl.opengl.GL30.*; import java.nio.IntBuffer; import java.util.ArrayList; public class RenderPass { private int framebufferID; private int[] texIDs = new int[16]; private Texture[] tex = new Texture[16]; private int depthTextureID; private int colorTextureID; private int depthRenderBufferID; […]

Stencil Buffer在OpenGL ES 2.0(Android)中无法正常工作

我正试图去处理模板缓冲区。 除了设置视口,相机等,我的OpenGL ES 2.0初始化代码是: GLES20.glDisable(GLES20.GL_CULL_FACE); GLES20.glDisable(GLES20.GL_DEPTH_TEST); GLES20.glEnable(GLES20.GL_BLEND); GLES20.glEnable(GLES20.GL_STENCIL_TEST); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); GLES20.glClearColor(0.2f, 0.8f, 1.0f, 0); GLES20.glClearStencil(0); 我的主要代码如下。 GLES20.glEnable(GLES20.GL_STENCIL_TEST); GLES20.glColorMask(false, false, false, false); GLES20.glStencilFunc(GLES20.GL_NEVER, 1, 0xFF); GLES20.glStencilOp(GLES20.GL_REPLACE, GLES20.GL_KEEP, GLES20.GL_KEEP); GLES20.glStencilMask(0xFF); GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT); // draw sprites player.draw(); GLES20.glColorMask(true, true, true, true); GLES20.glDepthMask(true); GLES20.glStencilMask(0x00); // don't effect the stencil buffer GLES20.glStencilFunc(GLES20.GL_EQUAL, 0, 0xFF); // draw where stencils value is 0 […]

延期贴花正常的问题

我一直在做延期贴花系统。 到目前为止,我已经完成了投影部分,这意味着我可以在场景中点击一些东西,并将正确的投影到对象的表面上。 还有一些其他的东西我希望添加到这个系统中:正常裁剪和法线贴图贴花。 正常裁剪是当我放弃在一个尖锐的角度拉伸的片段。 看到这里 。 解决这个问题的一个办法就是丢弃G-Buffer中正常和贴图正常之间差别很大的碎片。 这将需要读取G缓冲区的正常纹理。 为了进行贴花法线贴图,我需要将贴花的法线(来自法线贴图)与G缓冲区的法线混合。 要求写入G缓冲区的正常纹理。 我希望很明显,为了支持这两个特性,我需要在相同的着色器通道中读取和写入正常纹理。 可悲的是,这是未定义的行为,所以我想知道是否有其他方式来实现这些function。