日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

光影的魔法!Cocos Creator 实现屏幕空间的环境光遮蔽(SSAO)

發(fā)布時(shí)間:2024/8/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 光影的魔法!Cocos Creator 实现屏幕空间的环境光遮蔽(SSAO) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言:

本文作者 alpha 從事游戲前端開(kāi)發(fā)已經(jīng)5年,畢業(yè)后他先是入職了騰訊無(wú)線大連研發(fā)中心,而后開(kāi)啟了北漂生涯,在北京的這3年一直都在使用 Cocos Creator,對(duì)前端業(yè)務(wù),包體、內(nèi)存優(yōu)化有很多的實(shí)踐經(jīng)驗(yàn)。最近 alpha 在學(xué)習(xí)計(jì)算機(jī)圖形學(xué)相關(guān)技術(shù),今天他將同大家分享 Cocos Creator 3.3 實(shí)現(xiàn)屏幕空間的環(huán)境光遮蔽(SSAO)的技術(shù)經(jīng)驗(yàn)。

什么是 AO ?

環(huán)境光(Ambient Lighting)是場(chǎng)景總體光照中的一個(gè)固定光照常量,用來(lái)模擬光的散射(Scattering)。在現(xiàn)實(shí)中,光線會(huì)以任意方向散射,它的強(qiáng)度是會(huì)改變的。

其中一種間接光照的模擬叫做環(huán)境光遮蔽(Ambient Occlusion),它的原理是通過(guò)將褶皺、孔洞和非常靠近的墻面變暗的方法近似模擬出間接光照。這些區(qū)域很大程度上是被周?chē)膸缀误w遮擋的,所以這些地方看起來(lái)會(huì)更暗一些。

在2007年,Crytek 公司發(fā)布了一款叫做屏幕空間環(huán)境光遮蔽(Screen Space Ambient Occlusion,SSAO)的技術(shù),并用在了他們的看家作孤島危機(jī)上。這一技術(shù)使用了屏幕空間場(chǎng)景的深度而不是真實(shí)的幾何體數(shù)據(jù)來(lái)確定遮蔽量。這一做法相對(duì)于真正的環(huán)境光遮蔽(基于光線追蹤)不但速度快,而且還能獲得較好的效果,使得它成為近似實(shí)時(shí)環(huán)境光遮蔽的標(biāo)準(zhǔn)。

下面這幅圖展示了在使用和不使用 SSAO 時(shí)場(chǎng)景的不同。特別注意對(duì)比電話亭后面和墻角部分,你會(huì)發(fā)現(xiàn)(環(huán)境)光被遮蔽了許多:
?


雖然這個(gè)效果不是非常明顯,但是啟用 AO 確實(shí)給我們更真實(shí)的感覺(jué),這些小的遮蔽細(xì)節(jié)能讓整個(gè)場(chǎng)景看起來(lái)更有立體感。

SSAO 原理

SSAO 背后的原理很簡(jiǎn)單:對(duì)于屏幕上的每一個(gè)片段,會(huì)根據(jù)周邊深度值計(jì)算一個(gè)遮蔽因子(Occlusion Factor)。這個(gè)遮蔽因子之后會(huì)被用來(lái)決定片段的環(huán)境光分量。遮蔽因子是通過(guò)采集片段周?chē)蛐秃诵?Kernel)的多個(gè)深度樣本,并和當(dāng)前片段深度值對(duì)比而得到的。高于片段深度值樣本的個(gè)數(shù)就是我們想要的遮蔽因子。
?


上圖中在幾何體內(nèi)灰色的深度樣本都是高于片段深度值的,他們會(huì)增加遮蔽因子;幾何體內(nèi)樣本個(gè)數(shù)越多,片段獲得的環(huán)境光照也就越少。

很明顯,渲染效果的質(zhì)量和精度與采樣的樣本數(shù)量有直接關(guān)系。如果樣本數(shù)量太低,渲染的精度會(huì)急劇減少,會(huì)得到一種叫做波紋(Banding)的效果;如果它太高了,會(huì)影響性能。通過(guò)引入隨機(jī)性到采樣核心(Sample Kernel)從而減少樣本的數(shù)目。通過(guò)隨機(jī)旋轉(zhuǎn)采樣核心,能在有限樣本數(shù)量中得到高質(zhì)量的結(jié)果。然而隨機(jī)性引入了一個(gè)很明顯的噪聲圖案,需要通過(guò)模糊降噪來(lái)修復(fù)這一問(wèn)題。下面這幅圖片展示了波紋效果還有隨機(jī)性造成的效果:
?


可以看到,盡管在低樣本數(shù)的情況下得到了很明顯的波紋效果,引入隨機(jī)性之后這些波紋效果就完全消失了。最初 Crytek 的實(shí)現(xiàn)是用一個(gè)深度緩沖做為輸入,但是這種方式存在一些問(wèn)題(如自遮閉, 光環(huán)),由于這個(gè)原因,現(xiàn)在通常不會(huì)使用球體的采樣核心,而是使用一個(gè)沿著表面法向量的半球體采樣核心。
?


通過(guò)在法向半球體(Normal Oriented Hemisphere)周?chē)蓸?#xff0c;將不會(huì)考慮到片段背面的幾何體,它消除了環(huán)境光遮蔽灰蒙蒙的感覺(jué),從而產(chǎn)生更真實(shí)的結(jié)果。

SSAO 特點(diǎn):

獨(dú)立于場(chǎng)景復(fù)雜性,僅和投影后最終的像素有關(guān),和場(chǎng)景中的頂點(diǎn)數(shù)三角數(shù)無(wú)關(guān)。

跟傳統(tǒng)的 AO 處理方法相比,不需要預(yù)處理,無(wú)需加載時(shí)間,也無(wú)需系統(tǒng)內(nèi)存中的內(nèi)存分配,所以更加適用于動(dòng)態(tài)場(chǎng)景。

對(duì)屏幕上的每個(gè)像素以相同的一致方式工作。

沒(méi)有 CPU 使用 - 它可以在 GPU 上完全執(zhí)行。

可以輕松集成到任何現(xiàn)代圖形管線中。

在了解了 AO & SSAO 之后,我們來(lái)看看要怎么基于 Cocos Creator 3.3.1 實(shí)現(xiàn) SSAO。

Demo 地址:

https://gitee.com/yanjifa/cc-ssao-demo

樣本緩沖

SSAO 需要幾何體的信息來(lái)確定一個(gè)片段的遮蔽因子,對(duì)于每個(gè)片段(像素),需要如下數(shù)據(jù):

逐片段位置向量

逐片段法線向量

逐片段反射顏色

采樣核心

用來(lái)旋轉(zhuǎn)采樣核心的隨機(jī)旋轉(zhuǎn)向量

通過(guò)使用一個(gè)逐片段觀察空間位置,可以將一個(gè)采樣半球核心對(duì)準(zhǔn)片段的觀察空間表面法線。對(duì)于每一個(gè)核心樣本會(huì)采樣線性深度紋理來(lái)比較結(jié)果。采樣核心會(huì)根據(jù)旋轉(zhuǎn)矢量稍微偏轉(zhuǎn)一點(diǎn);所獲得的遮蔽因子將會(huì)之后用來(lái)限制最終的環(huán)境光照分量。
?


通過(guò)以上發(fā)現(xiàn) SSAO 所需的數(shù)據(jù)不正是延遲管線的 G-buffer,關(guān)于 G-buffer 是什么可通過(guò)文章「延遲著色法」[1]做一個(gè)簡(jiǎn)單的了解。閱讀引擎代碼 editor/assets/chunks/standard-surface-entry-entry.chunk 和 cocos/core/pipeline/define.ts :

// editor/assets/chunks/standard-surface-entry-entry.chunk 33 行附近

#elif CC_PIPELINE_TYPE == CC_PIPELINE_TYPE_DEFERRED

layout(location = 0) out vec4 fragColor0;

layout(location = 1) out vec4 fragColor1;

layout(location = 2) out vec4 fragColor2;

layout(location = 3) out vec4 fragColor3;

