我在場景中間有一個光源,周圍有對象。在我的程序中渲染到WebGL中的cubemap教程
我想爲它做陰影貼圖。我已經知道如何爲屏幕外某處的光源做陰影貼圖。所以我的想法是渲染到我的燈泡周圍的立方體貼圖,立方體貼圖的每一面都是陰影貼圖,就像我習慣的那樣。
如何渲染到立方體貼圖?有教程嗎?這是要走的路嗎?
我在場景中間有一個光源,周圍有對象。在我的程序中渲染到WebGL中的cubemap教程
我想爲它做陰影貼圖。我已經知道如何爲屏幕外某處的光源做陰影貼圖。所以我的想法是渲染到我的燈泡周圍的立方體貼圖,立方體貼圖的每一面都是陰影貼圖,就像我習慣的那樣。
如何渲染到立方體貼圖?有教程嗎?這是要走的路嗎?
在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
}
當渲染到幀緩衝區時,我設置了視口嗎? 用於渲染到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); –
是的,渲染到立方體貼圖時,必須將視口更改爲立方體貼圖貼圖的大小。 –
我目前得到錯誤:WebGL:按照OpenGL ES 2.0.24規範第3.8.2節,紋理將被渲染爲黑色,因爲它是立方體貼圖紋理,並且不需要縮小過濾器一個mipmap,並不是多維數據集完整的(如3.7.10節所定義)。 我錯過了什麼? :( –
[示例](HTTP:// webglsamples .org/dynamic-cubemap/dynamic-cubemap.html) – gman