2016-01-06 59 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節所定義)。 我錯過了什麼? :( –