2016-01-06 149 views
1

我在场景中间有一个光源,周围有对象。在我的程序中渲染到WebGL中的cubemap教程

我想为它做阴影贴图。我已经知道如何为屏幕外某处的光源做阴影贴图。所以我的想法是渲染到我的灯泡周围的立方体贴图,立方体贴图的每一面都是阴影贴图,就像我习惯的那样。

如何渲染到立方体贴图?有教程吗?这是要走的路吗?

+0

[示例](HTTP:// webglsamples .org/dynamic-cubemap/dynamic-cubemap.html) – gman

回答

1

在webgl中,通过呈现立方体贴图的每个面呈现给立方体贴图,因此每个立方体贴图都绘制6个立方体贴图。

通过调用 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X+side, glTextureCube, 0);

您还需要为每个侧面有不同的看法矩阵附加一个立方体贴图到FBO的一侧。这通常使用.lookAt函数完成。是相关的外观方向和向上的向量如下:

var ENV_CUBE_LOOK_DIR = [ 
    new Vec3(1.0, 0.0, 0.0), 
    new Vec3(-1.0, 0.0, 0.0), 
    new Vec3(0.0, 1.0, 0.0), 
    new Vec3(0.0, -1.0, 0.0), 
    new Vec3(0.0, 0.0, 1.0), 
    new Vec3(0.0, 0.0, -1.0) 
]; 

var ENV_CUBE_LOOK_UP = [ 
    new Vec3(0.0, -1.0, 0.0), 
    new Vec3(0.0, -1.0, 0.0), 
    new Vec3(0.0, 0.0, 1.0), 
    new Vec3(0.0, 0.0, -1.0), 
    new Vec3(0.0, -1.0, 0.0), 
    new Vec3(0.0, -1.0, 0.0) 
]; 

投影矩阵是var CUBE_PROJECTION = mat4.perspective(Math.PI/2, aspect, near, far);

然后,在渲染时间,这样做:

//change to right framebuffer... 
for (var side = 0; side<6;side++){ 
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X+side, glTextureCube, 0); 
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 
    view = mat4.lookAt(camera.pos, camera.pos + ENV_CUBE_LOOK_DIR[side], ENV_CUBE_LOOK_UP[side]); 
    viewProjection = CUBE_PROJECTION * view; 
    // upload uniforms 
    // render 
} 
+0

当渲染到帧缓冲区时,我设置了视口吗? 用于渲染到2D纹理上我使用了与设置视口相同尺寸的空2D纹理: \t gl.viewport(0,0,OFFSCREEN_HEIGHT,OFFSCREEN_WIDTH); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,OFFSCREEN_HEIGHT,OFFSCREEN_WIDTH,0,gl.RGBA,gl.UNSIGNED_BYTE,NULL); –

+1

是的,渲染到立方体贴图时,必须将视口更改为立方体贴图贴图的大小。 –

+0

我目前得到错误:WebGL:按照OpenGL ES 2.0.24规范第3.8.2节,纹理将被渲染为黑色,因为它是立方体贴图纹理,并且不需要缩小过滤器一个mipmap,并不是多维数据集完整的(如3.7.10节所定义)。 我错过了什么? :( –