void main () {

StandardSurface s; surf(s);

fragColor0 = s.albedo;? ?? ?? ?? ?? ?? ?? ?? ? // 漫反射顏色 -> 反照率紋理

fragColor1 = vec4(s.position, s.roughness);? ? // 位置 -> 世界空間位置

fragColor2 = vec4(s.normal, s.metallic);? ?? ? // 法線 -> 世界空間法線

fragColor3 = vec4(s.emissive, s.occlusion);? ? // 和本文無(wú)關(guān), 不做介紹

}

#endif


// cocos/core/pipeline/define.ts??117 行 附近

export enum PipelineGlobalBindings {

UBO_GLOBAL,

UBO_CAMERA,

UBO_SHADOW,

SAMPLER_SHADOWMAP,

SAMPLER_ENVIRONMENT,

SAMPLER_SPOT_LIGHTING_MAP,

SAMPLER_GBUFFER_ALBEDOMAP,? ?// 6

SAMPLER_GBUFFER_POSITIONMAP, // 7

SAMPLER_GBUFFER_NORMALMAP,? ?// 8

SAMPLER_GBUFFER_EMISSIVEMAP,

SAMPLER_LIGHTING_RESULTMAP,

COUNT,

}

// cocos/core/pipeline/define.ts??283 行 附近

const UNIFORM_GBUFFER_ALBEDOMAP_NAME = 'cc_gbuffer_albedoMap';

export const UNIFORM_GBUFFER_ALBEDOMAP_BINDING = PipelineGlobalBindings.SAMPLER_GBUFFER_ALBEDOMAP; // 6

// ...

const UNIFORM_GBUFFER_POSITIONMAP_NAME = 'cc_gbuffer_positionMap';

export const UNIFORM_GBUFFER_POSITIONMAP_BINDING = PipelineGlobalBindings.SAMPLER_GBUFFER_POSITIONMAP; // 7

// ...

const UNIFORM_GBUFFER_NORMALMAP_NAME = 'cc_gbuffer_normalMap';

export const UNIFORM_GBUFFER_NORMALMAP_BINDING = PipelineGlobalBindings.SAMPLER_GBUFFER_NORMALMAP; // 8

// ...

通過(guò)以上代碼可以分析出引擎 G-buffer 的數(shù)據(jù)布局,和具體 G-buffer 數(shù)據(jù)內(nèi)容,深度值后面將會(huì)使用 G-buffer 計(jì)算得出。


自定義渲染管線

通過(guò)擴(kuò)展延遲渲染管線的方式,在內(nèi)置渲染管線的 LightFlow 上增加 一個(gè) SsaoStage 用來(lái)生成 AO 紋理。首先創(chuàng)建一個(gè)渲染管線資源,資源管理器右鍵->創(chuàng)建->Render Pipeine->Render Pipeline Asset,命名為 ssao-deferrd-pipeline,創(chuàng)建 ssao-material | ssao-effect 著色器用來(lái)計(jì)算 AO 紋理,完整文件如下:

.

├── ssao-constant.chunk? ?? ?? ?? ?// UBO 描述

├── ssao-deferred-pipeline.rpp? ???// 管線資源文件

├── ssao-effect.effect? ?? ?? ?? ? // ssao shader

├── ssao-lighting.effect? ?? ?? ???// 光照 shader, 直接拷貝內(nèi)置 internal/effects/pipeline/defferrd-lighting

├── ssao-lighting.mtl

├── ssao-material.mtl

├── ssao-render-pipeline.ts? ?? ???// 定制管線腳本

├── ssao-stage.ts? ?? ?? ?? ?? ?? ?// stage 腳本

└── uboDefine.ts? ?? ?? ?? ?? ?? ? // Uniform Buffer Object 定義腳本

對(duì)應(yīng)管線配置如下,在 LightingFlow 下 Stages 最前面加入 SsaoStage,二手手游交易并指定對(duì)應(yīng)的材質(zhì),可以看到,引擎現(xiàn)在其實(shí)已經(jīng)支持后處理(PostProcess)了,只要指定材質(zhì)就可以了,可能當(dāng)前版本還不完善,所以引擎組還沒(méi)公開(kāi),其實(shí) SSAO 也可以算是一種后處理效果,管線資源的屬性設(shè)置如下:


自定義管線腳本如下:

// uboDefine.ts

import { gfx, pipeline } from "cc";

const { DescriptorSetLayoutBinding, UniformSamplerTexture, DescriptorType, ShaderStageFlagBit, Type } = gfx;

const { SetIndex, PipelineGlobalBindings, globalDescriptorSetLayout } = pipeline;

let GlobalBindingStart = PipelineGlobalBindings.COUNT; // 11

let GlobalBindingIndex = 0;

/**

* 定義 SSAO Frame Buffer, 布局描述

*/

const UNIFORM_SSAOMAP_NAME = 'cc_ssaoMap';

export const UNIFORM_SSAOMAP_BINDING = GlobalBindingStart + GlobalBindingIndex++; // 11

const UNIFORM_SSAOMAP_DESCRIPTOR = new DescriptorSetLayoutBinding(UNIFORM_SSAOMAP_BINDING, DescriptorType.SAMPLER_TEXTURE, 1, ShaderStageFlagBit.FRAGMENT);

const UNIFORM_SSAOMAP_LAYOUT = new UniformSamplerTexture(SetIndex.GLOBAL, UNIFORM_SSAOMAP_BINDING, UNIFORM_SSAOMAP_NAME, Type.SAMPLER2D, 1);

globalDescriptorSetLayout.layouts[UNIFORM_SSAOMAP_NAME] = UNIFORM_SSAOMAP_LAYOUT;

globalDescriptorSetLayout.bindings[UNIFORM_SSAOMAP_BINDING] = UNIFORM_SSAOMAP_DESCRIPTOR;

/**

* 采樣核心、相機(jī)遠(yuǎn)近裁剪面 near & far 等 UniformBlock 布局描述

*/

export class UBOSsao {

public static readonly SAMPLES_SIZE = 64; // 最大采樣核心

public static readonly CAMERA_NEAR_FAR_LINEAR_INFO_OFFSET = 0;

public static readonly SSAO_SAMPLES_OFFSET = UBOSsao.CAMERA_NEAR_FAR_LINEAR_INFO_OFFSET + 4;

public static readonly COUNT = (UBOSsao.SAMPLES_SIZE + 1) * 4;

public static readonly SIZE = UBOSsao.COUNT * 4;

public static readonly NAME = 'CCSsao';

public static readonly BINDING = GlobalBindingStart + GlobalBindingIndex++; // 12

public static readonly DESCRIPTOR = new gfx.DescriptorSetLayoutBinding(UBOSsao.BINDING, gfx.DescriptorType.UNIFORM_BUFFER, 1, gfx.ShaderStageFlagBit.ALL);

public static readonly LAYOUT = new gfx.UniformBlock(SetIndex.GLOBAL, UBOSsao.BINDING, UBOSsao.NAME, [

new gfx.Uniform('cc_cameraNFLSInfo', gfx.Type.FLOAT4, 1), // vec4

new gfx.Uniform('ssao_samples', gfx.Type.FLOAT4, UBOSsao.SAMPLES_SIZE), // vec4[64]

], 1);

}

globalDescriptorSetLayout.layouts[UBOSsao.NAME] = UBOSsao.LAYOUT;

globalDescriptorSetLayout.bindings[UBOSsao.BINDING] = UBOSsao.DESCRIPTOR;

/**

*??ssao-render-pipeline.ts

*??擴(kuò)展延遲渲染管線

*/

import { _decorator, DeferredPipeline, gfx, renderer } from "cc";

import { UNIFORM_SSAOMAP_BINDING } from "./uboDefine";

const { ccclass } = _decorator;

const _samplerInfo = [

gfx.Filter.POINT,

gfx.Filter.POINT,

gfx.Filter.NONE,

gfx.Address.CLAMP,

gfx.Address.CLAMP,

gfx.Address.CLAMP,

];

const samplerHash = renderer.genSamplerHash(_samplerInfo);

