Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Ok, to answer some other questions here:</p> <p>Of course it is possible to use 6 FBOs, one for each face. Or to use one FBO and attach each face before you draw to it. In both cases the cube map face will be treated like any other 2D texture and you can use it together with normal 2D textures or Renderbuffers. And there's probably not much of a difference in all the possible ways (if the hardware supports them).</p> <p>However, it's also possible to draw everything in one step and as I was curious as to how this is done I did some research. </p> <p>To create a FBO with all faces of a cube map attached to a single attachment point I used this code (written in D):</p> <pre><code>// depth cube map glGenTextures(1, &amp;tDepthCubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP, tDepthCubeMap); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); for (uint face = 0; face &lt; 6; face++) { glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null); } // color cube map glGenTextures(1, &amp;tColorCubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP, tColorCubeMap); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); for (uint face = 0; face &lt; 6; face++) { glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, null); } // framebuffer object glGenFramebuffersEXT(1, &amp;fbo); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, tDepthCubeMap, 0); glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tColorCubeMap, 0); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); if (!isValidFBO()) { glDeleteFramebuffersEXT(1, &amp;fbo); fbo = 0; } </code></pre> <ul> <li>If you want to have only a depth map you have to change <em>glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);</em> to <em>glDrawBuffer(GL_NONE);</em> before validating it (and before drawing to it)</li> <li>MIN and MAG filters must be set to something valid (default would be GL_NEAREST_MIPMAP_LINEAR)</li> <li>width and height of all textures must be the same</li> </ul> <p>To render to the faces of a cube map you need a geometry shader. The following shader misses some rotations but it should be clear what it does. gl_Layer is used to direct the primitive to the correct face (0 = +X, 1 = -X, ...).</p> <pre><code>#version 120 #extension GL_EXT_geometry_shader4 : enable void main(void) { int i, layer; for (layer = 0; layer &lt; 6; layer++) { gl_Layer = layer; for (i = 0; i &lt; 3; i++) { gl_Position = gl_PositionIn[i]; EmitVertex(); } EndPrimitive(); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload