日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

bgfx Shader編譯實(shí)戰(zhàn):從HLSL到DXBC的完整鏈路與跨平臺(tái)要點(diǎn)

bgfx Shader編譯實(shí)戰(zhàn):從HLSL到DXBC的完整鏈路與跨平臺(tái)要點(diǎn) 剛接觸bgfx的開發(fā)者十有八九會(huì)卡在shader編譯這一步。明明寫的是HLSL在Visual Studio里也能正常調(diào)可一進(jìn)bgfx工程就報(bào)一堆莫名錯(cuò)誤或者干脆編譯出來渲染黑屏。這篇文章我就專門聊“bgfx shader編譯Windows下HLSL為例”這件事從工具鏈搭建、shader編寫規(guī)范、shaderc命令解析到運(yùn)行時(shí)加載和問題排查完整走一遍。準(zhǔn)備入坑bgfx圖形開發(fā)、或者已經(jīng)在用但想徹底搞懂shader鏈路的朋友都可以參考。我不會(huì)把命令參數(shù)全列一遍而是把“為什么這么編譯”背后的邏輯講清楚這樣你換到Linux、Android甚至Vulkan后端時(shí)也能自己推斷該用什么參數(shù)。1. 先搞懂bgfx的shader編譯流水線1.1 一份著色器源碼是怎么變成DXBC的bgfx的shader編譯和普通DirectX工程最大的區(qū)別在于它不是直接把HLSL編譯成你能丟給D3D的字節(jié)碼就完事。bgfx要同時(shí)支持D3D11、D3D12、OpenGL、Vulkan、Metal這些后端它自己的runtime不可能為每種后端維護(hù)一套完全不同的shader加載邏輯所以它做了一個(gè)抽象層。你在bgfx工程里寫的shader本質(zhì)上是“bgfx方言”的HLSL/GLSL。源碼頂部要么寫著#include bgfx_shader.sh要么使用了$input、$output這種以美元符號(hào)開頭的預(yù)處理器指令。這些語法真正的HLSL編譯器不認(rèn)識(shí)它認(rèn)識(shí)的是bgfx附帶的那套頭文件。整個(gè)編譯鏈路大致是這樣源文件先由shaderc工具做預(yù)處理把bgfx_shader.sh里的宏展開再根據(jù)目標(biāo)平臺(tái)生成對應(yīng)的語言形態(tài)最終翻譯成目標(biāo)后端需要的字節(jié)碼。以Windows D3D11為例最終輸出的.bin文件內(nèi)部負(fù)載就是DXBC字節(jié)碼。但要注意這個(gè)bin并不等同于你用fxc.exe編譯出來的.cso或.dxbc文件bgfx在bin文件外層還包了一個(gè)自己定義的文件頭包含了版本號(hào)、校驗(yàn)信息、shader長度等字段。加載時(shí)runtime會(huì)先檢查這個(gè)文件頭確認(rèn)格式和當(dāng)前renderer匹配才會(huì)把里面的DXBC負(fù)載交給D3D。這就回答了一個(gè)新手常問的問題能不能把我在VS里右鍵編譯出來的HLSL字節(jié)碼直接拿過來用答案是不能因?yàn)閎gfx的runtime根本不認(rèn)識(shí)那種裸格式。你得經(jīng)過shaderc重新走一遍抽象層流程輸出bgfx定義的封裝格式。1.2 為什么要做這么一層抽象而不是各平臺(tái)各寫一份很多從Unity、Unreal轉(zhuǎn)過來的人會(huì)有一個(gè)直覺跨平臺(tái)shader不就是用#ifdef寫分支嗎寫個(gè)#ifdef D3D11、#ifdef VULKAN然后分別調(diào)不同語法不就行了。問題在于HLSL和GLSL的差異不只是幾個(gè)函數(shù)名而是從變量聲明、語義綁定、資源綁定位一直到矩陣運(yùn)算順序都不同??渴止?ifdef維護(hù)shader越多維護(hù)成本越高。bgfx的做法是提供一套公用的“詞匯表”把兩邊都有的概念統(tǒng)一命名vec3、vec4、mat4、texture2D、gl_Position、gl_FragColor、mul。然后bgfx_shader.sh針對不同后端把這些詞映射成真正HLSL或GLSL的寫法和內(nèi)置函數(shù)。你可以把bgfx_shader.sh當(dāng)成一本“方言詞典”。shaderc在解析源碼時(shí)會(huì)自動(dòng)根據(jù)--platform windows和-p vs_5_0/ps_5_0這類參數(shù)定義BGFX_SHADER_LANGUAGE_HLSL宏于是一份源碼在不同的編譯參數(shù)下會(huì)產(chǎn)生完全不同的實(shí)際代碼。真正做到了“源碼一份多端復(fù)用”。這在工程上的價(jià)值非常大尤其是你手里有幾十個(gè)shader的時(shí)候不必為每個(gè)平臺(tái)維護(hù)一份拷貝。1.3 平臺(tái)、編譯參數(shù)和runtime后端的對應(yīng)關(guān)系理解平臺(tái)、profile和runtime后端的關(guān)系是避開“編譯通過卻黑屏”的關(guān)鍵。shaderc的--platform參數(shù)不是最終決定輸出格式的唯一條件真正決定輸出格式的是-p后面的profile。常用對應(yīng)關(guān)系如下運(yùn)行時(shí)后端編譯參數(shù)舉例輸出內(nèi)容Direct3D11 / Direct3D12--platform windows -p vs_5_0/ps_5_0DXBC字節(jié)碼封裝在bgfx bin內(nèi)OpenGL--platform linux -p glslGLSL文本以C字符串形式存在bin負(fù)載里Vulkan--platform windows -p spirv15SPIR-V字節(jié)碼Metal--platform osx -p metalMetal后端可識(shí)別的字節(jié)碼這里最容易踩的坑是你編譯shader時(shí)一切正常但運(yùn)行時(shí)用的是另一個(gè)renderer。比如你在Windows上默認(rèn)初始化了D3D11后端卻加載了一份用-p glsl編譯的binruntime會(huì)直接拒絕使用表現(xiàn)就是物體不渲染或者控制臺(tái)出現(xiàn)backend mismatch的日志。我在實(shí)際項(xiàng)目里的習(xí)慣是明確調(diào)用bgfx::init時(shí)傳入指定的renderer類型比如bgfx::RendererType::Direct3D11然后編譯shader時(shí)嚴(yán)格按這個(gè)renderer選profile。Windows上一般用vs_5_0/ps_5_0最穩(wěn)因?yàn)镈3D11和D3D12后端都接受DXBC而且vs_5_0對硬件要求已經(jīng)不高兼容性比vs_4_0更好。2. 環(huán)境準(zhǔn)備拿到能用的shaderc2.1 兩種獲取shaderc的方式編譯bgfx shader離不開shaderc這個(gè)命令行工具。獲取方式有兩種直接使用官方預(yù)編譯的二進(jìn)制或者自己從源碼構(gòu)建。預(yù)編譯的好處是省事適合只想跑通流程的讀者版本一般也比較穩(wěn)定。但如果你修改了bgfx源碼、或者需要跟進(jìn)最新主分支的特性就必須自己編譯。自己編譯需要準(zhǔn)備三個(gè)倉庫bgfx本身依賴bx和bimg。這三個(gè)倉庫要放在同級目錄下比如libs/bgfx、libs/bx、libs/bimg。整個(gè)構(gòu)建工作如果用premake5大概是這樣cd bgfx premake5.exe --with-tools vs2022然后打開生成的Visual Studio解決方案找到Tools文件夾下的shaderc工程編譯Release版本。輸出通常在tools/bin/windows/下文件名是shaderc.exe。如果不想手動(dòng)打開VSbgfx倉庫的scripts目錄下還提供了一些現(xiàn)成腳本比如build_vs2022.bat運(yùn)行后會(huì)自動(dòng)把依賴?yán)饋聿⒕幾g工具鏈。我第一次自己構(gòu)建時(shí)就是直接用這個(gè)腳本比手敲premake命令省心不少。還有一種方式是cmake新版bgfx支持直接配置cmake -S . -B build -DBGFX_BUILD_TOOLSON cmake --build build --target shaderc --config Release兩條路都通喜歡哪個(gè)用哪個(gè)。個(gè)人建議第一次跑通流程可以走premake因?yàn)楣俜绞纠臀臋n基本都是這個(gè)姿勢。2.2 把運(yùn)行環(huán)境一次配好include路徑和d3dcompiler拿到shaderc.exe之后第一件事不是急著編譯自己的shader而是確認(rèn)它能找到bgfx的公共頭文件。編譯任何bgfx shader都需要bgfx_shader.sh這個(gè)文件的路徑?jīng)Q定了你-i參數(shù)要指向哪里。我見過有些版本它放在include/目錄有些工程示例里又直接引用src/目錄下的文件穩(wěn)妥的辦法是編譯命令里把兩個(gè)目錄都加進(jìn)include搜索路徑shaderc.exe -f input.sc -o output.bin -i C:\libs\bgfx\include -i C:\libs\bgfx\src -i C:\libs\bgfx\examples\common ...反正-i可以重復(fù)指定多給一個(gè)目錄只會(huì)有益無害。如果源碼里還include了example里的公共shader頭文件比如common.sh那就必須加上examples/common。Windows下還有第二個(gè)坑shaderc生成DXBC字節(jié)碼時(shí)運(yùn)行時(shí)需要?jiǎng)討B(tài)加載d3dcompiler_47.dll。絕大多數(shù)Windows系統(tǒng)自帶這個(gè)DLL但某些精簡版系統(tǒng)、或者CI容器里會(huì)缺失。表現(xiàn)是編譯命令一跑就報(bào)類似“failed to load D3DCompiler”的錯(cuò)誤。解決方式也簡單從安裝了DirectX SDK或者帶D3D的機(jī)器上找到d3dcompiler_47.dll放到shaderc.exe同目錄下即可。驗(yàn)證環(huán)境是否就緒最省事的方法是找bgfx官方examples里的某個(gè)shader源文件用examples自帶的那組編譯參數(shù)試跑一次。如果examples里的shader能正常編譯出bin說明你的include路徑和DLL環(huán)境都沒問題接下來才值得繼續(xù)往下折騰。3. 用HLSL寫bgfx shader時(shí)必須知道的規(guī)范3.1 bgfx_shader.sh到底替你做了什么很多人第一次打開bgfx的shader源文件會(huì)覺得自己看的是“長得像GLSL但是又有點(diǎn)HLSL影子”的奇怪代碼。比如gl_Position、gl_FragColor、texture2D這些名字在真正的HLSL里根本不存在。這些其實(shí)都是bgfx抽象層提供的“替身”。bgfx_shader.sh內(nèi)部按BGFX_SHADER_LANGUAGE_*宏劃分了好幾個(gè)分支。當(dāng)你用--platform windows -p vs_5_0編譯時(shí)shaderc會(huì)自動(dòng)定義BGFX_SHADER_LANGUAGE_HLSL于是頭文件里所有抽象符號(hào)都會(huì)被映射成HLSL的對應(yīng)物。例如vec3映射成float3texture2D(s_tex, uv)映射成s_tex.Sample(s_tex##_sampler, uv)這類寫法gl_Position映射成SV_Positiongl_FragColor映射成SV_Target0這層翻譯不是運(yùn)行時(shí)發(fā)生的而是在編譯期就已經(jīng)完成。所以你寫shader時(shí)要遵守bgfx的“方言”而不是想當(dāng)然地直接寫原生HLSL關(guān)鍵字。比如你在shader里寫了一個(gè)return float4(1,0,0,1);當(dāng)像素輸出這在純HLSL里合法但在bgfx抽象層里不會(huì)識(shí)別成最終輸出正確姿勢是給gl_FragColor賦值。3.2 $input/$output和varying.def.sc的聯(lián)動(dòng)關(guān)系bgfx的shader有一個(gè)獨(dú)立的“變量定義文件”通常叫varying.def.sc。它的作用相當(dāng)于一份跨平臺(tái)協(xié)議定義頂點(diǎn)shader的輸入屬性a_前綴、頂點(diǎn)shader輸出到像素shader的varyingv_前綴并規(guī)定語義綁定。一個(gè)典型的varying.def.sc長這樣vec3 a_position : POSITION; vec4 a_color0 : COLOR0; vec2 v_texcoord0 : TEXCOORD0;而shader源文件頂部會(huì)有對應(yīng)的聲明$input a_position, a_color0 $output v_texcoord0 #include bgfx_shader.sh$input和$output是shaderc的預(yù)處理器指令。$input a_position表示這個(gè)shader會(huì)使用頂點(diǎn)屬性a_position$output v_texcoord0表示頂點(diǎn)shader要輸出一個(gè)名為v_texcoord0的varying給像素shader。shaderc會(huì)把這兩行指令和varying.def.sc里的定義自動(dòng)拼成合適的結(jié)構(gòu)體代碼再參與后續(xù)編譯。如果varying.def.sc里沒定義某個(gè)v_texcoord1但shader里寫了$output v_texcoord1編譯會(huì)直接報(bào)錯(cuò)。反過來定義了卻沒用到一般不會(huì)報(bào)錯(cuò)但會(huì)有冗余。這就是為什么在調(diào)shader時(shí)報(bào)錯(cuò)信息里會(huì)出現(xiàn)v_texcoord0、a_position這些名字因?yàn)檫@些名字是跨C頂點(diǎn)布局和shader代碼之間的“合同”。3.3 uniform和采樣器的聲明方式bgfx的uniform聲明和原生HLSL也不一樣。在bgfx shader里你會(huì)看到這樣的代碼uniform vec4 u_color; uniform mat4 u_mvp; SAMPLER2D(s_texColor, 0);uniform vec4 u_color并不是真的向D3D暴露一個(gè)cbuffer成員而是bgfx抽象層的寫法。編譯成HLSL后端時(shí)shaderc會(huì)把它們打包進(jìn)一個(gè)名為uniform的cbuffer里并且給每個(gè)變量分配register。SAMPLER2D(s_texColor, 0)的第二個(gè)參數(shù)0是bind point也就是紋理的注冊槽位。這帶來一個(gè)非常容易踩的坑C端createUniform傳的字符串名字必須和shader里的變量名完全一致大小寫都不能錯(cuò)。bgfx運(yùn)行時(shí)是靠名字去查找shader里的uniform而不是靠register索引。所以shader里寫u_colorC端就要bgfx::createUniform(u_color, ...)寫成U_COLOR或者ucolor都會(huì)導(dǎo)致uniform綁定不上shader在驅(qū)動(dòng)里用的是默認(rèn)值0最終渲染結(jié)果就是黑的或者全透明的。采樣器也是這樣SAMPLER2D(s_texColor, 0)對應(yīng)C端bgfx::createUniform(s_texColor, bgfx::UniformType::Sampler)。名字對不上紋理采樣結(jié)果就是全0。3.4 HLSL語法在bgfx抽象層里的幾個(gè)易錯(cuò)點(diǎn)第一個(gè)易錯(cuò)點(diǎn)是矩陣乘法。HLSL的mul(a, b)和GLSL的a * b的運(yùn)算順序習(xí)慣不同。bgfx在bgfx_shader.sh里統(tǒng)一提供了mul宏你在shader里應(yīng)該一直用mul(u_mvp, vec4(pos, 1.0))而不是自己用*符號(hào)去乘矩陣和向量。否則同一份shader在D3D后端正常切到GL后端就出現(xiàn)矩陣錯(cuò)亂物體全部變形。第二個(gè)易錯(cuò)點(diǎn)是函數(shù)名差異。GLSL的fract對應(yīng)HLSL的fracGLSL的texture對應(yīng)HLSL的Texture2D.Sample。bgfx抽象層統(tǒng)一采用fract、texture2D這類寫法。你如果在shader里隨手寫了frac用D3D后端編譯沒問題但換到GL后端時(shí)bgfx_shader.sh找不到這個(gè)宏直接報(bào)編譯錯(cuò)誤。第三個(gè)易錯(cuò)點(diǎn)是充分理解gl_FragColor的抽象。寫顏色輸出時(shí)不要試圖在同一個(gè)shader里既用gl_FragColor又用HLSL的SV_Target語義。尤其在fragment shader里老老實(shí)實(shí)用gl_FragColor vec4(...)這一套讓抽象層去處理。這東西有點(diǎn)像程序員寫跨平臺(tái)UI代碼不要試圖繞開框架層去直接操作底層窗口句柄框架會(huì)替你處理差異前提是你得遵循它的規(guī)則。4. 完整實(shí)操從寫代碼到運(yùn)行全程走一遍4.1 準(zhǔn)備一個(gè)編譯用的shader工程目錄我建議從一開始就建一個(gè)固定目錄結(jié)構(gòu)方便后續(xù)自動(dòng)化構(gòu)建。我自己的習(xí)慣是這樣的myproject/ shaders/ varying.def.sc vs_simple.sc fs_simple.sc build_shaders.bat bin/build_shaders.bat用來批量執(zhí)行編譯命令bin/專門存生成的bin文件?,F(xiàn)在寫一個(gè)最簡單的帶紋理的shader。varying.def.scvec3 a_position : POSITION; vec2 v_texcoord0 : TEXCOORD0;頂點(diǎn)shadervs_simple.sc$input a_position $output v_texcoord0 #include bgfx_shader.sh uniform mat4 u_mvp; SAMPLER2D(s_texColor, 0); void main() { gl_Position mul(u_mvp, vec4(a_position, 1.0)); v_texcoord0 a_position.xy * 0.5 0.5; }這里我把頂點(diǎn)坐標(biāo)簡單映射到UV坐標(biāo)方便預(yù)覽。像素shaderfs_simple.sc$input v_texcoord0 #include bgfx_shader.sh uniform vec4 u_color; SAMPLER2D(s_texColor, 0); void main() { vec4 tex texture2D(s_texColor, v_texcoord0); gl_FragColor tex * u_color; }注意fragment shader頂部只需要聲明$input v_texcoord0不需要$output因?yàn)閎gfx固定用gl_FragColor作為輸出變量已經(jīng)在bgfx_shader.sh里定義好了。4.2 用shaderc編譯出bin的完整命令拆解編譯頂點(diǎn)shader的命令C:\libs\bgfx\tools\bin\windows\shaderc.exe -f vs_simple.sc -o ../bin/vs_simple.bin -i C:\libs\bgfx\include -i C:\libs\bgfx\src -i . --type vertex --platform windows -p vs_5_0 --varyingdef varying.def.sc --verbose編譯像素shader的命令C:\libs\bgfx\tools\bin\windows\shaderc.exe -f fs_simple.sc -o ../bin/fs_simple.bin -i C:\libs\bgfx\include -i C:\libs\bgfx\src -i . --type fragment --platform windows -p ps_5_0 --varyingdef varying.def.sc --verbose逐參數(shù)過一遍-f指定輸入shader源文件。-o指定輸出bin文件路徑。-i指定include目錄可以重復(fù)寫多個(gè)。前面提到的bgfx_shader.sh能不能找到就靠這個(gè)參數(shù)。--type告訴shaderc這是vertex還是fragment。一個(gè)常見的低級錯(cuò)誤是頂點(diǎn)shader用了--type fragment或者fragment shader用了vs_5_0的profile。頂點(diǎn)shader用vs_開頭像素shader用ps_開頭。--platform windows指定目標(biāo)平臺(tái)。這個(gè)參數(shù)會(huì)影響shaderc自動(dòng)定義的平臺(tái)宏。-p vs_5_0 / ps_5_0是profile。Windows D3D11/12后端推薦用vs_5_0和ps_5_0。--varyingdef指到varying.def.sc的路徑。shaderc靠它來解析$input/$output指令。--verbose打開詳細(xì)輸出能看到shaderc實(shí)際怎么處理宏分支排錯(cuò)很好用。把這兩條命令寫進(jìn)build_shaders.bat以后每次改shader雙擊運(yùn)行一下就能批量生成bin文件。4.3 在C運(yùn)行時(shí)加載和使用編譯好的shaderC端的加載流程分三步。第一步讀文件第二步創(chuàng)建bgfx的ShaderHandle第三步把頂點(diǎn)和像素shader綁定成ProgramHandle。讀文件的方式很多核心是把二進(jìn)制內(nèi)容拷貝進(jìn)bgfx::Memory結(jié)構(gòu)。最簡單的手寫讀取const bgfx::Memory* loadShader(const char* path) { FILE* f fopen(path, rb); if (!f) return nullptr; fseek(f, 0, SEEK_END); long sz ftell(f); fseek(f, 0, SEEK_SET); const bgfx::Memory* mem bgfx::alloc((uint32_t)sz); fread(mem-data, 1, sz, f); fclose(f); return mem; }然后創(chuàng)建programbgfx::ShaderHandle vs bgfx::createShader(loadShader(bin/vs_simple.bin)); bgfx::ShaderHandle fs bgfx::createShader(loadShader(bin/fs_simple.bin)); if (!bgfx::isValid(vs) || !bgfx::isValid(fs)) { // 處理shader創(chuàng)建失敗比如renderer不匹配、bin文件損壞 } bgfx::ProgramHandle program bgfx::createProgram(vs, fs, true);createProgram的第三個(gè)參數(shù)傳true表示program創(chuàng)建成功后會(huì)銷毀兩個(gè)shader handle不需要再手動(dòng)調(diào)bgfx::destroy。這個(gè)函數(shù)是bgfx提供的重載版本實(shí)際項(xiàng)目里非常常用。如果你不想把bin文件放在磁盤上想直接打進(jìn)可執(zhí)行文件里可以先用bgfx自帶的bin2c工具把bin轉(zhuǎn)成C數(shù)組然后在代碼里用bgfx::makeRef創(chuàng)建Memory對象extern const uint8_t vs_simple_bin[]; bgfx::ShaderHandle vs bgfx::createShader( bgfx::makeRef(vs_simple_bin, sizeof(vs_simple_bin)) );這種方式對移動(dòng)端和發(fā)布工程很友好不用考慮工作目錄和資源路徑問題。4.4 把shader編譯嵌進(jìn)自動(dòng)構(gòu)建流程手動(dòng)雙擊build腳本的方式只適合前期調(diào)試項(xiàng)目一旦上了規(guī)模shader幾十個(gè)甚至上百個(gè)就必須把編譯流程嵌進(jìn)自動(dòng)構(gòu)建里。最簡單的方案是Visual Studio的pre-build event。在工程設(shè)置里添加命令call $(ProjectDir)shaders\build_shaders.bat也可以走CMake用add_custom_command精確控制依賴關(guān)系add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/bin/vs_simple.bin COMMAND ${BGFS_SHADERC} -f vs_simple.sc -o ${CMAKE_CURRENT_BINARY_DIR}/bin/vs_simple.bin -i ${BGFS_ROOT}/include -i ${BGFS_ROOT}/src -i ${CMAKE_CURRENT_SOURCE_DIR}/shaders --type vertex --platform windows -p vs_5_0 --varyingdef varying.def.sc DEPENDS vs_simple.sc varying.def.sc WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/shaders )這樣shader源文件一改動(dòng)重新編譯工程時(shí)shader的bin會(huì)自動(dòng)更新。能對構(gòu)建過程做增量管理是工程化的關(guān)鍵一步比每次手動(dòng)跑命令靠譜太多。5. 編譯報(bào)錯(cuò)與渲染黑屏常見問題排查記錄5.1 高頻編譯ErrorMessage對照表shaderc的報(bào)錯(cuò)信息本身比較直白但很多錯(cuò)誤背后的原因首次接觸時(shí)容易抓瞎。我把實(shí)際中碰到的高頻報(bào)錯(cuò)整理成一張表方便對照排查報(bào)錯(cuò)特征常見原因解決方案fatal error: cant open file bgfx_shader.sh-i參數(shù)沒包含bgfx頭文件目錄把bgfx/include和bgfx/src加進(jìn)include搜索路徑unknown type vec4 / float4x4源碼文件忘了include bgfx_shader.sh或者宏分支沒生效檢查源碼開頭有沒有#include bgfx_shader.sh確認(rèn)--platform和-p參數(shù)匹配varying variable v_texcoord0 is not definedvarying.def.sc里沒有定義這個(gè)v_變量在varying.def.sc里補(bǔ)全vec2 v_texcoord0 : TEXCOORD0;Invalid profile vs_5_0 for fragment像素shader用了頂點(diǎn)shader的profilefragment shader要用ps_5_0vertex再用vs_5_0Failed to load d3dcompiler_47.dll系統(tǒng)缺少D3D編譯器DLL手動(dòng)把d3dcompiler_47.dll放到shaderc.exe同目錄DXBC compile failed源碼在翻譯成HLSL后語法不合法加--preprocess看預(yù)處理后的代碼定位具體錯(cuò)誤行5.2 編譯通過但畫面不對問題多半出在varying和uniform編譯通過只代表語法沒問題不代表渲染結(jié)果正確。我調(diào)了這么久bgfx遇到最多的一類問題是“shader編譯成功、Program創(chuàng)建成功、物體就是畫不出來”。第一種典型情況是C頂點(diǎn)布局和varying.def.sc不一致。比如你C端頂點(diǎn)數(shù)據(jù)只有位置和顏色但varying.def.sc里聲明了a_texcoord0shader里也用了$input a_texcoord0那么頂點(diǎn)數(shù)據(jù)會(huì)被錯(cuò)誤解釋三角形可能直接消失或者變成奇怪形狀。排查方法是用RenderDoc截一幀看vertex shader輸入的頂點(diǎn)位置數(shù)據(jù)是否合理。如果數(shù)據(jù)位置全在零點(diǎn)附近基本就是布局錯(cuò)位。第二種典型情況是uniform名字不一致。shader里叫u_colorC端創(chuàng)建uniform時(shí)打成u_Color運(yùn)行時(shí)不會(huì)報(bào)錯(cuò)但uniform全部上了默認(rèn)0。尤其當(dāng)你的顏色是黑色或者alpha為0時(shí)整個(gè)物體直接不可見。排查時(shí)可以給uniform設(shè)一個(gè)明顯的非零初值如果畫面出現(xiàn)表現(xiàn)變化說明這個(gè)名字對齊了。第三種典型情況是矩陣變換問題。在Windows D3D后端下mul(u_mvp, vec4(pos,1.0))如果寫反了渲染結(jié)果通常不是黑屏而是物體位置錯(cuò)亂。這個(gè)問題和DX與GL的坐標(biāo)系習(xí)慣有關(guān)嚴(yán)重依賴你C端MVP矩陣的生成方式。建議在shader里把所有矩陣乘法統(tǒng)一寫成bgfx的mul宏不要在部分shader里用*符號(hào)。5.3 用--preprocess和RenderDoc一層層定位問題遇到shader編譯報(bào)錯(cuò)第一步不是盯著錯(cuò)誤信息猜而是加--preprocess參數(shù)讓shaderc輸出預(yù)處理后的展開代碼shaderc.exe -f vs_simple.sc -o preprocessed.hlsl -i ... --type vertex --platform windows -p vs_5_0 --varyingdef varying.def.sc --preprocess打開preprocessed.hlsl你會(huì)看到bgfx_shader.sh的宏分支到底把你寫的源碼翻譯成了什么。如果某個(gè)變量名變成了未定義符號(hào)或者某個(gè)函數(shù)展開后明顯不對問題一眼就出來了。這個(gè)技巧在排查“為什么D3D能過GL不能過”這種跨平臺(tái)問題時(shí)特別有用。如果編譯、加載全都沒問題但渲染結(jié)果不對下一步就是上RenderDoc。截幀后重點(diǎn)看三件事Program是不是有效、VS輸出的頂點(diǎn)的位置是否符合預(yù)期、綁定的紋理和uniform是不是有內(nèi)容。一般來說RenderDoc里如果某個(gè)繪制調(diào)用的VS/FS綁定失敗會(huì)直接高亮報(bào)錯(cuò)比盲猜Shader問題要快得多。另外bgfx允許注冊一個(gè)回調(diào)接口把驅(qū)動(dòng)層的日志接出來。啟動(dòng)時(shí)設(shè)置bgfx::setPlatformData時(shí)可以順手掛一個(gè)回調(diào)把traceV里收到的信息打到自己的日志系統(tǒng)。驅(qū)動(dòng)編譯shader失敗、資源綁定出問題往往在你自己的控制臺(tái)還一片安靜的時(shí)候驅(qū)動(dòng)已經(jīng)吐了一堆錯(cuò)誤。養(yǎng)成看驅(qū)動(dòng)日志的習(xí)慣排查效率能提高一個(gè)檔次。6. 從Windows走向全平臺(tái)的一點(diǎn)經(jīng)驗(yàn)6.1 換到其他平臺(tái)時(shí)只要改兩個(gè)參數(shù)理解了前面的編譯流水線你會(huì)發(fā)現(xiàn)一份源碼要輸出到其他平臺(tái)其實(shí)改動(dòng)量很小。編譯命令里主要改--platform和-pshader源碼本身盡量保持平臺(tái)無關(guān)。比如目標(biāo)平臺(tái)編譯參數(shù)Android OpenGL ES--platform android -p essl桌面Linux OpenGL--platform linux -p glslWindows Vulkan--platform windows -p spirv15macOS/iOS Metal--platform osx -p metal這里有個(gè)前提就是你的shader代碼沒有自己偷偷寫原生平臺(tái)API。如果你在shader里用#ifdef BGFX_SHADER_LANGUAGE_HLSL分支出了一大段原生HLSL代碼換到GL后端時(shí)這段分支不會(huì)走但你能不能保證GL分支的代碼同樣正確所以我的建議是除非遇到極其特殊的平臺(tái)能力差異否則盡量別寫平臺(tái)分支讓bgfx的抽象層去處理。6.2 跨平臺(tái)shader代碼的素養(yǎng)真正跨平臺(tái)的shader寫起來有章法可循。變量命名保持一致uniform統(tǒng)一用u_前綴采樣器用s_前綴varying用v_前綴頂點(diǎn)屬性用a_前綴。這不僅是bgfx社區(qū)的慣例也方便你跨shader文件復(fù)用代碼。矩陣運(yùn)算統(tǒng)一走mul宏。顏色輸出固定用gl_FragColor。紋理采樣統(tǒng)一用texture2D。這些“統(tǒng)一”會(huì)讓你在換平臺(tái)時(shí)幾乎不用改代碼。我見過最省心的項(xiàng)目CI腳本里對每個(gè)平臺(tái)跑一遍shaderc命令輸出的bin文件直接按平臺(tái)路徑上傳源碼里完全沒有#ifdef跨平臺(tái)切換就是換一條編譯命令的事。說實(shí)話我用bgfx這幾年最耗時(shí)的shader問題往往不是“編譯不過”而是“編譯過了渲染不對”。所以給剛上手的朋友一個(gè)忠告先把varying.def.sc、頂點(diǎn)布局、uniform命名這三樣焊死在規(guī)范里再談性能優(yōu)化。有了這套底子Windows和Android之間切換shader基本就是改一條命令行參數(shù)的事。希望這篇隨筆能幫你少踩幾個(gè)坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99热最新| 国产AV无码AV| 91在线|亚| 欧洲亚洲综合| 伊人黄色视频免费观看| 乱色老一区二区三区的观看方式 | 2020中文字幕| 成 人 A V免费视频在线观看| 亚洲中文一区二区三区视频| 人人扣人人操| 97伪v| 综合熟女| 激情专区综合| 330dv亚洲成年视频网| 60秒免费小视频| 欧美天天弄| 无码国产精品96久久久久孕妇| 日本人妻A片成人免费看片| 午夜精品久久久久久久久久蜜桃 | 国产成人亚洲精品无码古代早漏男| 大香蕉黄色一区| 97日视频| 精品高清一区二区三区三州| 97超碰无码网| 女人综合网| 亚洲最大的综合性av| 亚洲熟妇丝袜在线观看| 狠狠操使劲操| 熟女中出视频| 好吊色青靑草| 欧亚在线视频| 日本三级精品| 中美日韩毛片| 手机在线免费看的av| 美女露胸露屁股| 丝袜 中出 制服 人妻 美腿 中文字幕| 狠狠色伊人亚洲综合网站色| 爱欲AV| 中文字幕日韩专区精品系列| 久久久久久久 九九九九九九九 | 久久久久ab| 亚洲高清无毛一区二区| 午夜福利在线合集| av凤凰久久久| 激情综合网激情综合| 欧美中文字幕男人天堂久久精品| 天天92av| 中文字幕视频2区| 天天躁日日躁AAAAXXXX国产| 天天天干977| 久99热| 亚洲视频精选| 探花在线免费观看视频国产一区| 久久男女激情视频网站| 91蜜桃传媒精品久久久一区二区| 国产女人91精品嗷嗷嗷嗷| 国产1727欧美| 丁香六月激情| av一区二区三区四区| 免费网色网站| www.av在线观看| 啊啊啊啊啊在线| 欧洲亚洲天堂精品 | 亚洲人综合19| 欧美国产有色电影| AV 少妇 人妻 偷拍| 天天天肏屄肏屄肏屄欧美欧美| 日本天天操| 亚洲av综合色| 中文字幕一区二区三区字幕| 久久黄黄黄| 夜夜嗨一区二区| 国产精品无码久久久久2028| 91视频伊人| 欧美日韩小说| 91网站在线播放| 91在线欧色| 在线看片国产精品每日更新| 久久久久久国产无码精品| TS人妖另类精品视频系列 | 国产精品久久久三级无码| 91亚洲黄色网| 少妇色综合| 爱欲AV| 婷婷情色综合网| 亚洲色欲天天人妻无码系列专区| 日本性爱少妇| 免费观看的黄色的网站| 95自拍视频在线观看| 97亚洲精品| 99热销国产这里有精品| 欧美激情 一区| 日韩少妇在线视频| 天堂亚洲精品| 亚洲日韩天堂| 国产一区二区在线播放量| 激情一区二区| 97在线免费| 高清孕妇孕交 交| 97碰碰色| 97超碰香蕉| 一区二区三区麻豆| 男人的天堂2019| 麻豆久久精品亚洲精品88| 后入国产| 精品少妇人妻av久久免费| 久久这里只精品免费福利| 亚洲AV免费在线观看| 亚洲中文字幕乱码无码一区二区| 熟女中出视频| 啊啊啊啊啊啊啊网址在线观看| 欧美激情亚洲情色| 日韩欧美大片免费高清啪啪| 日本免费专区| 丁香五月综合| 精品97久久综合| 久久天堂网| 久久久久九九九| 日韩有码 一区二区三区| 免费看黄片现成| 5278欧美一区二区三区| 人妻天天爽夜夜爽精品2| 无码男人天堂| 国产91丝袜 在线播放| 一区二区三区国产在线播放| 国产强奸乱伦第1页| 欧美亚洲高清不卡| 91丨人妻丨国产丨丝袜| 亚洲制服欧美另类内射| 亚洲一二三精品久久网| 中文字幕视频免费| 久久久久久久久999| 91一区二区三区蜜桃| 国产精品久久久久久久黄无码 | 欧美制服网站美腿丝袜| 国产传媒日本欧美专区| 国内精品久9| av爱爱爱| 99丝袜福利在线播放| 欧洲乱码一区二区| 欧美亚洲图片| 国产浮力影院第1页| 国产亚洲色婷婷久久99精品91葵花宝典| 欧美一级色| 97一区二区三区视频| 人妻精品一区一区三区蜜桃91| 久久久18| 亚洲av热热色| 日本精品五区| 久久久久久亚洲精品不卡人乳| caopeng97人妻| 综合97亚洲| 九九九精品成人免费视频小说| 91丨九色丨东北熟女| 校园春色欧美| 风流老熟女一区二区三区l| 最新AVzaixian| 久区视频| 久久精彩视频| 伊人91| 桃花色涩综合影院| 在线洲亚线| 粉嫩av在线一区二区| 色大香蕉97N| 日韩欧无码一区二区三区免费不卡 | 日本福利二区视频| 亚州黄站| 日韩啪啪啪啪啪| 少好三P| 狠狠操夜夜| 久久超碰98| 亚洲激情综合另类男同| 婷婷香网站| 久久精品日韩| 欧美后入式| 99re6国产精品99re在线| 五月丁香啪啪网| 九一综合网| 日韩在线欧美精品一区二区| 五月天伊人| 欧美成年人性爱视频免费观看| 国产精品成人无码av| 小电影欧美91| 日韩欧美丝袜诱惑| 91色久| 97精| 97频视在线| 密乳AV免费观看| 伊人9| 色香阁在线| 搡老女人911熟妇老熟女| 中文字幕乱码人妻一区二区三区,99精品| 亚洲高清视频在线免费观看| 亚洲天天艹| 国产日韩欧美操逼视频 | 在线观看亚洲专区| 一区在线精品中文字幕| 加勒比aⅴ| 欧美老妇女内射网址| 伊人五月天激情| 天天看片青娱乐| 桃色人妻在线视频| 日韩国语字幕| 婷婷五月丁香五月| 亚洲色久| 久久香蕉国产线看观看猫咪av| 超碰色综合| 美欧老女人97| 九九毛片这里只有精品| 免费观看的av| www超碰| 人妻 丝袜美腿 中文字幕| 青娱乐休闲视频在线观看| 激情四射婷婷六月天| 日韩超碰精品综合| 爆乳免费黄网站| 97资源站日韩| 强奸乱亚洲| 黄页视频网站野外| 五月婷婷大香蕉| 99热免费| 成人小电影网站tex| 少好三P| 四虎影视 亚洲无码| 夜夜爽夜夜高潮夜夜爽| 欧美夜夜草视频| 国产精品久久妻无码网站| 亚洲国产精品无码AV久久久| 国产精品呦一区二区三区| 国产一进一出视频网站| 人人射人人操人人摸| 五月婷婷激情综合| 亚洲一二三| 麻豆天美国美国产AV| 久久久无码国精品无码三区三区| 亚洲色图激情小说| 国产激情在线| 久草精品视频| 91天天爽| 少妇一区二区三区高速| 午夜精品99久久久久传媒| 77国产精品| 欧美72网页| 超碰色大香蕉| 欧美日动态视频| 色哟哟AV| 国产精品一区二区亚洲人成毛片| 五月丁香综合| 偷拍导航视频网站| 免费a在线播放v| 2020中文字幕| 高清不卡 中文 人妻| 在线免费观看高清无码视频| 狠狠色综合网| 亚洲精品人伦一区二区| 午夜理论片在线观看免费| 欧美精品宗合| 屁屁影院一区二区三区国产| 国产久久一区二区三区野外在线| 91无码精品| 俺去俺来也在线www| 欧美日韩222| 9 1果冻精品视频| 肉嘟嘟www视频在线观看高清| 第四色亚洲色图| 亚洲欧美日韩激情不卡| 亚码激情| 九九九九9999| 狠狠中文字幕| 精品九九九九| 中文字幕丝袜美腿| 好吊色综合| 色色五月天婷婷| 欲香欲色综合天天伊人| 加勒比大香蕉视频在线| 91精品人妻一区二区三区蜜桃| 日本亚洲熟女视频| 国内一级精品| 欧美亚洲综合色| 91色狼| 青草地一本线一区二区三区| 乱伦系列一区二区| 亚洲清纯唯美| 99ri精品| 97综合久久| 蜜桃久久综合视频| 午夜亚洲国产理论秋霞| 亚洲极品| 日韩精品国产精品五码一区二区| 亚洲图片欧美色| 亚洲欧美天| 另类图片综合| 色婷婷婷五月天激情四射| 中文字幕av亚洲精品| 九九英色视频| 中日韩久久久| 日本免费二区三区| 中文字幕一二三区| 首页中文字幕中文字幕免费| 好吊色综合| 欧美亚综合色图| 少妇干B| 大香蕉草草| 淫妻综合网| 免费超碰97在线观看| 欧美日韩不卡传媒| 超碰97资源大奶| 中文字幕123| 欧美高清在线| 91色综合激情| 91精品黄在线观看| 中国少妇XXXX做受| 酒色综合网| 日日摸日日碰| 麻豆黄四叶草网站| 亚洲精品91| 九九久久一区二区三区| 大香蕉强奸乱伦| 91精品国产91久久青草| 青青操日韩| 少妇与黑人高潮在线| 欧美黄色大香蕉一区二区| 久久性爱视频免费看| 风间由美日韩欧美久久| 欧美黑人168页欧美黑人167| 超碰97首页| 久久婷婷一区二| 日美免费黄片| 少妇熟女视频一区二区三区| 国产性爱欧美性爱在线| 久久亚洲天天做| 久久熟女嫩草成人片免费| 东北老熟女| 色情综合网| 亚洲欧美日韩免费电影| 久久AV无码AV| av黄图片在线观看| 性高潮久久久| 极品出轨视频网站| 91精品久久久久| 精品玖九九久| 九七色图| 成人精品无码| 中文字幕天堂在线| 免费无码国产精品v片在线观看| 精品久9| 伊人九九| nuu12国产麻豆精品| 国产人妻精品一区二区三区秋霞 | 婷婷av在线中文字幕| 天天爽夜夜爽夜夜爽精| 岛国毛片手机在线观看| 大香蕉九九| 狠狠穞A片一區二區三區| 久久怡红院| 嫩草影院在线观看精品| 高清国产av无码| 日韩国产中文字幕| 91麻豆va国产精品| 色狠狠综合噜一二三区| 风骚少妇视频中文字幕| 美女上床网站| 91美女视频在线观看| 日本操逼视频免费| 国产精品久久久久中文字幕| 玖玖综合.com| 九九九九一级| 久久免费9| 都市久久精品激情亚洲| 婷婷天堂站| 精品大久久| 蜜臀亚洲综合一二三四区| 天天影视网色欲色香| 欧美日韩1234| gogogo免费高清看中国国语| 久久婷婷亚洲| 啊啊啊啊啊好大好舒服想要| 97伊人超碰| 亚洲成人性爱网站在线播放| 五月天色五月| 欧美午夜视频| 加勒比在线视频| 91搞逼视频| 成年人性爱日韩| 偷拍欧美综合| 97久久免费| 欧洲一区二区| 亚洲综合另类小说色区亚洲成av人片在www| 无套内射性感少妇视频| 91挑色欧美| 老妇女91| 亚洲精品国产拍免费91在线| 美女91在线| 国产二区视频在线观看电影| 国产性感骚丝袜在线| 午夜福利合集| 在线观看亚洲专区| 精品无码人妻一区二区免费蜜桃| 国产女同在线观看视频| 婷婷久久网| 插B在线观看| 香蕉热人人精品| 人妻在线中出视频| 欧美色图片| 亚洲熟妇极品| 女优大全 - 91n| 99久久婷婷| 91nbbbbbb| 一二三啪啪专区| 婷婷综合在线| 国产97av| 日本有码影片下载 | 女一区二区| 韩国免费播放一级毛片| 色好看av| 搞中出久久| 欧美情色亚洲| 国产女s强制榨精视频| 91麻豆天美国产欧美日| 麻豆久久一区二区三区| 亚洲国产日韩欧美熟妇在线| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 人妻乱仑一区二区三区| 精品妇操一区二区三区| 日本免费一级AAA大片器 | av日韩中文字幕| 91丨九色丨大屁股| 国产农村妇女毛片精品久久| 97视频在线免费看| 秋霞操逼片| 女人的天堂大香蕉网| 国产女人操逼视频| 天天操人人操骚逼网站| 国产视频一区二区在线| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 免费的av网| 特色a在线上| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产精品99久久久www| 91天天综合日韩欧美| 中文字幕视频2区| 日韩亚洲国产视频| 夜夜爽夜夜爽| 视频黄站| 99999无码| 亚洲AV无码黄色强奸| 青草精品视频一日本久久久久网站| http://qxhbdz.com| 97色涩| 中文字幕一区二区免费在线| 大香蕉草草| 9热9热综合网| 婷婷啪啪| 黄片免费视频2019| 亚洲激情视频| 国产精品一二三| 国产精品网站免费| 欧美性爱97超碰| 97任你吞精| 老子午夜伦不卡影院| 亚洲一区在线观看欧洲| 亚洲精品国产精品乱码不卡| 亚洲精品 大香蕉| 97在线观看免费| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 午夜福利区| av大香蕉| 99久久精品无码一区二区| 久久久久久国产成人| 亚洲丝袜二区在线| 久久久9 9 9精品| 吉田爱美AV在线| 亚洲日韩AV视色| 2019久久久久久久久福利| 日本一级特级毛片视频| 精品少妇一区二区三区| 亚洲综合大片| 中出在线视频| 老熟女综合网| 91制服丝袜| 伊人嫩草| 东京热91| 男人的天堂VA| 夜夜嗨一区二区三区直播内容| 欧美男人的天堂| 欧美亚洲清纯| 亚洲一区二区av| 日本一线产区和二线产区伦理片| 青青草原av| 精品人妻15区| 中文字幕乱亚洲美女精品一区| 人人爽夜夜玩视频| 18禁久极品美女久久哦哟呀!| 国产成自自拍在线观看| 色麻豆AV| 天天综合~91| 国产一区在线看| 国产午夜精品在线观看| 99热在线观看| 午夜福利无毒不卡| 亚洲少妇色| 国产九九九九九九九九| 太久视频| 色玖玖| 台湾肥佬网一区二区三区| 国产精品乱人伊人网| 欧美A√综合网 | 国产原创自拍| 亚洲男人天堂网久久| 一区麻豆 高清中文字幕| 欧美男女午夜啪啪| 色在线69堂| 亚洲在线a| 嫩呦国产一区二区三区AV| 国产精品探花在线| 成年女人18级毛片毛片免费观看| 国产不卡精品91| 欧美视频激情久久久久久| a片亚洲一本通视频| 日韩九九九| 富女玩鸭子一级毛片| 久久无码电影| 人妻在线中出视频| 东京太热男人的天堂久久久| 亚洲AV无码秘 蜜桃臀国精产品| 青青伊人这里只有精品| 亚州色交| 久久禁| 性欧美另类高清| 极品久久久久久久久久久久久久| 91高潮| 亚洲综合中文字幕有码| 青青欧洲黑| 91国产大片| 97爱b| 欧美97在线欧| 亚洲成av人片色午夜乱码| 亚州熟妇精品| 免费?级毛片无码?∨蜜芽试看| 一块操欧美| 国产欧美在线观看免费观看| 午夜视频久久久久一区| 亚洲aV性爱| 香蕉色网| 成人八戒网站| 亚洲自拍欧美色综合| 综合国产影视三级| 色婷婷丁香五月| 亚洲视频精选| www.色综合| 欧美一区二区三熟女剧情| 黄人人操人人操| 韩国女主播青草福利视频| 欧美色图20p| 999久久久精品国产| 60秒不遮不挡| 男人天堂2012| 日韩成年人性爱视频| 性色avv| 久久婷婷电影网| 麻豆AV一区二区| 操逼无码操逼| 国产精品。| 激情五月天插| 四虎精品一区| 中日高清无码操逼视频| 超碰色美女| 亚州色交| 欧美美女后入| 91干熟女| 超碰久草| 精品少妇一区二区三区免费观看| 新版天堂中文资源8在线| 欧美色图成人网一区二区| 日本视频一区二区三区| 91色婷婷综合久久中文字幕二区| 亚洲。日韩。欧美| 美国人人操人人操| 久久αⅴ| 嗯嗯啊啊好疼| 香蕉婷婷| 国产午夜福利专区综合| 日夜尻逼网| 操逼操操操91| 岛国免费视频在线| 97精品一区| 白丝AV网站| 亚洲av综合色区无码一| 久久精品店| 亚洲人在线| 国产精品久久久无码aV去| 日韩中文字幕2020| 九九热精品视频在线观看| 中文字幕三四区| 日韩人人精品| 青青草成人视频在线观看二区| 可以免费观看的AV| 亚洲 日本 国产 综合| 超碰是碰在线观看| 久久久熟妇熟女国产| 久久激情视频| 人人操人人干xxx| 亚洲熟女诱惑| 九九九九九九综合| 97久久天天综合色天天综合色电影| 97国产色综合| 狠狠色色| 国产精品视频精品一二| 蜜桃视频成a人v在线| 日韩免费a级毛片无码a∨| 亚洲欧美97√| 天天性射网| 伊人 俄罗斯 a v| 一区麻豆 高清中文字幕| 日韩高潮一区| 日韩人妻少妇 一区二区三区| 亚洲色图欧美色图日韩色图| 欧美精品成人一区二区在线观看 | 国产精品。| 久操 高清| 天天日少妇逼AV| 婷婷五月天激情网| 探花激情视频| 天堂无码精品国产久| av天堂影视中文在字幕在线中文| 精品一二三区久久AAA片| 在线免费观看日韩一区| 天天色黄色影院天天操| 色臀AV| 东京热毛片177b2viP| 麻豆色约约| 日韩丨制服丨中文|在线| 学生妹天天看| 亚洲欧美变态| 欧洲站一级二级三级h| 超硑97精品| 嫩草伊人久久精品| 日本东京热大香蕉a片| 日韩三级天堂在线观看| 激情视频网址| 亚洲国产欧美日韩人妻日中文| 丝袜性亚洲| 综合网欧美在线| 青苹果影院男人的天堂| 91n美女视频| 91在线免费观看处女| 蜜桃精品视频一区| 精品日日人妻| 久久久久亚洲熟妇熟女| 日韩黄色电影网站| 欧美最婬乱婬爆婬性视频 | 青草一区二区| 岛国A V在线免费看| 可以免费观看的日韩av毛片| 黄色片大香蕉| 欧美黑人与女人91~| 久草久日| 国产一线二线三线av| 亚欧高清| 国产精品视频一区二区三区八戒| 五月色综合| 欧美一级专区免费大片| 一区e区三| 无码高清操逼网址| 国产精品自在自拍视频| AV电影在线播放| 97色诱| 亚洲91射| 国产激情在线| 操b在线观看| 青青草天天亲夜夜操网| 五月丁香影院| 欧美少妇高潮久久91| 日韩精品-原创伙伴| 久久高清欧美国产| 亚洲欧洲无码97久久精品| 99热婷婷一区二区三| 亚洲蜜桃V妇女| 久久久久久9999| 九九九九九九视频免费| 超碰在线成人| 性感美女啊啊啊在线| 色在线亚洲视频www| 麻豆国产成人精品| 欧美日韩不卡a片| 在线综合 亚洲 欧美中文字幕| 97鸡把在线视频| 亚洲超碰AV| 狠狠爱AV| 啪啪资源网| 人妻少妇精品久久久| 婷婷在线视频在线观看| 欧美黄色图片| 国产精品美女| 久超碰在| 超碰91在线| 婷婷国产精品九区| 97色碰| 用力操死我| 伊人专区一区二区三区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 在线综合 亚洲 欧美中文字幕 | 日本人妻中文字幕精品| 嗯嗯,啊啊,国产精品| 2023天天操夜夜操| 久久鲁夜| 国产AV无码AV| 天躁夜夜躁2021| 久久伊人在线五区| 搞中出久久| 好一吊区二区| 性欧美另类高清| 熟女激情综合网| 天堂资源站| 五月丁香亭亭| 亚洲av综合伊人久久| 欧美色图亚洲特色| 人妻乱仑一区二区三区| 午夜精品久久久久久久久久久久久| 五月天综合| 亚洲视频1区| 欧美色图99| 中文字幕丝袜美腿| 久久一区二区三区入口| 91内射| 加勒比伊人影院| 最近二区三区视频大全| 天天操天天舔| 国产又黄又爽| 色九九九九九九| 操我啊啊啊啊啊| 伊人色综合网电影| 久草尤物| 伊人九九九| 歐美性天天| 超碰久热| 韩国一级AAA| 亚洲婷婷丁香在线| 日韩久射综合| 91 亚欧| 黑人与人妻| 亚洲天堂人妻一区二区| hd成人一区二区在线| 国产一区二区三区高清视频| 九九热只有精品| 欧美精品 - 91爱爱| 久久精品小视频| 亚洲女毛多水多21P| 强奸乱伦亚洲第一页| 久久夜夜| 大香蕉视频啪啪啪啪| 伊人9| 91精品少妇搡搡搡| 98超碰日本| 亚洲综合码| 日韩另类色图| 狠狠操狠狠爱| 99精品久久| 亚洲欧美国产其他二区| 人妻中文字幕日韩电影| 日韩黄片视频试看| 亚洲男人久久综合天堂| 女人与公拘交酡2020视频| 99re在线| 成年无码动漫av片无尽在线 | 男人精品区| 青草一区二区| 天天日天天操天天射河南省| 国产精品96久久久久久| 亚洲毛片基地专区| 精品九九九九| 精品久久久av无码免费| 日韩欧无码一区二区三区免费不卡| 国产精品人妻免费精品| 婷婷在线视频在线观看| 成全在线观看免费观看| 久久久久久AⅤ无码免费肉站| 精品国产91内射久久| 夜夜骑夜夜操| 中文字幕精品一区二| 欧美激情性久久久久久| 乱伦图一区| 久操不卡视频| 在线国产探花| 天天影视色香色欲| 午夜福利区| www.acm成人黄色毛片| 九九九九热只有精品| 男人天堂2017| 中文字幕一区二区三区字幕| 伦伦成年午夜免费视频| 最新国产亚洲精品精品国产亚洲综合| 亚洲一区二区三区四区视频| 丁香六月天| 骚货| 欧美伦乱爱| 夜夜久久久| 亚洲码在线中文在线观看| 夜间福利片1000无码| 丁香五月AV| 青青草字幕AV| 91香蕉国产尤物视频| 欧美日韩一区二区三区四区蜜桃| 淮穴色AV| 97射欧美| 人人人摸人人| 激情AV| 肉丝无码中文高清| 中国操逼无码| 久久久久久亚洲精品不卡人乳| 亚洲蜜臀懂色| 特色a在线上| 美國A片| 99热免费精品| 亚洲欧美色图片| 被男人添B超爽视频| 日本免费中文一区二区三区四区| 大香蕉伊人在线成人AV在线观看| 亚洲性猛| 俺去啦俺来也久久综合| 天天色播| 久男人久久| 亚洲精品国产无码高清| 91丝袜美腿网站| 久久69| 9九九九九视频在线观看| 91久热| 入口操逼网站| 中文字幕人乱码中文字的预防方法 | 91精品国产综合久久久蜜臀| 99精品无码| 操逼操网| 伊人四虎综合| 91快色色色色色| 夜夜嗷嗷一区二区| 无码操逼视频一下| 吉川爱美98堂在线| 日韩高清黄片| 九九精品美女高溯喷水| 男人天堂2030| 日本一区三级韩国| 亚洲黑人在线| 富二代亚洲精品99| 99久久精品无码一区二区毛片免费| 爱射综合| 精品成人无码| 在线中文AV| 午夜成人福利影视| 亚洲成人免费中文字幕| 大香蕉淫人| 无码男人天堂| 蜜臀精品1区2区| 99日韩| 国产综合永久精品日韩鬼片| 黄色视频高清无码网站| 91高跟美女在线播放| 先锋女优在线观看视频| 天美传媒国产原创中文字幕亚洲欧美另类 | 久久久久成人亚洲国产| 91精品人妻一品二品三品| 亚洲天堂人妻一区二区| 国产真乱mangent| 亚洲综合九| 丰满岳乱妇一区二区三区| 亚洲欧美setu| 国产精品香蕉热久久新品| 99少妇| 偷拍亚洲高清图片| 国产AV激情无码久久无码| 欧美少妇高潮视频| 婷婷五月天av| 黄色电影在线播放综合网站| 四虎影视国产精品| 粘花网06av视频| 五月天久久综合网| 91欧洲入口| 97干在线看| 亚洲aV无码成人在线观看| 人妻性爱一区二区| 福利天天都操| 91性高| 久久九九综合| 久久久99免费| 国产91 丝袜在线播放00-百度| 天天肏美女| h在线看免费版在线看| 久久久久久国产无码精品| 一级二级在线观看| 人人妻人人色一区二区三区| 天天日天天舔东京热| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 农村少妇久久久久久久| 无码久| 97天天综合网| 天天色悠悠激情| 亚洲成av人片色午夜乱码| 久操凹凸视频| 天堂无码| 亚洲欧美另类图片| 日本熟妇人妻一区二区三区| 天天日天天干天天摸天天操| 国产精品伦理| 亚洲自拍一区夜夜操| 99国产人成精品| 99久久久er直播网址| 韩国成人精品久久久免费看| 五月婷婷六月丁香网址| 九九九九热| 人妻色偷色噜| 东京热视频网| 国产欧美精选自拍一区| 中文字幕奈奈美被公侵犯| 精品无码久久久久久国产浪潮| 日韩激情毛片一级久久久| AV一区观看| 91成人久久| 视频国产精品未满十八禁止在线观看| 国产中文大片资源中文字幕| 国产精品免费日韩| www黄片免费看com| 亚洲天堂人妻熟妇视频| www.人人cao| 亚洲综合色男人网| 夜夜夜久久| 蜜桃色院一区久久| 久久女女| 美女被啪到深处抽搐视频| 日韩性爱啪啪视频| 精品国产一区二区三区香蕉欧美| 黄色区免费观看中文字幕| 操婷婷逼| 一区久久久二区| 91男同| 丝袜足交视频| 干日本人少妇午夜寂寞影院| 精品久久久亚洲AV成人网站| 偷拍 精品另类 凸凹了四区| 韩国女主播青草在线| 欧美高清在线| 思思热在线视频在线| 永久免费发布性爱网| 久久男女激情视频网站| 色妹子A V| 欧美日韩人妻精品一区二区三区| 国产97av| 国产精品美女久久久久久网站| 色综合av综合久久| 日本精品高清一二区一本到| 粉嫩不卡一区二区性爱 | 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 九九国产热| 日韩一级二级三级在线不卡观看完整| 日韩亚洲中文有码视频| 无码99| 高清视频一区| 中文自拍欧美影视| 欧美大香蕉97| 97超碰色| 日日干日日| 欧美亚洲清纯| 亚洲最大的综合性av| 极品后入免费视频| 国产日韩精品suv| 日韩精品一区二区三区四虎影视| 九九超碰综合网| 男人高清无码一区二区| 欧美 亚洲 大香| 91人妻人人澡人人爽人人精品| 亚洲人妻av| 91青青在线| 6080yy午夜理论三级一区二区三区无码 | 国产白丝网站| 97福利视频| 941超碰| 欧美专区日本专区| 秋霞午夜视频一区二区| 操逼操逼操| 性生活久久久久久久久久| 久久精品 六十路 熟女 欧美| 天堂av2019| 久久午夜鲁丝片| julia中文字幕在线观看| 无码WWW免费视频网站| 无码外流操逼视频| 九九热九九热| 9国产超碰| 亚洲一区亚洲天堂| 久久精品国产亚洲AV无码电影| 亚洲双插| 青草青青久久久久久国产| 骚货操死你| 色av中文字| 天天做天天爱夜夜爽毛片试看| 97 国产一区| 国产激情在线| 东北女人高潮视频| 久久久久久久久久久久久久9999| 天堂69亚洲精品中文字| 黑人干亚洲| 欧美精品自慰系列寂寞少妇 | 中文字幕 国产 精品| 亚洲 暴爽 AV人人爽日日碰| 天天干天天日天天射黄色片| 日韩综合无码色欲vv| 97色妞| 国产一在线观看| 精品在线78| 密臀在线免费观看| 亚乱色| 亚洲久久久| 亚洲情色在线| 巨爆乳肉感一区二区三区竹菊影视| 91搡老女人老妇女老熟女歌词翻译| 蜜臀AV成人精品蜜臀AV久久| 97在线视频观看| 亚洲色图片区| 久久九七| 2001天天操| 一级久久性爱视频| 伊人一级免费黄片| 亚洲视频精选| 午夜久久久| 老司机午夜福利视频一区二区| 五月丁香啪啪| 色爱三区| 草草影院最新网址| 天天伊人| 99热这里都是精品| 久久熟女久| 九九九九九九成人| 中文字幕在线观看AV| 麻豆2区1区天美| 久99久视频| 男人a天堂手机在线版| 91精品亚洲内射孕妇| 色九久| 91中出视频| 色九久| 久久国产三区| 啊啊啊不要好爽日韩无码一区| 蜜臀少妇一区二区| 91在线页| 亚洲色鬼| 色哟哟511老熟女| 看一级特黄a大一片| 欧美αv.com| 久久黄色视频一区二区三区| 強姦亂倫a| 亚洲中文日韩欧美大香蕉视频| 18禁无码永久免费无限制| 搡老熟女免费视频| 97天天在线| 天天天肏屄肏屄肏屄欧美欧美| 97资源制服丝袜| 日韩精品中文字幕人妻| 丰满人妻一区| 97精品视频网站| 人人色人人操在线| 岛国色情视频在线观看| 91亚洲电影| 精品人妻久久久久一区二区三区| 999久久久久久久精| www.人人cao| 欧美亚洲一级在线观看| 国产91av在线播放| 蜜臀一二三区| 欧美日韩另类字幕中文| 少妇免费视频| 乱伦熟女区| 美女黄网| 亚洲欧美电影| 日韩无码视频黄色| 欧美成人一级麻豆| 9精品久久| 91在线国产后入风骚翘臀美女素人| 婷婷国产精品九区| 操逼国产免费| 蜜臀久久99精品久久久久久酒店 | 中文字幕综合人妻| 九九内射在线| 久久这里都是精品| 天美麻花大全视频| 国产白领连续中出在线观看| 五月丁香综合| 婷婷导航| 亚洲丝袜天堂| 亚洲系列欧美| 亚洲人妻精品一区二区| 超碰78| AV麻豆免费一区| 免费一级毛片在线视频观看| 欧美一级久久久丰满| 久久久精品视频免费观看| 欧美日韩激情无码专区| 国产精品久久久鸭无码的功能| 9999免费精彩视频| 欧美v亚洲v日韩v最新在线二区 | 操淫穴亚洲五月丁香 | 久久无码一区二区二三区性色| 亚洲阿v天堂在线| 老熟妇一区二区三区…| 天天搞在线综合网| 五月天激情小说网| 久久激情综合| 少妇一区二区三区在线观看| 懂色AV中文| 天天操天天舔| 久久性爱城| 免费人人搞97| 9久在线视频只有精品| 婷婷啪啪| 日本三级韩国三级美三级91| 91麻豆天美| 99re6国产精品99re在线| 97欧美色| 国产美女高潮叫床视频| 色欲人妻一区二区在线| 欧美午夜视频免费观看| 99久久久99久久91熟女| 欧美色图97| 欧美劲爆视频一区二区| 日韩天天本| 97无码视频在线播放| 男人天堂站| 中国操逼无码| 国产原创精品| 一区二区三区免费视频入口 | 精品网站99999| 亚川综合视频| 久肏视频字幕| 亚洲精品精品一区二区| www.91视频网| 97爱免费插| 国产综合网站在线播放| 天美传媒av在线| 人妻少妇精品一区二区三区| 自拍第一页| 91美女中出| 国产传媒日韩欧美| 97人人爱人人做人人乐| 成人国产精品三级A片| 丰满熟妇大乳做爰| 中文字幕版| 亚洲精品国产专区在线观看| 国产精品97超碰| 蜜臀久久99精品久久久久免费观| 成人av在线播放| 无套后入双马尾| 99re9这里只有精品| 高清在线偷拍自拍视频| 免费自拍三级综合| 亚洲熟女av中文字幕| 中文熟女五十乱码在线| 99这里有精品视频| 色婷婷九月天天综合| 精品大全99999| 亚洲激情 欧美色图| 中亚精品极乱| 丰满的三级少妇欧美久久久| 国产精品蜜乳AV|