export class SsaoRenderData {

frameBuffer?: gfx.Framebuffer | null;

renderTargets?: gfx.Texture[] | null;

depthTex?: gfx.Texture | null;

}

@ccclass("SsaoRenderPipeline")

export class SsaoRenderPipeline extends DeferredPipeline {

private _width = 0;

private _height = 0;

private _ssaoRenderData: SsaoRenderData | null = null!;

private _ssaoRenderPass: gfx.RenderPass | null = null;

public activate(): boolean {

const result = super.activate();

this._width = this.device.width;

this._height = this.device.height;

this._generateSsaoRenderData();

return result;

}

public resize(width: number, height: number) {

if (this._width === width && this._height === height) {

return;

}

super.resize(width, height);

this._width = width;

this._height = height;

this._destroyRenderData();

this._generateSsaoRenderData();

}

public getSsaoRenderData(camera: renderer.scene.Camera): SsaoRenderData {

if (!this._ssaoRenderData) {

this._generateSsaoRenderData();

}

return this._ssaoRenderData!;

}

/**

* 核心代碼, 創(chuàng)建一個(gè) FrameBuffer 存儲(chǔ) SSAO 紋理

*/

private _generateSsaoRenderData() {

if (!this._ssaoRenderPass) {

const colorAttachment = new gfx.ColorAttachment();

colorAttachment.format = gfx.Format.RGBA8;

colorAttachment.loadOp = gfx.LoadOp.CLEAR;

colorAttachment.storeOp = gfx.StoreOp.STORE;

colorAttachment.endAccesses = [gfx.AccessType.COLOR_ATTACHMENT_WRITE];

const depthStencilAttachment = new gfx.DepthStencilAttachment();

depthStencilAttachment.format = this.device.depthStencilFormat;

depthStencilAttachment.depthLoadOp = gfx.LoadOp.CLEAR;

depthStencilAttachment.depthStoreOp = gfx.StoreOp.STORE;

depthStencilAttachment.stencilLoadOp = gfx.LoadOp.CLEAR;

depthStencilAttachment.stencilStoreOp = gfx.StoreOp.STORE;

const renderPassInfo = new gfx.RenderPassInfo([colorAttachment], depthStencilAttachment);

this._ssaoRenderPass = this.device.createRenderPass(renderPassInfo);

}

this._ssaoRenderData = new SsaoRenderData();

this._ssaoRenderData.renderTargets = [];

// 因?yàn)?SSAO 紋理最終是一張灰度圖, 所以使用 Format.R8 單通道紋理, 減少內(nèi)存占用, 使用時(shí)只需要讀取 R 通道即可

this._ssaoRenderData.renderTargets.push(this.device.createTexture(new gfx.TextureInfo(

gfx.TextureType.TEX2D,

gfx.TextureUsageBit.COLOR_ATTACHMENT | gfx.TextureUsageBit.SAMPLED,

gfx.Format.R8,

this._width,

this._height,

)));

this._ssaoRenderData.depthTex = this.device.createTexture(new gfx.TextureInfo(

gfx.TextureType.TEX2D,

gfx.TextureUsageBit.DEPTH_STENCIL_ATTACHMENT,

this.device.depthStencilFormat,

this._width,

this._height,

));

this._ssaoRenderData.frameBuffer = this.device.createFramebuffer(new gfx.FramebufferInfo(

this._ssaoRenderPass!,

this._ssaoRenderData.renderTargets,

this._ssaoRenderData.depthTex,

));

this.descriptorSet.bindTexture(UNIFORM_SSAOMAP_BINDING, this._ssaoRenderData.frameBuffer.colorTextures[0]!);

const sampler = renderer.samplerLib.getSampler(this.device, samplerHash);

this.descriptorSet.bindSampler(UNIFORM_SSAOMAP_BINDING, sampler);

}

public destroy(): boolean {

this._destroyRenderData();

return super.destroy();

}

private _destroyRenderData() {

if (!this._ssaoRenderData) {

return;

}

if (this._ssaoRenderData.depthTex) {

this._ssaoRenderData.depthTex.destroy();

}

if (this._ssaoRenderData.renderTargets) {

this._ssaoRenderData.renderTargets.forEach((o) => {

o.destroy();

})

}

if (this._ssaoRenderData.frameBuffer) {

this._ssaoRenderData.frameBuffer.destroy();

}

this._ssaoRenderData = null;

}

}

通過(guò)項(xiàng)目設(shè)置修改渲染管線為自定義的 SSAO 管線:
?


采樣核心

我們需要沿著表面法線方向生成大量的樣本。就像前面介紹的那樣,想要生成形成半球形的樣本。由于對(duì)每個(gè)表面法線方向生成采樣核心非常困難,也不合實(shí)際,所以將在切線空間(Tangent Space)內(nèi)生成采樣核心,法向量將指向正 z 方向。
?

假設(shè)有一個(gè)單位半球,生成一個(gè)擁有最大64樣本值的采樣核心:

// ssao-stage.ts

activate(pipeline: DeferredPipeline, flow: RenderFlow) {

super.activate(pipeline, flow);

const device = pipeline.device;

this._sampleBuffer = device.createBuffer(new gfx.BufferInfo(

gfx.BufferUsageBit.UNIFORM | gfx.BufferUsageBit.TRANSFER_DST,

gfx.MemoryUsageBit.HOST | gfx.MemoryUsageBit.DEVICE,

UBOSsao.SIZE,

UBOSsao.SIZE,

));

this._sampleBufferData = new Float32Array(UBOSsao.COUNT);

const sampleOffset = UBOSsao.SSAO_SAMPLES_OFFSET / 4;

// 64 樣本值采樣核心, 這里寫(xiě)的不太詳細(xì), 可結(jié)合 LearnOpenGL CN 的教程, 加深理解

for (let i = 0; i < UBOSsao.SAMPLES_SIZE; i++) {

let sample = new Vec3(

Math.random() * 2.0 - 1.0,

Math.random() * 2.0 - 1.0,

Math.random() + 0.01, // 這里和原教程有點(diǎn)區(qū)別, Z 稍微增加一個(gè)很小的值, 可改善平面波紋(Banding)的效果, 可能會(huì)對(duì)精度造成影響

);

sample = sample.normalize();

let scale = i / UBOSsao.SAMPLES_SIZE;

// 通過(guò)插值, 將核心樣本靠近原點(diǎn)分布

scale = lerp(0.1, 1.0, scale * scale);

sample.multiplyScalar(scale);

const index = 4 * (i + sampleOffset);

this._sampleBufferData[index + 0] = sample.x;

this._sampleBufferData[index + 1] = sample.y;

this._sampleBufferData[index + 2] = sample.z;

}

this._pipeline.descriptorSet.bindBuffer(UBOSsao.BINDING, this._sampleBuffer);

}

我們?cè)谇芯€空間中以-1.0到1.0為范圍變換 x 和 y 方向,并以 0.0 和 1.0 為范圍變換樣本的 z 方向 (如果以-1.0到1.0為范圍,取樣核心就變成球型了)。由于采樣核心將會(huì)沿著表面法線對(duì)齊,所得的樣本矢量將會(huì)在半球里。通過(guò)權(quán)重插值,得到一個(gè)大部分樣本靠近原點(diǎn)的核心分布。
?


獲取深度數(shù)據(jù)

通過(guò) G-buffer 中的 PostionMap 獲取線性深度值:

float getDepth(vec3 worldPos) {

// 轉(zhuǎn)到觀察空間

vec3 viewPos = (cc_matView * vec4(worldPos.xyz, 1.0)).xyz;

// cc_cameraNFLSInfo.y -> 相機(jī) Far, 通過(guò) ssao-stage.ts 腳本更新

float depth = -viewPos.z / cc_cameraNFLSInfo.y;

return depth;

}

深度圖如下:
?


SSAO 著色器

/**

* ssao-effect.effect

*/

CCProgram ssao-fs %{

precision highp float;

#include <cc-global>

#include <cc-shadow-map-base>

#include <ssao-constant>

// 最大 64

#define SSAO_SAMPLES_SIZE 64

in vec2 v_uv;

#pragma builtin(global)

layout (set = 0, binding = 7) uniform sampler2D cc_gbuffer_positionMap;

#pragma builtin(global)

layout (set = 0, binding = 8) uniform sampler2D cc_gbuffer_normalMap;

layout(location = 0) out vec4 fragColor;

// 隨機(jī)數(shù) 0.0 - 1.0

float rand(vec2 uv, float dx, float dy)

{

uv += vec2(dx, dy);

return fract(sin(dot(uv,??vec2(12.9898, 78.233))) * 43758.5453);

}

// 隨機(jī)旋轉(zhuǎn)采樣核心向量

vec3 getRandomVec(vec2 uv){

return vec3(

rand(uv, 0.0, 1.0) * 2.0 - 1.0,

rand(uv, 1.0, 0.0) * 2.0 - 1.0,

0.0

);

}

// 獲取線性深度

float getDepth(vec3 worldPos) {

vec3 viewPos = (cc_matView * vec4(worldPos.xyz, 1.0)).xyz;

float depth = -viewPos.z / cc_cameraNFLSInfo.y;

return depth;

}

// 深度圖

// void main () {

//? ?vec3 worldPos = texture(cc_gbuffer_positionMap, v_uv).xyz;

//? ?fragColor = vec4(getDepth(worldPos));

// }

void main () {

vec3 worldPos = texture(cc_gbuffer_positionMap, v_uv).xyz;

vec3 normal = texture(cc_gbuffer_normalMap, v_uv).xyz;

vec3 randomVec = getRandomVec(v_uv);

float fragDepth = -getDepth(worldPos);

// 創(chuàng)建一個(gè)TBN矩陣,將向量從切線空間變換到觀察空間

vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));

vec3 bitangent = cross(normal, tangent);

mat3 TBN = mat3(tangent, bitangent, normal);

// 取樣半徑

float radius = 1.0;

float occlusion = 0.0;

for(int i = 0; i < SSAO_SAMPLES_SIZE; ++i)

{

vec3 ssaoSample = TBN * ssao_samples.xyz;

ssaoSample = worldPos + ssaoSample * radius;

float aoDepth = -getDepth(ssaoSample);

vec4 offset = vec4(ssaoSample, 1.0);

offset? ?? ?= (cc_matProj * cc_matView) * offset;? ?// 轉(zhuǎn)換到裁剪空間

offset.xyz /= offset.w;? ?? ?? ?? ?? ?? ?? ?? ?? ???// 透視除法

offset.xyz??= offset.xyz * 0.5 + 0.5;? ?? ?? ?? ?? ?// 從 NDC (標(biāo)準(zhǔn)化設(shè)備坐標(biāo), -1.0 - 1.0) 變換到 0.0 - 1.0

vec3 samplePos = texture(cc_gbuffer_positionMap, offset.xy).xyz;

float sampleDepth = -getDepth(samplePos);

// 范圍檢查

float rangeCheck = smoothstep(0.0, 1.0, radius / abs(fragDepth - sampleDepth));

// 檢查樣本的當(dāng)前深度值是否大于存儲(chǔ)的深度值,如果是,添加到最終的貢獻(xiàn)因子上

occlusion += (sampleDepth >= aoDepth ? 1.0 : 0.0) * rangeCheck;

}

// 將遮蔽貢獻(xiàn)根據(jù)核心的大小標(biāo)準(zhǔn)化,并輸出結(jié)果

occlusion = 1.0 - (occlusion / float(SSAO_SAMPLES_SIZE));

fragColor = vec4(occlusion, 1.0, 1.0, 1.0);

}

}%

下圖展示了環(huán)境遮蔽著色器產(chǎn)生的紋理:
?


可見(jiàn),環(huán)境遮蔽產(chǎn)生了非常強(qiáng)烈的深度感。僅僅通過(guò)環(huán)境遮蔽紋理就已經(jīng)能清晰地看見(jiàn)模型一定躺在地板上而不是浮在空中。

現(xiàn)在的效果仍然看起來(lái)不是很完美,不連續(xù)的噪點(diǎn)清晰可見(jiàn),為了創(chuàng)建一個(gè)光滑的環(huán)境遮蔽結(jié)果,需要模糊環(huán)境遮蔽紋理進(jìn)行降噪。
?


應(yīng)用 SSAO 紋理

最后將 SSAO 紋理進(jìn)行模糊降噪,并逐片段將環(huán)境遮蔽因子乘到環(huán)境光照分量上,拷貝內(nèi)置光照著色器(internal/effects/pipeline/deferred-lighting.effect)命名為 ssao-lighting.effect。

/**

* 本文改動(dòng)部分添加了中文注釋

*/

CCProgram lighting-fs %{

precision highp float;

#include <cc-global>

#include <shading-standard-base>

#include <shading-standard-additive>

#include <output-standard>

#include <cc-fog-base>

in vec2 v_uv;

#pragma builtin(global)

layout (set = 0, binding = 6) uniform sampler2D cc_gbuffer_albedoMap;

#pragma builtin(global)

layout (set = 0, binding = 7) uniform sampler2D cc_gbuffer_positionMap;

#pragma builtin(global)

layout (set = 0, binding = 8) uniform sampler2D cc_gbuffer_normalMap;

#pragma builtin(global)

layout (set = 0, binding = 9) uniform sampler2D cc_gbuffer_emissiveMap;

#pragma builtin(global)

layout (set = 0, binding = 11) uniform sampler2D cc_ssaoMap;

layout(location = 0) out vec4 fragColor;

vec4 gaussianBlur(sampler2D Tex, vec2 UV, float Intensity)

{

// 省略, 詳見(jiàn) demo 工程

return texture(Tex, UV);

}

// 屏幕展示 SSAO 紋理

// void main() {

//? ?// 降噪

//? ?vec4 color = gaussianBlur(cc_ssaoMap, v_uv, 3.0);

//? ?// 不降噪

//? ?vec4 color = texture(cc_ssaoMap, v_uv);

//? ?fragColor = vec4(vec3(color.r), 1.0);

// }

void main () {

StandardSurface s;

vec4 albedoMap = texture(cc_gbuffer_albedoMap,v_uv);

vec4 positionMap = texture(cc_gbuffer_positionMap,v_uv);

vec4 normalMap = texture(cc_gbuffer_normalMap,v_uv);

vec4 emissiveMap = texture(cc_gbuffer_emissiveMap,v_uv);

// ssao 環(huán)境遮蔽因子, 單通道紋理, 所以只取 R 通道

vec4 ssaoMap = vec4(vec3(gaussianBlur(cc_ssaoMap, v_uv, 3.0).r), 1.0);

s.albedo = albedoMap * ssaoMap; // 乘到輻照率貼圖上, 應(yīng)用遮蔽紋理

s.position = positionMap.xyz;

s.roughness = positionMap.w;

s.normal = normalMap.xyz;

s.metallic = normalMap.w;

s.emissive = emissiveMap.xyz;

s.occlusion = emissiveMap.w;

// fixme: default value is 0, and give black result

float fogFactor;

CC_TRANSFER_FOG_BASE(vec4(s.position, 1), fogFactor);

vec4 shadowPos;

CC_TRANSFER_SHADOW_BASE(vec4(s.position, 1), shadowPos);

vec4 color = CCStandardShadingBase(s, shadowPos) +

CCStandardShadingAdditive(s, shadowPos);

CC_APPLY_FOG_BASE(color, fogFactor);

fragColor = CCFragOutput(color);

}

}%

最后來(lái)看下最終的渲染結(jié)果對(duì)比,首先是 SSAO 開(kāi)啟的效果:
?


SSAO 關(guān)閉的效果:
?


屏幕空間環(huán)境遮蔽是一個(gè)可高度自定義的效果,它的效果很大程度上依賴(lài)于我們根據(jù)場(chǎng)景類(lèi)型調(diào)整它的參數(shù)。對(duì)所有類(lèi)型的場(chǎng)景并不存在什么完美的參數(shù)組合方式。一些場(chǎng)景只在小半徑情況下工作,又有些場(chǎng)景會(huì)需要更大的半徑和更大的樣本數(shù)量才能看起來(lái)更真實(shí)。當(dāng)前這個(gè)演示用了64個(gè)樣本,屬于比較多的了,你可以調(diào)整核心大小和半徑從而獲得合適的效果。

已知問(wèn)題

編輯器攝像機(jī)預(yù)覽會(huì)渲染不正確。

資源管理器里面點(diǎn)擊自定義管線資源文件,編輯器控制臺(tái)會(huì)報(bào)錯(cuò),可能會(huì)導(dǎo)致編輯器無(wú)響應(yīng) (目前建議沒(méi)事別碰,碰過(guò)重啟編輯器可恢復(fù)正常)。

手機(jī)瀏覽器 (小米10 Pro) 下使用最大采樣核心 (64) 時(shí),幀數(shù)只有個(gè)位數(shù),可以確定當(dāng)前版本基本不能應(yīng)用到實(shí)際項(xiàng)目中,還需優(yōu)化。

Native 下自定義渲染管線同時(shí)還需要自定義 Engine-Native[2] 引擎,所以 Native 暫時(shí)還未支持,可參考 PR 3934[3] 添加對(duì) Native 的支持,這里要感謝 大表姐Kristine 提供的信息。

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的光影的魔法!Cocos Creator 实现屏幕空间的环境光遮蔽(SSAO)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产91亚洲精品 | 曰本免费av | 日韩欧美综合在线视频 | 日韩欧美在线视频一区二区 | 久久久九九 | 黄色软件网站在线观看 | 久久久久久久精 | 在线一区观看 | 亚洲精品午夜一区人人爽 | 亚洲爽爽网 | 五月综合激情婷婷 | 在线免费国产视频 | 亚洲资源在线观看 | av片在线观看免费 | 婷婷在线看 | 国产aa免费视频 | 日本精a在线观看 | 国内精品在线一区 | 探花视频网站 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 天天色棕合合合合合合 | 夜夜婷婷 | 亚洲精品综合在线 | 三级黄在线 | 999久久久国产精品 高清av免费观看 | 91夫妻自拍| 免费亚洲一区二区 | 欧美在线日韩在线 | 国产不卡免费 | 国内精品久久久久 | 国产成人免费观看久久久 | 日韩在线视频看看 | 国产精品成人一区二区三区吃奶 | 日韩激情久久 | 国产精品成人一区二区三区 | 婷婷视频 | 日韩欧美在线观看一区二区 | 国产在线一线 | 一本一道波多野毛片中文在线 | 久久久这里有精品 | 日本在线观看中文字幕 | 欧美男男激情videos | 黄色毛片大全 | 国产传媒一区在线 | 91看片在线免费观看 | 日韩欧美视频免费在线观看 | 国产日韩欧美在线看 | 少妇搡bbbb搡bbb搡忠贞 | 免费看的黄网站 | 毛片视频电影 | 韩国精品一区二区三区六区色诱 | 激情图片区 | 欧美天堂视频在线 | 免费看搞黄视频网站 | 亚洲永久精品一区 | 久久免费电影网 | 免费日韩三级 | 69视频永久免费观看 | 9色在线视频| 欧美成人中文字幕 | 亚洲va欧美va人人爽春色影视 | 中文字幕久久精品 | 国产在线专区 | 国产精品99久久免费观看 | 91av在线免费观看 | 亚洲一区二区三区在线看 | 久久黄色小说 | 人人澡超碰碰97碰碰碰软件 | 免费国产一区二区视频 | 成人免费在线看片 | 国产成视频在线观看 | 三级av片 | 欧美日韩国产精品一区二区三区 | 国产在线美女 | 在线观看免费一级片 | 97精品久久 | 色综合久久网 | av网站在线观看免费 | 久久久久北条麻妃免费看 | 黄色成人小视频 | 日本久久久久 | 日日麻批40分钟视频免费观看 | 91chinesexxx| 久久99久久99精品免观看粉嫩 | 美女在线黄 | 国产生活一级片 | 亚洲91av | 免费视频一级片 | 亚洲专区一二三 | 免费福利在线视频 | 精品日韩在线 | 国产免费人人看 | 国产精华国产精品 | 欧美一级在线看 | 国产一区福利在线 | 揉bbb玩bbb少妇bbb | 中文字幕在线观看一区二区 | 久草视频2 | 国产高清视频免费在线观看 | 福利视频一区二区 | 精品久久久久久久久久久久久 | 91在线欧美| 亚洲激情六月 | 狠狠干.com| 精品99免费视频 | 黄色网免费| 久久91久久久久麻豆精品 | 操操操夜夜操 | 日韩欧美69 | 一级精品视频在线观看宜春院 | 91在线看视频免费 | 超碰在线cao | 天天干,天天射,天天操,天天摸 | 亚洲精品动漫在线 | 亚洲一区二区高潮无套美女 | 亚洲精品人人 | 91av看片| 久久综合偷偷噜噜噜色 | 欧美日韩国产亚洲乱码字幕 | 国产精品成人一区 | 日韩免费电影 | 视频在线亚洲 | 探花视频免费观看 | 色婷婷综合久久久中文字幕 | 日韩区在线观看 | 人人玩人人弄 | 国产精品免费视频观看 | 97成人精品视频在线观看 | 成人免费影院 | 99热只有精品在线观看 | 成年人在线免费视频观看 | 日日天天干| 香蕉久久久久久av成人 | 国产精品久久久久久久婷婷 | 在线电影日韩 | 超碰人人在 | 成人国产一区二区 | 国产精品综合久久久 | 久久婷婷一区 | 91精品啪在线观看国产 | 欧美91精品久久久久国产性生爱 | 久久国际影院 | 久久成人麻豆午夜电影 | 九热精品 | 最新中文字幕在线播放 | 香蕉视频网站在线观看 | 国产精品福利在线 | 美国av片在线观看 | 国内精品久久久久影院一蜜桃 | 日黄网站 | 日韩av在线免费播放 | 久草在线免费在线观看 | 亚洲欧美综合精品久久成人 | 91精品久久久久久久99蜜桃 | 久久国产精品99久久久久久丝袜 | 婷婷激情站| 精品国产电影一区二区 | 久久国产精品免费一区 | 中文字幕免费国产精品 | 日韩中文字幕在线看 | 在线免费观看麻豆视频 | 精品99视频 | 黄色毛片大全 | 久久伊人精品一区二区三区 | 日韩中文字幕视频在线 | 91麻豆产精品久久久久久 | 午夜视频在线观看一区二区三区 | 精品国产欧美一区二区三区不卡 | 91爱爱网址| 欧美日韩在线第一页 | 国产精品涩涩屋www在线观看 | 性色xxxxhd| 天天色中文 | 亚洲黄色免费观看 | 深夜免费福利在线 | 不卡的av| 国产精品美女久久久 | 91在线视频在线 | 久艹视频在线观看 | 韩国视频一区二区三区 | 伊人久久在线观看 | 激情久久久久久久久久久久久久久久 | 成人av电影免费 | 国产专区视频在线 | 天天干.com | 国产日韩在线观看一区 | 国产一级片不卡 | 人人搞人人搞 | 久草在线99| 国产午夜一级毛片 | 99精品国产aⅴ | 色婷婷在线观看视频 | 免费观看国产精品视频 | av东方在线| 日日干夜夜操视频 | www久久久久| 国产精品一区二区久久国产 | 亚洲乱码国产乱码精品天美传媒 | 97色免费视频 | 极品嫩模被强到高潮呻吟91 | 黄色精品国产 | 99视频在线免费观看 | 成片免费观看视频999 | 91.精品高清在线观看 | 91视频在线播放视频 | 国产成人精品一区在线 | 日日爱av| 在线观看91av | 午夜婷婷综合 | 免费av一级电影 | 久精品视频在线观看 | 天天操天天操天天操 | 91在线影视 | 日本精油按摩3 | 中文字幕av在线免费 | 国产拍揄自揄精品视频麻豆 | 成人av在线观 | 日韩免费福利 | 国产视频在线观看一区二区 | 最近免费中文字幕mv在线视频3 | 成人毛片在线视频 | 中午字幕在线 | 亚洲国产视频在线 | 成人免费xyz网站 | 国产亚洲视频在线免费观看 | 天天射天天干天天插 | 久久激情综合网 | 激情久久伊人 | 亚洲专区路线二 | 国产精品丝袜在线 | 亚洲欧美日韩精品久久久 | 在线观看精品视频 | 天天天插 | av在线a | 午夜精品久久久99热福利 | 操操操干干干 | 精品国产一区二区三区久久影院 | 九九九热精品免费视频观看网站 | 一区二区中文字幕在线观看 | 丁香午夜婷婷 | 在线观看麻豆av | 亚洲欧美国产日韩在线观看 | 92中文资源在线 | www.久草.com| 中文字幕乱码在线播放 | 国产精品福利在线观看 | 久久久精品午夜 | 狠狠操天天射 | 欧洲色吧 | 97精品国产97久久久久久粉红 | 高清精品久久 | 最近更新中文字幕 | 成人资源在线播放 | 精品 一区 在线 | 在线观看的av | 国产免费观看久久 | 91在线麻豆 | 日本久久免费电影 | 免费91在线观看 | 久久久久高清毛片一级 | 中文字幕一区二区三区久久蜜桃 | 草久在线观看视频 | 欧美一区二区免费在线观看 | www.日本色 | 欧美综合国产 | 久久视频国产精品免费视频在线 | 六月色丁香| 中国一级片在线观看 | 91免费在线视频 | 日韩欧美在线高清 | av中文国产 | 日韩一二区在线 | 国产精品1区2区在线观看 | 国产超碰在线观看 | 国产视频 亚洲精品 | 干综合网 | 精品在线观看一区二区 | 日韩精品视频在线免费观看 | 国产玖玖精品视频 | 国产精品成人久久久 | 国产精品乱码久久久 | 香蕉精品在线观看 | 亚洲乱亚洲乱妇 | 天天射天天干天天操 | 日韩在线免费视频 | 天天操一操 | 免费看三级黄色片 | 亚洲精品欧美精品 | japanese黑人亚洲人4k | 美女视频是黄的免费观看 | avav99| 亚洲最新av网址 | 中文字幕在线看视频国产中文版 | 最新av观看| 成人免费大片黄在线播放 | 国产高清久久久 | 九九久久影院 | 三级在线视频播放 | 久久99精品国产麻豆宅宅 | 最近能播放的中文字幕 | 国产黄色观看 | 天天综合久久 | 人人爽人人爽人人片 | 日日爱夜夜爱 | 午夜色影院 | 在线看日韩av | 久久久穴 | 午夜视频二区 | 亚洲精品999 | 激情久久久久久久久久久久久久久久 | 91麻豆精品国产91久久久久久久久 | 天天操天天摸天天爽 | 日韩欧美69 | 久久久久免费精品国产 | 人人揉人人揉人人揉人人揉97 | 亚洲欧美国产视频 | 亚洲乱码在线观看 | 91亚色视频 | 亚洲精品视频二区 | 久久欧洲视频 | 狠狠色丁香婷婷综合欧美 | 国产一区二区电影在线观看 | 最近中文字幕国语免费av | 中文字幕一区二区三区四区 | 17videosex性欧美 | 色综合久久久久综合体桃花网 | 一区二区三区国 | 国内视频 | 丁香av在线| 日韩狠狠操 | 国产一区二区高清不卡 | 激情五月婷婷综合网 | 福利网址在线观看 | 免费在线观看一区二区三区 | av夜夜操| 欧美日一级片 | 免费碰碰 | 免费黄色在线播放 | 亚洲成人国产精品 | 91日韩精品视频 | 亚洲三级黄色 | 亚洲国产中文字幕在线视频综合 | 日韩美女av在线 | 国产日产精品一区二区三区四区的观看方式 | 在线观看视频精品 | 日本中文字幕在线电影 | 91成人破解版 | 欧美三级高清 | 在线国产黄色 | 国产真实在线 | 色综合中文字幕 | 日产乱码一二三区别在线 | 久久久人| 亚洲精品九九 | 亚洲人成精品久久久久 | 日韩最新在线视频 | 日韩欧美精品一区二区 | 在线观看av免费 | 天天天天天天天操 | 丝袜美腿在线播放 | 69av视频在线观看 | 中文av网 | 高清不卡毛片 | 国产麻豆精品久久 | 亚洲精品国产综合99久久夜夜嗨 | 日本精a在线观看 | 国产原创中文在线 | 日韩在线视频免费播放 | 国产精品久久久久久久免费大片 | 中文字幕在线观看一区二区 | 天天操天天射天天操 | 最新婷婷色 | 久草网视频在线观看 | 国产精品一区在线 | 青青草国产精品 | 91精品爽啪蜜夜国产在线播放 | 国产99中文字幕 | 97韩国电影 | 国产综合片 | 麻豆视频在线播放 | 亚洲综合激情五月 | 久久这里有 | 欧美最猛性xxxxx亚洲精品 | 免费的国产精品 | 亚洲国产精品电影 | 天堂资源在线观看视频 | 久久网站免费 | 国产h在线播放 | 久草精品在线 | 国产精品久久久久久久久久免费 | 成人h在线播放 | 久久久免费精品国产一区二区 | 91精品推荐| 国产剧情亚洲 | 热99在线 | 欧美在线观看小视频 | av黄色在线观看 | 亚洲狠狠丁香婷婷综合久久久 | 狠狠色丁香婷婷综合欧美 | 国产精品久久久久久久久久久久久久 | 丁香影院在线 | 色偷偷中文字幕 | 久久久久久久久福利 | 黄在线免费看 | 成人在线视频免费观看 | 天天艹天天操 | 久草视频中文在线 | 毛片888| 欧美日韩在线免费观看 | 中文字幕在线成人 | 欧美午夜a | 中文字幕首页 | 亚洲国产天堂av | 国产精品久久久久久久久久久免费 | 欧美色噜噜噜 | 国产精品va | 日本一区二区三区免费看 | 9999在线视频 | 精品免费 | 一区二区三区播放 | 亚洲五月六月 | 色免费在线 | 西西444www大胆无视频 | 99这里都是精品 | 色九九在线| 久久天堂精品视频 | 日本一区二区三区视频在线播放 | 久久久久久久网站 | 久久艹国产视频 | 久久精品视频18 | 中文字幕精品一区二区精品 | 国产亚洲视频系列 | 欧美日韩国产一区 | 久久电影日韩 | 亚洲欧洲精品一区二区精品久久久 | 亚洲九九精品 | 国产免码va在线观看免费 | 欧美性大战久久久久 | 天天插天天狠 | 视频在线观看入口黄最新永久免费国产 | 亚洲性xxxx| 最新av中文字幕 | 国产麻豆剧传媒免费观看 | 久久久久免费精品国产小说色大师 | 西西444www高清大胆 | 综合在线色 | 国产美女网站在线观看 | 国产精品日韩高清 | 日韩在线 | 国产精久久久久久妇女av | 久久国产精品一区二区三区四区 | 美女福利视频一区二区 | 麻豆国产精品视频 | 97在线播放视频 | 人人射人人射 | 自拍超碰在线 | 欧美精品一二 | 国产成人一区二区三区影院在线 | 亚洲九九爱 | 中文字幕在线观看视频网站 | 91秒拍国产福利一区 | www.色午夜.com| v片在线播放 | 99久久精品国产欧美主题曲 | 808电影 | 日韩在线视频观看免费 | 婷婷色综合网 | 欧美精品久久人人躁人人爽 | 奇米网444 | 精品国产视频一区 | 欧美日韩在线观看一区二区三区 | 成年人国产精品 | 亚洲一级在线观看 | 天天操天天舔天天爽 | 日韩美在线| 欧美精品久久久久性色 | 日韩av一区二区在线 | 久草在线免费电影 | 在线观看v片 | 国产视频 亚洲精品 | 毛片网站在线观看 | 亚洲精品国精品久久99热 | 久久国产精品视频观看 | 国产精品一区专区欧美日韩 | 三级在线视频观看 | 成人性生活大片 | 99精品国产99久久久久久97 | 国产午夜免费视频 | 91亚洲精品久久久中文字幕 | 国产在线一卡 | 在线看片一区 | 久久99精品久久久久婷婷 | 久久艹在线 | 天天曰| 91成年人网站 | 国产精品扒开做爽爽的视频 | 日韩国产精品久久久久久亚洲 | 超碰在线人人 | 国产视频久久久久 | www.com.黄| 国产精品刺激对白麻豆99 | 91麻豆高清视频 | 久久婷婷影视 | 天天曰天天爽 | 91高清视频免费 | 亚洲精品视频二区 | 亚洲爽爽网 | 国产精品9999久久久久仙踪林 | 久久这里只有精品视频99 | 97免费在线观看视频 | 国产中年夫妇高潮精品视频 | 久久久综合精品 | 99精品美女 | 久草a视频| 黄色小网站在线 | 视频在线播放国产 | 在线a人片免费观看视频 | av专区在线| 日本一区二区免费在线观看 | 色婷婷精品大在线视频 | 国产精品网在线观看 | 亚洲国产精品人久久电影 | 中文字幕中文字幕在线中文字幕三区 | 高潮久久久久久久久 | 五月婷婷六月丁香 | 久久99在线视频 | 福利视频区 | 色婷婷九月| 久久99精品一区二区三区三区 | 91亚洲精品久久久久图片蜜桃 | 91九色精品 | 亚洲国产成人精品在线观看 | 97色涩| 亚洲情感电影大片 | 超碰成人av | 99久久久国产精品免费99 | 人人爽人人爽人人片av免 | 丁香六月激情婷婷 | 久久国产成人午夜av影院宅 | 爱爱av网 | 99久久久久久 | 国产精品第2页 | 久久国产精品久久w女人spa | 久久精品99久久久久久2456 | 国产免费人成xvideos视频 | 国产成人精品久久久久 | 欧美精品九九99久久 | 一区二区三区免费播放 | 丁香花中文在线免费观看 | 久久久99精品免费观看乱色 | 伊人狠狠色丁香婷婷综合 | 婷婷六月天综合 | 久久人人爽视频 | 豆豆色资源网xfplay | 欧美日韩xxxxx | 超碰人人干人人 | 在线观看日韩精品视频 | 最近中文字幕在线 | 欧美成人性网 | 亚洲日本成人 | 亚洲精品久久久久www | 伊人天堂网| 午夜黄色 | 日韩最新理论电影 | av 在线观看| 日韩精品不卡在线观看 | 欧美日韩性视频在线 | 五月婷婷开心中文字幕 | 亚洲狠狠操 | 激情婷婷亚洲 | 午夜丰满寂寞少妇精品 | 四虎国产精品免费 | av免费网站在线观看 | 国产精品福利无圣光在线一区 | 天天艹天天操 | 日韩一区二区三区免费电影 | 久久国产精品精品国产色婷婷 | 99高清视频有精品视频 | 中文字幕电影在线 | 午夜男人影院 | av色网站 | 精品久久久久久一区二区里番 | 日本黄色黄网站 | 中文字幕免费在线 | av性网站| 国产91免费在线 | 最新国产精品视频 | 超碰97人人射妻 | 亚洲日韩欧美一区二区在线 | 特级黄录像视频 | 欧美日韩aa | 国产精品一区二区免费视频 | 国产亚洲婷婷免费 | 国产精品美女久久久久久 | 丝袜一区在线 | 国产成人一区二区三区在线观看 | 日韩电影在线观看一区二区三区 | 成人va在线观看 | 人人干人人搞 | 久久久久伊人 | 婷婷丁香激情网 | 亚洲一区二区三区毛片 | 精品国产1区 | www免费网站在线观看 | 狠狠天天 | 最近中文字幕mv免费高清在线 | 国产精品免费大片视频 | 在线观看麻豆av | 中文字幕av最新 | 激情开心站 | av电影不卡 | 国产成人福利在线 | 国产精品久久久久久久久久久久冷 | 久久免费视频在线观看 | 在线观看免费黄视频 | 玖玖在线精品 | a视频在线 | 日韩av进入 | 日本久久成人中文字幕电影 | 天天色天天操天天爽 | 国产精品中文字幕在线 | 欧美日韩一区二区三区在线观看视频 | 国产区在线 | 亚洲v精品 | 91九色网站 | av资源网在线播放 | 久久不射网站 | 国产精品激情偷乱一区二区∴ | 精品久久久久久一区二区里番 | 人人揉人人揉人人揉人人揉97 | 精品三级av | 亚州人成在线播放 | 国产一区二区三区免费视频 | 中文字幕的| 亚洲成人家庭影院 | 免费在线成人av电影 | 97av视频在线观看 | 欧美午夜理伦三级在线观看 | 亚洲精品麻豆视频 | 婷婷久久精品 | www激情com | 久久综合九色99 | 成人九九视频 | 欧美a视频在线观看 | 97人人超碰在线 | 欧美a在线看 | 99精品久久只有精品 | 在线黄色国产 | 久久99精品国产 | 中文字幕中文字幕中文字幕 | 国产成人福利 | 高清av影院| 一区二区三区四区不卡 | 中文字幕一二 | 久久天天躁狠狠躁夜夜不卡公司 | 久久久久久久国产精品影院 | 尤物一区二区三区 | 久草免费福利在线观看 | 国产亚洲一级高清 | 天天天天天天天操 | 色wwwww| 激情五月伊人 | 国产视频在线免费 | 欧美日韩高清一区二区三区 | 天天天插 | 久久999精品| 69国产盗摄一区二区三区五区 | 国产亚洲在线视频 | 一区二区三区四区免费视频 | 日韩精品视频免费在线观看 | 91九色精品女同系列 | 免费高清在线观看成人 | 精品少妇一区二区三区在线 | 国产高清av免费在线观看 | 成人午夜精品久久久久久久3d | 日本视频网 | 成 人 黄 色 免费播放 | 日韩精品视频在线观看免费 | 丝袜美女在线观看 | 婷婷六月网 | 欧美日韩在线视频观看 | 久久精品一二三区白丝高潮 | 在线播放你懂 | 国产精品一区二区三区99 | 亚洲精品日韩av | 欧美成人理伦片 | 极品美女被弄高潮视频网站 | 麻豆91视频 | 二区中文字幕 | 久久久久亚洲国产 | 亚洲激情网站免费观看 | 久久久久免费精品国产小说色大师 | 久久久精品| 在线观看视频91 | 日韩成人看片 | 一区二区三区高清 | 国内丰满少妇猛烈精品播放 | 国产在线免费 | 国产黄网站在线观看 | 亚洲三区在线 | 国产成人精品电影久久久 | 亚洲女欲精品久久久久久久18 | 日韩免费三区 | 啪啪免费视频网站 | 999久久精品 | 亚洲精品国产精品国自产观看 | 亚州天堂 | 成人精品国产免费网站 | 玖玖精品在线 | 狠狠夜夜 | 国产精品va在线观看入 | av一级片在线观看 | 婷婷精品| 精品国产乱码一区二 | 美女性爽视频国产免费app | 91在线视频网址 | 干综合网| 99久久这里只有精品 | 福利一区二区在线 | 国产精品久久久久久久久久久免费 | 日本中文字幕在线观看 | 午夜久久久久久久久久久 | 中文字幕亚洲欧美日韩 | 精品国产一区二区三区久久影院 | 免费a级毛片在线看 | 丁香综合 | 欧美一级特黄aaaaaa大片在线观看 | avwww在线 | 91色偷偷 | 色播五月激情五月 | 婷婷色资源 | 久久亚洲私人国产精品va | 中文字幕高清在线播放 | 免费日韩 精品中文字幕视频在线 | 中文字幕视频免费观看 | 国产视频资源 | 免费观看丰满少妇做爰 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 精品久久久久久久久久久久久 | 一级黄色片在线观看 | 亚洲男男gⅴgay双龙 | 美女视频黄的免费的 | 精品国产乱码久久 | 国产精品丝袜久久久久久久不卡 | 亚洲精品在线免费播放 | av中文字幕av | 99精品视频精品精品视频 | 精品在线一区二区 | 日本在线观看中文字幕 | 国产不卡在线观看 | 五月婷婷毛片 | 人人看97 | www.色国产 | 欧美日韩精品免费观看视频 | 西西444www大胆无视频 | 国产精品视频全国免费观看 | 美女黄频视频大全 | 97人人超| 国产精品精品国产婷婷这里av | 久久精品一级片 | 伊人小视频 | 成年人免费看 | 在线观看视频精品 | 亚洲精品久久久久久久不卡四虎 | 最近中文字幕高清字幕免费mv | 91喷水| 天天综合亚洲 | 中文字幕在线电影 | 黄色成年 | 国产精品久久久久毛片大屁完整版 | 97视频免费观看 | 国产99久久久久久免费看 | 久久久久亚洲精品成人网小说 | av在线进入 | 国产二区电影 | 亚洲经典中文字幕 | 精品96久久久久久中文字幕无 | 精品福利视频在线观看 | 人人澡人人草 | 九九电影在线 | 免费色网 | 成人av资源网 | 久久精品99国产精品日本 | 中文在线a在线 | 国产婷婷一区二区 | 欧美日韩精 | 成人av电影在线观看 | 精品久久久网 | 国产高清绿奴videos | 国产精品久久久网站 | 狠狠久久综合 | 久久久成人精品 | 国产精品专区一 | 国产免费又爽又刺激在线观看 | 久久久久免费观看 | 伊人中文网 | 国产原厂视频在线观看 | 狠狠操狠狠干天天操 | 亚洲少妇久久 | 伊人天天色 | 99视频精品全国免费 | 91成品视频 | 久久99精品视频 | 91看片一区二区三区 | 蜜桃视频日本 | 日韩精品一区二区三区视频播放 | 国产成人61精品免费看片 | 国产+日韩欧美 | 精品福利在线观看 | 亚洲三级黄 | 中文字幕在线观看免费观看 | 黄网站色 | 日韩av在线一区二区 | 精品一区三区 | 一区二区三区在线观看免费视频 | 国产成人在线精品 | 久久久精品国产免费观看同学 | 97国产在线视频 | 在线观看中文字幕 | 国产精品一区二区三区在线免费观看 | 精品爱爱| 四虎8848免费高清在线观看 | 美女久久网站 | 国产在线黄 | 久久久久久看片 | 国产成人精品久久二区二区 | 香蕉视频在线观看免费 | 久久综合亚洲鲁鲁五月久久 | 成人久久久精品国产乱码一区二区 | 国产一区私人高清影院 | 在线精品视频免费播放 | 91av视频在线观看免费 | 久久免费成人精品视频 | 九九久久精品视频 | 国产福利专区 | 五月婷婷播播 | 日韩一区在线免费观看 | 午夜精品婷婷 | 天天操天天操 | 美女久久久久久久久久久 | 国产激情小视频在线观看 | 粉嫩av一区二区三区四区五区 | 精品亚洲成人 | 亚洲精选99 | 国产成本人视频在线观看 | 日p在线观看| 性色av香蕉一区二区 | 日韩r级电影在线观看 | 国产99久久精品一区二区300 | 免费在线观看日韩欧美 | 在线观看网站av | 在线观看日韩免费视频 | 久久综合免费 | 亚洲九九九 | 国产日本高清 | 亚洲一级片免费观看 | 欧美日韩精品在线观看 | 337p西西人体大胆瓣开下部 | 免费日韩 精品中文字幕视频在线 | 免费看国产a | 天天色天天射天天干 | 婷婷六月综合网 | 久久字幕 | 久久综合加勒比 | 欧美精品在线观看免费 | 日韩av图片 | 99久久久久久久久 | 国产又粗又猛又黄又爽 | 亚洲成人影音 | 97电影手机版 | 国产精品免费在线播放 | 免费看毛片在线 | 日韩精品一区电影 | 久久视频这里有久久精品视频11 | 亚洲精品乱码久久久久久久久久 | 免费裸体视频网 | 草久在线观看视频 | 丁香激情综合 | 欧美aa一级片 | 久久综合九色综合久久久精品综合 | 免费观看性生交 | 一区二区三区四区五区在线 | 欧美激情综合五月色丁香 | av经典在线 | 亚洲综合色站 | 超碰官网 | 久草爱视频 | 亚洲精品午夜久久久 | 伊人资源视频在线 | 日p在线观看 | 三级免费黄色 | 久草在线手机观看 | 97精品国产91久久久久久 | 国产成视频在线观看 | 国产免费视频一区二区裸体 | 久久久免费观看完整版 | 国产亚洲婷婷免费 | 日韩三区在线 | 亚洲精品国产欧美在线观看 | 久综合网 | 中文字幕久久亚洲 | 日韩欧美高清视频在线观看 | 97网在线观看 | 中文字幕免费观看 | 日精品在线观看 | 女人18毛片a级毛片一区二区 | 天天综合网 天天综合色 | 日本 在线 视频 中文 有码 | 免费观看成人网 | 国产精品18久久久久久久久久久久 | 亚洲视频免费视频 | 91精品国产一区二区三区 | 黄色影院在线免费观看 | 国产成人av电影在线 | 99久久精品免费看国产免费软件 | 有码一区二区三区 | 麻豆一级视频 | 免费91麻豆精品国产自产在线观看 | 日韩激情视频在线观看 | 亚欧洲精品视频在线观看 | 精品久久久久久国产 | 香蕉在线观看 | 蜜臀久久99精品久久久无需会员 | 五月天com| 日本爱爱免费 | 四虎影视久久久 | 色全色在线资源网 | 日韩com| 91在线精品秘密一区二区 | 91人网站 | 91探花视频 | 久久久三级视频 | 黄色片视频在线观看 | 国产精品一区二区三区免费看 | 9在线观看免费 | 亚洲视频免费 | 九九免费观看全部免费视频 | 香蕉视频网址 | 免费看片网址 | 久久影视一区 | 99精品久久久久 | 日韩精品免费一区二区三区 | 国产成人精品一二三区 | 天天综合日日夜夜 | 超碰在线观看av | 蜜臀久久99精品久久久无需会员 | 国内视频| 91在线视频观看 | 亚洲免费a | 日韩av在线高清 | 国产一区成人 | 日韩高清成人 | 激情在线网址 | 欧美一级看片 | 四虎影视欧美 | 日韩一级成人av | 成人免费av电影 | 性色xxxxhd | 久久精品国产精品亚洲 | 欧美孕交vivoestv另类 | 亚洲激情在线观看 | 99在线热播精品免费99热 | 涩av在线 | 日本三级久久 | 日韩久久久久久久 | 亚洲精品88欧美一区二区 | 国产一区私人高清影院 | av丁香| 狠狠的日日| 国产在线观看免 | 在线看一区 | 欧美精品v国产精品 | 九九九在线观看 | 在线性视频日韩欧美 | 免费av片在线 | 黄网av在线| 亚洲黄色免费观看 | 成人av日韩 | 美女av在线免费 | 日韩国产精品久久久久久亚洲 | 天天综合网国产 | 免费黄色激情视频 | 国产无套一区二区三区久久 | 日本精品久久久一区二区三区 | 亚洲专区在线 | 精品视频免费 | 在线观看成人国产 | 一本一本久久a久久精品综合 | 精品久久久久久综合日本 | 国产一区二区久久 | 五月天色站 | 日韩高清免费电影 | 91视频在线播放视频 | 精品一区在线 | 日韩一三区 | 99精品国产在热久久 | 亚一亚二国产专区 | 国产日产欧美在线观看 |