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

ARTICLE DETAIL

資訊詳情

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

QOpenGLWidget大圖查看器:紋理上傳、MVP矩陣與光標(biāo)縮放

QOpenGLWidget大圖查看器:紋理上傳、MVP矩陣與光標(biāo)縮放 簡介這份Qt示例工程面向具備一定C基礎(chǔ)、正在學(xué)習(xí)Qt與OpenGL圖形顯示的開發(fā)者聚焦QImage圖片在QOpenGLWidget中的紋理上傳與交互變換問題。壓縮包為rar格式共10個文件、約347KB以3個cpp和2個h源碼為核心配合ui界面、qrc資源、pro工程配置及jpg示例圖組成可直接參考的完整工程結(jié)構(gòu)。已有783人學(xué)習(xí)說明其在圖像顯示類練習(xí)中具有一定參考價值。工程內(nèi)容覆蓋initializeGL與paintGL的初始化與繪制流程、紋理過濾和邊角模式設(shè)置以及通過模型視圖矩陣實(shí)現(xiàn)縮放、旋轉(zhuǎn)和平移的思路同時結(jié)合鼠標(biāo)、鍵盤輸入更新變換參數(shù)并控制重繪以保持交互流暢。讀者可據(jù)此理解QImage轉(zhuǎn)紋理、視口適配和交互變換的組織方式作為圖像查看器或圖形界面二次開發(fā)的起點(diǎn)。1. QOpenGLWidget 貼圖這件事從 QLabel 換到 GL 畫布的那一步拿 QLabel 顯示圖片一開始都很順直到你放進(jìn)去一張 8000×6000 的掃描件。滾輪一放大QPixmap 要重新做一次 CPU 插值幾十毫秒就過去了按住鼠標(biāo)拖動主線程直接被堵住畫面一卡一頓松手才啪地跳到最終位置。做圖像標(biāo)注、圖紙預(yù)覽、看圖工具這類要長時間盯細(xì)節(jié)的軟件這個體驗(yàn)基本沒法交付。換成 QOpenGLWidget 的思路其實(shí)很樸素讓 QImage 只走一次內(nèi)存到顯存的拷貝變成一張紋理之后所有縮放、旋轉(zhuǎn)、平移都只是改一個 4×4 矩陣?yán)锏膸讉€數(shù)重繪交給 GPU大圖縮放穩(wěn)定在一幀一次 draw call。這份源碼素材-template 拆的就是這個最小閉環(huán)四類操作背后只有一條數(shù)據(jù)鏈路和一組矩陣把這條鏈走通再加任何功能都是往上疊。適合剛接觸 Qt 與 OpenGL 的同學(xué)照著跑通也適合手上正有一個 QLabel 看圖控件準(zhǔn)備換掉的開發(fā)者。2. 工程骨架與數(shù)據(jù)鏈路一張 QImage 走到屏幕要過哪幾道關(guān)2.1 四個環(huán)節(jié)解碼、上傳、變換、繪制整條鏈路拆開只有四步邊界清楚到可以用一句話描述QImage 在 CPU 側(cè)被規(guī)范化成 RGBA8888 并垂直翻轉(zhuǎn)通過 glTexImage2D 上傳成 2D 紋理繪制時用一個正交投影矩陣把像素坐標(biāo)系映射到 NDC再把平移、旋轉(zhuǎn)、縮放疊成一個模型矩陣最后畫一個和圖片等尺寸的四邊形采樣紋理輸出。四個環(huán)節(jié)各自有獨(dú)立的失敗點(diǎn)這是排查時最省時間的一張地圖環(huán)節(jié)關(guān)鍵函數(shù)典型失敗表現(xiàn)解碼QImage::load / convertToFormat通道錯位、透明區(qū)變黑上傳glGenTextures / glTexImage2D黑屏、斜條紋、越界讀變換QMatrix4x4 組裝縮放跑偏、旋轉(zhuǎn)不繞中心繪制glDrawArrays shader有頂點(diǎn)無像素、上下顛倒很多人第一次寫會把這四步揉在 paintGL 里結(jié)果一改縮放就得重新傳紋理幀率立刻掉到個位數(shù)。正確的切法是上傳只在換圖時發(fā)生一次paintGL 里只做變換和采樣。2.2 類結(jié)構(gòu)與目錄組織工程不需要很復(fù)雜一個畫布類吃下所有 GL 相關(guān)代碼主窗口只管 UI 和文件對話框這樣二次開發(fā)時改動面可控。目錄大致長這樣ImageViewerGL/ ├── CMakeLists.txt ├── main.cpp ├── widgets/ │ ├── ImageCanvasWidget.h # 畫布本體GL 代碼全在這里 │ ├── ImageCanvasWidget.cpp │ ├── ImageViewerWindow.h # 主窗口打開、復(fù)位、關(guān)于 │ └── ImageViewerWindow.cpp ├── shaders/ │ ├── image.vert │ └── image.frag └── resources.qrc # 把 shader 打成資源省掉運(yùn)行時路徑問題Qt6 里 QOpenGLWidget 已經(jīng)從 Widgets 拆到了獨(dú)立模塊CMake 配置少寫一行就是鏈接報錯find_package(Qt6 REQUIRED COMPONENTS Widgets OpenGLWidgets) add_executable(ImageViewerGL main.cpp widgets/ImageCanvasWidget.cpp widgets/ImageViewerWindow.cpp ) # 注意 OpenGLWidgets 是獨(dú)立組件只鏈 Widgets 會在 QOpenGLWidget 構(gòu)造函數(shù)上炸 target_link_libraries(ImageViewerGL PRIVATE Qt6::Widgets Qt6::OpenGLWidgets) set_target_properties(ImageViewerGL PROPERTIES WIN32_EXECUTABLE TRUE MACOSX_BUNDLE TRUE )提示Qt5 用QT opengl就夠了Qt6 必須顯式找 OpenGLWidgets兩套 CMake 寫法不通用從舊工程遷移時優(yōu)先查這一行。畫布類的公開接口刻意收得很窄外層只認(rèn)識三個方法加載圖片、復(fù)位視圖、設(shè)置背景色。內(nèi)部狀態(tài)全部私有這樣后面加標(biāo)注層、加 ROI 框選時外部邏輯不需要知道矩陣怎么算。2.3 初始化順序initializeGL 里到底該放什么QOpenGLWidget 的三個虛函數(shù)有嚴(yán)格調(diào)用時機(jī)initializeGL只在上下文第一次成功建立后調(diào)一次resizeGL在尺寸變化時調(diào)paintGL每幀調(diào)。順序錯了就是典型黑屏——在initializeGL之前調(diào)任何gl開頭的函數(shù)要么空指針要么靜默失敗。class ImageCanvasWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit ImageCanvasWidget(QWidget *parent nullptr); ~ImageCanvasWidget() override; bool loadImage(const QString filePath); // 唯一換圖入口 void resetView(); // 復(fù)位縮放 1.0、旋轉(zhuǎn) 0、居中 void rotateBy(float degrees); // 相對旋轉(zhuǎn)供工具欄和快捷鍵調(diào) protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void wheelEvent(QWheelEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; private: void uploadTexture(const QImage img); // QImage - GL 紋理只在換圖時調(diào) void rebuildQuad(); // 按圖片尺寸重建頂點(diǎn)緩沖 QMatrix4x4 buildMvp() const; // 投影 * 模型逐幀組裝 GLuint m_texture 0; QOpenGLShaderProgram m_program; QOpenGLBuffer m_vbo{QOpenGLBuffer::VertexBuffer}; QOpenGLVertexArrayObject m_vao; QImage m_image; // 保留原圖導(dǎo)出/重傳都靠它 QSize m_texSize; // 原圖尺寸算初始縮放用 float m_scale 1.0f; // 縮放系數(shù)1.0 表示 1 像素對 1 像素 float m_rotation 0.0f; // 旋轉(zhuǎn)角度單位度逆時針為正 QVector2D m_translation{0.0f, 0.0f}; // 平移量單位屏幕像素 QPointF m_lastPos; // 上一幀鼠標(biāo)位置拖拽用 bool m_dragging false; };繼承QOpenGLFunctions是為了拿到跨平臺的 GL 函數(shù)指針集合——Qt 幫你做了QOpenGLContext::getProcAddress那一套你不必再引 GLEW 或 glad這在只有 Widgets 依賴的項目里很省事。代價是只能用 OpenGL ES 2.0 / 2.1 這個基線如果你要用 compute shader 或幾何著色器就得換成QOpenGLExtraFunctions或者自己加載。initializeGL里的順序不能亂void ImageCanvasWidget::initializeGL() { // 1. Qt6 必須顯式初始化函數(shù)解析表少了這行后面所有 gl* 都是空指針 initializeOpenGLFunctions(); // 2. shader 編譯鏈接失敗必須立刻暴露不要靜默跳過 if (!m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, kVertexShader) || !m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, kFragmentShader) || !m_program.link()) { qWarning(shader 編譯失敗: %s, qPrintable(m_program.log())); return; } // 3. VAO/VBO 只創(chuàng)建不填充頂點(diǎn)數(shù)據(jù)要等圖片尺寸確定后才能寫 m_vao.create(); m_vbo.create(); // 4. 固定管線那套混色狀態(tài)深色背景配半透明圖片時需要 glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }第 4 步的GL_BLEND是給帶 alpha 通道的 PNG 準(zhǔn)備的如果你只顯示不透明圖片這一行可以省。第 2 步的qWarning打印m_program.log()很關(guān)鍵——shader 編譯錯誤不會拋異常只會在日志里留一行不打印出來就是純黑屏加一頭霧水。3. 核心渲染鏈路拆解紋理上傳、著色器與 MVP 矩陣3.1 QImage 轉(zhuǎn)紋理格式、對齊、翻轉(zhuǎn)三件事這是整個項目里最容易翻車的一段因?yàn)槿齻€坑全藏在兩行代碼里。QImage 的像素格式五花八門Format_ARGB32、Format_RGB888、Format_Grayscale8……OpenGL 只認(rèn)它自己那一套枚舉中間必須做一次格式收斂。選Format_RGBA8888是因?yàn)樗膬?nèi)存排布是 R、G、B、A 順序和GL_RGBA的期望完全一致不需要再做通道重排。void ImageCanvasWidget::uploadTexture(const QImage img) { // 1. 格式收斂RGBA8888 的內(nèi)存序和 GL_RGBA 嚴(yán)格對應(yīng)省掉通道交換 QImage normalized img.convertToFormat(QImage::Format_RGBA8888); // 2. 垂直翻轉(zhuǎn)QImage 原點(diǎn)在左上GL 紋理原點(diǎn)在左下這里翻一次 // 著色器里的 uv 就可以老老實(shí)實(shí)寫 (0,0)-(1,1)邏輯只留在一個地方 normalized normalized.mirrored(false, true); if (m_texture 0) { glGenTextures(1, m_texture); } glBindTexture(GL_TEXTURE_2D, m_texture); // 3. 行對齊寬度不是 4 的倍數(shù)時默認(rèn) 4 字節(jié)對齊會讀串行畫面呈斜條紋 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, normalized.width(), normalized.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, normalized.constBits()); // 4. 縮小時用 mipmap 三線性放大時用線性只用 GL_LINEAR 縮小會明顯閃爍 glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 5. 邊緣 clamp避免紋理采樣越界時出現(xiàn)半透明黑邊 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); m_texSize normalized.size(); m_image img; // 存原圖導(dǎo)出時不要再從 GPU 讀回來 }參數(shù)逐個說清楚GL_RGBA8是內(nèi)部格式8 位每通道夠用且顯存占用可控如果做醫(yī)療影像要 16 位精度這里換成GL_RGBA16同時 QImage 那邊轉(zhuǎn)Format_RGBA64。glPixelStorei(GL_UNPACK_ALIGNMENT, 1)是必須的。寬度 3 的倍數(shù)、又不是 4 的倍數(shù)的圖比如 RGB888 的 1023 像素寬默認(rèn) 4 字節(jié)對齊會讓驅(qū)動多讀幾個字節(jié)畫面直接變成斜著的色帶。這個現(xiàn)象非常迷惑因?yàn)閳D不大就完全正常圖一大就錯。mirrored(false, true)和第二參數(shù)true是垂直鏡像。如果你不想在 CPU 側(cè)翻也可以在頂點(diǎn)數(shù)據(jù)里把 v 坐標(biāo)寫成1.0 - v但兩邊千萬別都做否則畫面上下顛倒回來又顛倒回去最后看起來正常一換圖就露餡。紋理尺寸還有硬限制GL_MAX_TEXTURE_SIZE在老舊集顯上可能只有 8192 或 4096。超過這個尺寸glTexImage2D直接報GL_INVALID_VALUE畫面全黑。工業(yè)相機(jī)、衛(wèi)星圖、切片掃描這類動輒兩萬像素的材料很正常比較穩(wěn)妥的做法是分塊tile上傳或者先等比縮到合法尺寸再傳原圖留給導(dǎo)出用。3.2 頂點(diǎn)數(shù)據(jù)與著色器一張四邊形的完整定義幾何部分簡單到不需要索引緩沖四個頂點(diǎn)畫一個 triangle strip 就完事。頂點(diǎn)坐標(biāo)直接用圖片像素坐標(biāo)0,0 到 w,h這樣正交投影矩陣寫起來最直觀鼠標(biāo)坐標(biāo)也能直接參與運(yùn)算不用來回做歸一化換算。void ImageCanvasWidget::rebuildQuad() { const float w static_castfloat(m_texSize.width()); const float h static_castfloat(m_texSize.height()); // 布局x, y, u, v 交叉排列一次 allocate 搞定位置和紋理坐標(biāo) const GLfloat verts[] { 0.0f, 0.0f, 0.0f, 0.0f, // 左上 w, 0.0f, 1.0f, 0.0f, // 右上 0.0f, h, 0.0f, 1.0f, // 左下 w, h, 1.0f, 1.0f, // 右下 }; m_vao.bind(); m_vbo.bind(); m_vbo.allocate(verts, sizeof(verts)); m_program.bind(); // 參數(shù)含義location0類型 float起始偏移 0每頂點(diǎn) 2 分量跨距 4 個 float m_program.enableAttributeArray(0); m_program.setAttributeBuffer(0, GL_FLOAT, 0, 2, 4 * sizeof(GLfloat)); // location1從第 3 個 float 開始2 分量跨距同上 m_program.enableAttributeArray(1); m_program.setAttributeBuffer(1, GL_FLOAT, 2 * sizeof(GLfloat), 2, 4 * sizeof(GLfloat)); m_program.release(); m_vbo.release(); m_vao.release(); }setAttributeBuffer的最后一個參數(shù)是 stride這里寫4 * sizeof(GLfloat)表示每隔 16 字節(jié)取下一個頂點(diǎn)。如果寫成 0讓驅(qū)動自己推某些老驅(qū)動會算錯顯式寫死更保險。location0 / 1是靠 shader 里的layout(location ...)硬綁定的兩邊必須對得上對不上就是純黑。兩個 shader 保持最小// image.vert #version 330 core layout(location 0) in vec2 aPos; layout(location 1) in vec2 aTexCoord; uniform mat4 uMvp; out vec2 vTexCoord; void main() { vTexCoord aTexCoord; // 注意這里乘的是完整 MVP任何變換都在 CPU 側(cè)算好shader 不做二次加工 gl_Position uMvp * vec4(aPos, 0.0, 1.0); }// image.frag #version 330 core in vec2 vTexCoord; uniform sampler2D uTexture; out vec4 fragColor; void main() { fragColor texture(uTexture, vTexCoord); }片元著色器里不寫任何 if 和分支——GPU 最怕這個。如果你想加灰度化反色亮度對比度直接在texture()之后做一個mix或加減代價幾乎為零但如果寫if (vTexCoord.x 0.5)性能曲線會立刻變得難看。3.3 buildMvp平移、旋轉(zhuǎn)、縮放的合成順序矩陣這塊是玄學(xué)重災(zāi)區(qū)。QMatrix4x4 的乘法和數(shù)學(xué)課本一致但代碼里鏈?zhǔn)秸{(diào)用的順序和直覺是反的m.translate(); m.rotate(); m.scale();實(shí)際效果是先縮放、再旋轉(zhuǎn)、最后平移因?yàn)槊看握{(diào)用都在右乘新矩陣。設(shè)計意圖很明確圖片自己的坐標(biāo)系里先繞圖片中心縮放再繞圖片中心旋轉(zhuǎn)然后整體移動到畫布中心并疊加用戶的平移量。所以順序必須是 translate → rotate → scale → 反向平移回原點(diǎn)。QMatrix4x4 ImageCanvasWidget::buildMvp() const { QMatrix4x4 proj; // y 軸向下bottom h, top 0和屏幕坐標(biāo)系一致 // 鼠標(biāo)坐標(biāo)可以直接當(dāng)世界坐標(biāo)用不需要再做 y 翻轉(zhuǎn) proj.ortho(0.0f, static_castfloat(width()), static_castfloat(height()), 0.0f, -1.0f, 1.0f); QMatrix4x4 mv; // 1. 把畫布中心 用戶平移量當(dāng)作圖片中心的落點(diǎn) mv.translate(width() * 0.5f m_translation.x(), height() * 0.5f m_translation.y()); // 2. 繞 Z 軸旋轉(zhuǎn)正數(shù)為逆時針 mv.rotate(m_rotation, 0.0f, 0.0f, 1.0f); // 3. 等比縮放 mv.scale(m_scale, m_scale); // 4. 把圖片自身中心挪到原點(diǎn) —— 少了這行縮放和旋轉(zhuǎn)會繞畫布左上角 // 表現(xiàn)就是放大時圖片往右下角飛出屏幕 mv.translate(-m_texSize.width() * 0.5f, -m_texSize.height() * 0.5f); return proj * mv; }第 4 行的反向平移是整個矩陣的靈魂。它的物理含義是把圖片坐標(biāo)系的中心挪到原點(diǎn)這樣第 2、3 步的旋轉(zhuǎn)和縮放天然繞中心發(fā)生。很多人圖省事把 scale 寫在 translate 前面代碼看起來只差一行運(yùn)行起來圖片就是繞著左上角放大越放越偏還以為是自己縮放算法寫錯了。proj * mv的乘法順序也不能改投影矩陣在最左模型矩陣在右。寫成mv * proj的后果是畫面上什么都沒有且沒有任何報錯。3.4 paintGL一幀的完整執(zhí)行順序void ImageCanvasWidget::paintGL() { glClearColor(0.13f, 0.14f, 0.16f, 1.0f); // 深灰底淺色圖邊緣更清楚 glClear(GL_COLOR_BUFFER_BIT); if (m_texture 0 || m_texSize.isEmpty()) { return; // 還沒加載圖片只清屏 } m_program.bind(); m_program.setUniformValue(uMvp, buildMvp()); m_program.setUniformValue(uTexture, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_texture); m_vao.bind(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_vao.release(); m_program.release(); }逐行解釋關(guān)鍵點(diǎn)setUniformValue(uTexture, 0)里的 0 是紋理單元編號必須和glActiveTexture(GL_TEXTURE0)對上對不上就是采樣到一張空紋理畫面純黑。GL_TRIANGLE_STRIP用 4 個頂點(diǎn)畫兩個三角形比GL_TRIANGLES少傳兩個頂點(diǎn)雖然在這里省不了多少但習(xí)慣值得保留。整個paintGL里沒有任何glTexImage2D這是幀率能穩(wěn)住的前提。換圖時才調(diào)uploadTexturerebuildQuad然后update()一次。4. 交互層實(shí)現(xiàn)滾輪縮放、拖拽平移與旋轉(zhuǎn)的坐標(biāo)換算4.1 鼠標(biāo)事件分發(fā)與狀態(tài)管理三個鼠標(biāo)事件各管一攤互不打擾左鍵按下開始拖拽左鍵移動累加平移量滾輪改縮放系數(shù)右鍵拖拽改旋轉(zhuǎn)角。狀態(tài)用一個m_dragging布爾量 一個m_lastPos就能覆蓋不需要維護(hù)狀態(tài)機(jī)。void ImageCanvasWidget::mousePressEvent(QMouseEvent *e) { if (e-button() Qt::LeftButton) { m_dragging true; m_lastPos e-position(); // Qt6 用 position()Qt5 是 pos() setCursor(Qt::ClosedHandCursor); } QOpenGLWidget::mousePressEvent(e); } void ImageCanvasWidget::mouseMoveEvent(QMouseEvent *e) { if (!m_dragging || !(e-buttons() Qt::LeftButton)) { return; } const QPointF delta e-position() - m_lastPos; m_lastPos e-position(); // 平移量直接在屏幕像素空間累加和 ortho 的像素單位完全一致 // 中間不需要任何比例換算這也是選像素坐標(biāo)系的最大好處 m_translation QVector2D(static_castfloat(delta.x()), static_castfloat(delta.y())); update(); // 單幀請求重繪不要用 while 或 timer 去刷 } void ImageCanvasWidget::mouseReleaseEvent(QMouseEvent *e) { if (e-button() Qt::LeftButton) { m_dragging false; unsetCursor(); } QOpenGLWidget::mouseReleaseEvent(e); }e-position()返回的是邏輯像素DPI 無關(guān)而m_translation也是邏輯像素兩邊單位一致。如果你不小心一邊用了devicePixelRatio乘過的物理像素拖拽速度就會變成 2 倍或 0.5 倍高 DPI 屏上線普通屏上一切正?!@種問題最難查因?yàn)殚_發(fā)機(jī)往往是普通屏。4.2 以光標(biāo)為錨點(diǎn)的縮放最樸素的實(shí)現(xiàn)是滾輪一下m_scale * 1.15圍繞畫布中心放大。用起來會讓用戶很煩想看清楚畫面右上角的細(xì)節(jié)滾幾圈之后那塊內(nèi)容已經(jīng)跑到屏幕外面去了得不停拖回來。好用的看圖工具都做光標(biāo)錨定——放大時鼠標(biāo)指針下面那個像素點(diǎn)保持不動。推導(dǎo)不復(fù)雜把屏幕坐標(biāo)到世界坐標(biāo)的映射寫成一行screen R · S · (world ? c) center t其中 R 是旋轉(zhuǎn)S 是縮放c 是圖片中心t 是平移量。要求縮放從 S 變到 S 之后同一個 screen 對應(yīng)的 world 不變解出新的平移量t pivot · (1 ? k) t · k, 其中 k S/Spivot 鼠標(biāo)位置 ? 畫布中心落到代碼里只有六行void ImageCanvasWidget::wheelEvent(QWheelEvent *e) { const float steps e-angleDelta().y() / 120.0f; // 一格滾輪 120 if (qFuzzyIsNull(steps)) { return; } const float oldScale m_scale; // 1.15^steps往上滾放大往下滾縮小指數(shù)形式保證放大縮小完全對稱 m_scale std::clamp(oldScale * std::pow(1.15f, steps), 0.02f, 64.0f); // 錨定公式k 是新舊縮放比pivot 是鼠標(biāo)相對畫布中心的偏移 const float k m_scale / oldScale; const QPointF pos e-position(); const QVector2D pivot(static_castfloat(pos.x() - width() * 0.5), static_castfloat(pos.y() - height() * 0.5)); m_translation pivot * (1.0f - k) m_translation * k; update(); e-accept(); }幾個參數(shù)值得說明std::pow(1.15f, steps)里的 1.15 是手感系數(shù)試過 1.1、1.2、1.31.15 在大圖上大概是滾三格看清楚一小塊的節(jié)奏再大就容易失控。std::clamp的上下限 0.02 和 64 是防呆——低于 0.02 時一張 10000 像素的圖只剩 200 像素寬用戶會以為圖沒了高于 64 時浮點(diǎn)精度開始不夠用邊緣會出現(xiàn)抖動。這兩個邊界值不是隨便定的是長時間試出來的。還有一點(diǎn)容易忽略公式里的pivot用的是畫布中心而不是圖片中心。這里有個前提buildMvp里平移量的基準(zhǔn)點(diǎn)也是畫布中心兩邊必須統(tǒng)一。要是某天你把基準(zhǔn)改成圖片中心這個公式就得跟著重寫。4.3 拖拽旋轉(zhuǎn)與視圖復(fù)位旋轉(zhuǎn)不用太花哨右鍵橫向拖動改角度加上一個鍵盤 R 鍵做 90° 步進(jìn)覆蓋絕大多數(shù)用法。void ImageCanvasWidget::setRotationFromDrag(qreal dx) { // 每拖 2 像素轉(zhuǎn) 1 度符號取反是因?yàn)槠聊?y 向下、逆時針為正 m_rotation std::fmod(m_rotation - static_castfloat(dx) * 0.5f, 360.0f); if (m_rotation 0.0f) { m_rotation 360.0f; // 歸一化到 [0, 360)避免數(shù)值越滾越大 } update(); } void ImageCanvasWidget::rotateBy(float degrees) { m_rotation std::fmod(m_rotation degrees, 360.0f); update(); } void ImageCanvasWidget::resetView() { m_scale 1.0f; m_rotation 0.0f; m_translation QVector2D(0.0f, 0.0f); update(); }std::fmod那一步是后悔藥。如果不做歸一化用戶按住右鍵轉(zhuǎn)十圈m_rotation就變成 3600浮點(diǎn)精度一點(diǎn)點(diǎn)累積轉(zhuǎn)回 0 度時畫面會有微小傾斜。歸一化之后最多只有 359 的誤差肉眼看不出來。復(fù)位按鈕也別只復(fù)位縮放——把旋轉(zhuǎn)和平移一起歸零否則用戶點(diǎn)了復(fù)位發(fā)現(xiàn)圖還是歪的體驗(yàn)很怪。5. 避坑與排查黑屏、倒像、斜條紋、泄漏這四類問題5.1 環(huán)境與初始化類一進(jìn)來就是純黑現(xiàn)象程序能起來窗口也有但畫布區(qū)域一片黑什么都看不到日志里也沒有異常。原因絕大多數(shù)是initializeOpenGLFunctions()沒調(diào)或者 shaderlink()失敗后被靜默跳過。Qt6 里QOpenGLFunctions的函數(shù)指針要靠這個調(diào)用填充不調(diào)的話第一次glGenTextures就是空指針在部分平臺上直接崩在另一些平臺上靜默返回 0。另一個高頻原因是鏈接時只帶了Qt6::Widgets沒帶Qt6::OpenGLWidgets編譯期不報錯運(yùn)行時構(gòu)造 QOpenGLWidget 才炸。解決把a(bǔ)ddShaderFromSourceCode和link()的返回值全部檢查失敗時用qWarning打印m_program.log()initializeGL第一行固定寫initializeOpenGLFunctions()。如果還是沒有輸出檢查QSurfaceFormat有沒有在QApplication構(gòu)造之前設(shè)置——setDefaultFormat必須在main里QApplication a(argc, argv);之前調(diào)之后調(diào)無效這是個經(jīng)典的時間窗口問題。5.2 畫面表現(xiàn)類圖片上下顛倒或出現(xiàn)斜條紋現(xiàn)象 A圖能顯示但是上下倒著的文字也反了。原因 AQImage 原點(diǎn)在左上、GL 紋理原點(diǎn)在左下兩邊坐標(biāo)系不一致。如果只在uploadTexture里做了mirrored(false, true)卻又在頂點(diǎn)數(shù)據(jù)里把 v 坐標(biāo)寫成1.0 - v等于翻了兩次看起來又正了一旦換一種加載路徑比如從內(nèi)存 buffer 而不是文件只走其中一處翻轉(zhuǎn)立刻就顛倒。解決 A翻轉(zhuǎn)只做一次且固定在一個地方。這個項目的做法是統(tǒng)一在uploadTexture里翻頂點(diǎn) uv 永遠(yuǎn)寫(0,0)-(1,1)誰改了翻轉(zhuǎn)邏輯必須同步檢查另一處。現(xiàn)象 B圖片邊緣出現(xiàn)斜著的彩色條紋或者右下角有一片噪點(diǎn)。原因 BglPixelStorei(GL_UNPACK_ALIGNMENT, 1)沒寫驅(qū)動按 4 字節(jié)對齊讀行寬度不是 4 的倍數(shù)的圖必然讀串行。解決 B上傳紋理前固定加一行g(shù)lPixelStorei(GL_UNPACK_ALIGNMENT, 1)。這個設(shè)置是全局狀態(tài)會一直保留但建議每次上傳前都設(shè)避免被別處改掉后踩坑。5.3 交互與數(shù)值類放大后圖片往角落跑現(xiàn)象滾輪放大幾次之后圖片不是圍繞光標(biāo)放大而是快速往右下角飛出去最后完全看不見或者拖拽時手感明顯黏跟手的距離對不上。原因buildMvp里少寫了最后那句反向平移mv.translate(-w/2, -h/2)縮放和旋轉(zhuǎn)就繞畫布左上角發(fā)生。拖拽黏的原因通常是單位不統(tǒng)一——e-position()返回邏輯像素而平移量如果按物理像素累加高 DPI 屏上速度就變成 2 倍。解決矩陣鏈的尾部必須補(bǔ)上把圖片中心移到原點(diǎn)這一步坐標(biāo)換算全程只用邏輯像素如果確實(shí)需要物理像素統(tǒng)一在resizeGL里乘一次devicePixelRatioF()別散落在各個事件處理里。檢查方法很簡單把m_texSize打出來再打印一次鼠標(biāo)位置經(jīng)過buildMvp().inverted()映射后的世界坐標(biāo)看看是不是落在[0, w] × [0, h]里。5.4 性能與資源類連續(xù)換圖幾十次后卡死現(xiàn)象反復(fù)打開不同的圖片內(nèi)存占用一路漲最后系統(tǒng)卡頓甚至進(jìn)程被殺或者大圖切換時有一秒多的白屏。原因glGenTextures每次換圖都新建紋理舊的沒glDeleteTextures顯存泄漏。另一種是每次paintGL都調(diào)glTexImage2D重新上傳一張 8000×6000 的 RGBA 圖每幀要拷 180MB 到顯存幀率自然崩。解決uploadTexture里先判m_texture ! 0就復(fù)用現(xiàn)有紋理 ID只在尺寸變化時重建paintGL里絕不重新上傳。如果是同一尺寸的圖頻繁刷新比如視頻幀用glTexSubImage2D替換整張glTexImage2D后者要重新分配顯存前者只覆蓋數(shù)據(jù)快一個數(shù)量級。析構(gòu)函數(shù)里記得makeCurrent()之后再glDeleteTextures直接刪會因?yàn)闆]有當(dāng)前上下文而失敗。注意QOpenGLWidget在銷毀時上下文可能已經(jīng)失效~ImageCanvasWidget里刪紋理必須自己makeCurrent()Qt 不會幫你。6. 二次開發(fā)從單圖查看器擴(kuò)到多圖層標(biāo)注器的改造思路這個畫布跑通之后最有價值的延伸是把它往多圖層方向改。單圖查看器的瓶頸在m_texture只有一個一旦要做底圖 標(biāo)注層 ROI 框選就得把紋理和矩陣抽成獨(dú)立的圖層結(jié)構(gòu)struct Layer { GLuint texture 0; QSize size; QMatrix4x4 localTransform; // 圖層自身的偏移/縮放相對畫布為恒等 float opacity 1.0f; bool visible true; }; QVectorLayer m_layers;改造的關(guān)鍵是把buildMvp拆成兩級投影矩陣proj全局一份每個圖層自己的模型矩陣單獨(dú)算繪制時proj * layer.localTransform逐個上傳。這樣拖拽平移只改全局的視圖矩陣單獨(dú)挪某個標(biāo)注框只改對應(yīng)圖層的localTransform互不干擾也不用重新上傳紋理。第二個常見需求是導(dǎo)出當(dāng)前視圖。不要用QPixmap::grabWidget那截的是窗口會被遮擋、被 DPI 縮放。正確做法是grabFramebuffer()它直接讀 FBO拿到的是純繪制內(nèi)容bool ImageCanvasWidget::exportView(const QString path) { makeCurrent(); // 讀 FBO 前必須綁定上下文 const QImage frame grabFramebuffer(); doneCurrent(); return frame.save(path); // 格式由后綴決定 }第三個方向是精度。如果做的是工業(yè)檢測、遙感、病理切片圖片動輒兩萬像素以上GL_MAX_TEXTURE_SIZE直接卡死。這時要么按 2048 或 4096 切塊每塊一張紋理按可視區(qū)域只畫可見的塊視錐裁剪要么把原始QImage拆成金字塔縮放級別切換時換用不同分辨率的紋理顯存占用能壓下來一大截。這兩條路的共同點(diǎn)是始終保留 CPU 側(cè)的原始 QImageGPU 上的紋理只是顯示用的副本任何需要精確像素的操作取色、測量、導(dǎo)出都回到原圖算不要從紋理讀回來。關(guān)于驗(yàn)證我的習(xí)慣是準(zhǔn)備一組刁鉆圖當(dāng)回歸樣本一張 1×1、一張 1023×769寬度不是 4 的倍數(shù)、一張帶 alpha 的 PNG、一張 20000×20000 的大圖、一張灰度圖。每次改完矩陣或者紋理上傳邏輯就把這五張挨個過一遍縮放拖到 0.05 和 30 兩個極端右鍵轉(zhuǎn)兩圈看有沒有抖動、有沒有黑邊、邊緣有沒有斜紋。這套流程是被坑出來的血淚經(jīng)驗(yàn)——只測一張 4K 的彩色 JPG永遠(yuǎn)發(fā)現(xiàn)不了對齊和格式的問題。從那以后我每次動渲染相關(guān)的代碼都會在提交前把這組圖跑一遍寧可多花十分鐘也不想再收到大圖打開是斜的這種沒有截圖、沒有復(fù)現(xiàn)步驟的反饋。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天美传媒麻豆一区二区三区国产精| 2017av无码免费无线播| 园内精品自拍视频在线播放| 九草在线大香蕉| 国产400孕妇孕交群| 午夜福利在线合集| 又大又黄国产| aV中文麻| 国产女人极品高潮毛片| 五月天伊人| 天天综合青苹果| 国产精品制服丝袜清纯唯美| 麻豆国产97在线| 在线性黄高清免费视频| 男女香蕉一区二区| 约操熟妇| 欧美第一页| 人人操人人色人人摸| 性爱动态120秒| 91亚.色| 欧美特大AA级黄片| 东北女人的毛片| {男男暴菊gay无套网站| 超碰在线人妻不卡| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 超97在线精品视频| 久久久久大香青草精品综合| 国产精品点击进入在线影院| 超碰在线成人电影| 麻豆国产免费影片| 午夜传煤十二区精品| 国产无套粉嫩白浆在| 国产av青草| 久久超碰网| 亚洲有码 欧美精品| 加勒比综合在线| av资源在线播放天堂| 欧美在线大香999| 色综合色综合网| 日韩精品人妻中文字幕不卡乱码| 色色色色网站| 精品九九九九| 9超碰免费| 在线视频免费播放一区| 啊啊啊轻点在线观看| 国产探花精品在线| 久久精品无码不卡| 国产女人成人精品视频| 成年无码动漫av片无尽在线 | 人妻人人做人人澡人人爽欧美一区| 另类亚洲图色| 日本一区二区做爱的视频| 九九国产热| av国产无码| AV男人天堂网| 色人久久| 不卡av免费在线网址| 人妻大相焦在线| 日韩无码三级影院| 91精品国久久久久久无码| 黄在线| 成人久久久| 超碰97男人| 亚洲黄色视频在线观看视频| 四虎免费视频| 强免费黄色网址| 天美av在线| www.操| 一本色道综合久久欧美| 久久中文字幕人妻熟av女蜜柚| 91超级碰碰碰| 看日韩黄片| 日日干夜夜骑| 婷婷香蕉欧美在线一区二区三区| 一类av片在线看| 色香网| 人妻天天爽夜夜爽爽| 综合国产影视三级| 欧美综合亚洲| 东京热av男人的天堂| 亚欧高清在线| 久久久久久久国产视频| 可免费观看的av毛片中日美韩| 国产熟女自拍| 嗯嗯啊啊好疼| 蜜桃传媒一区二区亚洲| 95人妻爽爽人人做人人澡| 亚洲一卡二卡在线免费| 先锋女优在线观看视频| 欧美色三级片91| 亚洲一区二区久久久久| 久久一区二区蜜桃| 日韩欧美蜜桃精品久久中文字幕久久 | 亚洲双插| 吊色| 97干天天| 欧美精品第四五页中文字幕在线观看| 激情综合网五月婷婷| 激情抓乳插进去啪啪啪日韩| 欧美大香蕉久| 欧美不卡五十路| 67914在线兔费成人视频| 插入粉嫩少妇视频| 美女主播色欲91抠b在线播放| 黄色片大香蕉| 日韩不卡a级视频专区| 色天使亚洲综合在线观看| 九色在线熟女国产黑人| 午夜激情成人在线观看| 尹人免费观看视频在线| 日韩99精品视频综合区| 亚洲精品自拍| AV麻豆免费一区| 日本熟女不卡视频| 91精品久久久久五月天精品| A级片日韩欧美国产欧美视频精选观看| 日韩视频中文字幕| 乱性AV| 九九亚洲| 一区二区乱码福利| 亚洲中文字幕熟女| 国产成人99久久亚洲综合| 中国一级αV| 久久久新亚洲AV| 99999re| 强奸乱伦 亚洲一区| 懂色av一区二区三区天美传媒| 亚洲丨在线| 91熟女丨91老女人| 成人线上超碰| 国产一区二区三区免费视频在性观看| www.黄色在线| 天堂8在线新版官网| 人妻中文字幕日韩电影| 日韩人妻一区二区精品| 午夜人妻精品综合在线| 四虎AV无码| 3571色综合一区二区二区| 亚洲精品一区中文字幕乱码| 极品五月天噜噜| 国产白嫩精品久久| 人人搡人人肉久久精品| 99热在线只有精品| 日韩欧美福利视频看看| 成人网站 免费观看| 人人妻人射| 亚洲最大无码中文字幕网站| 六月婷婷综合| 激情黄色五月天| 欧美图片色五月天| 伊人操你| 91久久精品蜜臀| 9 7超碰在线免费观看| AV中文字幕剧情1区2区3| 国产一区二区久久| 国产精品久久久久久久久久梁医生| 日韩中文字幕视频| 可以看的av| 色综合美国| 日日干夜夜操视频h| 久久综合久色欧美综合狠狠| 日韩猛交| 中国一级特黄大片护士 | jazzjazz国产精品麻豆| 日韩欧美中文日韩欧美色| 亚洲综合婷婷| 欧美大香蕉同搞| 成人亚欧免费视频| 影音综合网| 中字一区| www.亚洲黄色| 日韩精品区二区三区不卡| 亚洲一区亚洲天堂| 人妻铁牛TV| 福利视频一区二区微拍| 殴美性色a级欧美| 日韩国产十八禁| 五十路熟女人妻一区二区在线观看| 欧洲欧美视频一区二区| 爽爽淫人网| 欧美亚洲清纯| 国产亚洲日韩欧| 色欲天天综合网| 啊啊啊啊二区好大| 91爱| 亚洲色图大香| 欧美91网| 欧美色性爱| 97色97好| 免费岛国一级片| 欧美日韩性爱精品| 夜夜骑日日| 影音先锋每日最新资源在线观看| 熟妇色99| 亚洲国产综合久久天堂| 丝袜美腿操av| 欧美成人四级在线播放| 国产超碰在线一区| 国产高清视频无码在线| 美女黄页| 9九九国产| 爆操无码| 国产九九九九九九| 九九色婷婷| 欧美精品久久| 国产曰批免费观看久久久| 中文久久一区| 欧美一级久久久久久久大片动画| 91夜夜蜜桃臀1区2区3区| 看日韩黄片| 国产乱码久久| 亚洲色图欧洲| 人妻插插人妻人| 久久精品国产亚洲5555| 熟女自慰久久久| 黄色视频高清无码网站| 日本一片一区| 日韩精品人妻一| 综合久久99亚洲人妻中文在线| 蜜乳AV免费观看| 97玖玖超碰| 日韩性爱啪啪视频| 中文幕97| 久久久久成人亚洲国产| 久区视频| 欧美久久婷| 人妻少妇久久中文字幕一区二区 麻豆 | 大香蕉在线SuP| 久久亚洲欧美中文字幕国语| 久久99999| 国产美女mm131爽爽爽爽| 亚洲日韩熟女人妻高清在线| 国内毛片免费h片在线| 东京热毛片调教| 日本超碰在线国产一区| av网站在线看| 果冻传媒一区二区三区| 欧美美女自慰一区二区三区| 九九综合九九综合| 97精品久久久久中文字幕| 永久免费发布性爱网| 久9爱精品| 丁香六月婷婷久久综合| 中国AAAAAA黄色片| 亚洲 中文 欧美 日韩 在线| 五月丁香六月| 伊人久久综合影院精品久久久| 久久精品99久久久久久| 99热色精品| 骚女天天综合网| 婷婷情色五月天| 日本理论在线| 亚洲无无码αⅴ每日更新| 久久精品72| 日韩色欲久久一二三四区| 熟女91网| 一区二区视频你懂的| 久久九九网| 久久精品一区二区三区四区五区| 天天综合站| 久久精品人体| 秋霞无码av鲁丝片一区| 亚洲国产精品V?在线播放| 啊啊啊啊在线播放| 久久夜嗨| 国产免费一区二区三区最新不卡| 国产AV久久野战精品| 国产97在线播放| 一区中文字幕二区日韩| 亚洲欧美国产日本一区二区三区| 人人操人人干网页| 欧美97爱| 亚洲中文字幕一区| 加勒比五月天| 在线天堂999| 日日日日做夜夜夜夜无码| 少妇一区二区三区| 毛片99-全集电影手机免费观看完整-B029AV| 欧美制服网站美腿丝袜| 这里有精品| www亚洲免费| 91丝袜在线观看| 亚洲97网站| 五月天综合网| 中美日韩毛片| 婷婷久草一区二区三区| 五月婷婷色| 另类 日韩 熟女| jizz啪啪| 在线观看无码三级少妇| 无码高清少妇久久| 亚洲欧美日韩制服另类| 久久久久久九九九九| 欧美大干日韩| 男人的天堂日韩| 麻豆影音天美视频| av东京热男人的天堂| 日韩丝袜人妻AV| 天天看,天天做| 亚洲一区二区性爱电影| 亚洲成?V人片在线观看福利| 国产成人bd在线观看| 中文字幕一区二区三区字幕| 日本操逼无码| 91色交| 欧美日韩传媒| 欧美精品精品一区二区| 88xx成人精品视频| 欧美一区二区福利在线| 中文字幕日韩人妻视频| 激情五月天插| 金莲网址| 强奸乱伦动态污图免费 | 69视频入口| 久久精品一区二区三区四区五区| 午夜啪| 超碰97人妻免费在线| 天天射天天操天天干天天吃2018| 日韩黄色片子| 成人小说视频在线精品欧美| 在线观看黄色电话| 被体育老师抱着c到高潮| 黑人黄片在线免费观看| 爱我干综合| 国产女人91精品嗷嗷嗷嗷| 亚洲无码?第一页| 欧美性爱日韩性爱| 九九色逼| 欧美最婬乱婬爆婬性视频 | 婷婷AV一区二区三区| 逼逼逼逼操操操操操操操操操午夜剧场| 国产精品呦一区二区三区| 中国女人内射6XXXXX| 日韩欧美经典在线观看| 九九无码| 亚洲精品丝袜| 污电影在线观看| 国产超碰欧美| 99亚洲国产精品色一区二区三区| 国产精品嫩草影院免费| 亚洲国产日韩欧美熟妇在线| 国产传媒美日韩av| 亚洲精品1区| a啊啊啊啊啊啊啊啊一区二区| 99少妇| {男男暴菊gay无套网站| 色爱三区| 黄色小说亚洲| 久久久草草精品| 中文字幕丰满子伦无码专区在线视频最新| 国产精品网址| 欧亚综合一卡二卡中文字幕| 少妇专区一二三四五| 蜜桃网熟妇| 国产毛片毛片4p懂色| 亚州操逼图| 亚洲情色视频| 日本www操操操| 天天插天天干| 啊啊啊啊啊舒服| 97免费在线| 国产精品婬乱一级毛片彝族| 色香阁在线| 天天内射| 精品三级在线专区| 天天干一干| 国产无遮挡| 日曰骚久久精品| 成人影院永久免费观看网址| 色蜜AV| 亚州色图片在线色| 麻豆三极片| 国产综合操逼高清| 夜夜操一区二区| 亚洲一区二区三区在线激情| 97色婷婷| 日韩精品 欧美激情| hd成人一区二区在线| 夜夜高潮夜夜爽高清视频一 | 国产黄a三级三级三级av在线看| 久久 久久国内精品亚洲| 日韩人妻无码不卡网站| 久久丁香| 日韩欧视频| www.色婷婷色综合| 久久久久亚洲av综合波多野制衣| 久久午夜伦| 校园春色欧美| 影视综合无码少妇| 久久精品视频久久久| 传媒在线观看一区二区三区| 欧美性爱1080p| 色爱综合网欧美| 亚洲资源吧| 中文自拍欧美影视| 韩日巨乳美女免费视频在线观看| 日韩欧美成人性爱在线| 青青操在线亚洲视频观看欧美在线| 欧美一级在线观看成人| 日本久操视频| 精品一区二区三区丰满熟女-亚洲欧美一区| 日欧操屄视频| 小电影欧美91| 中文字幕91综合| 青青草毛片| 99性爱视频| 国产传媒一区二区三区| 激情婷婷五月天| 久久啊啊| 亚洲天堂人妻一区二区| 91丝袜美女视频| 中文字幕 一区二区 亚洲无码| 伦理第一页| 99热这里只有精品8| 99热网站| 久久久96| 九九九九九九九九九九九九九九九女| 日韩一级特黄av毛片| 加勒比少妇AV婷婷六月天超碰超碰| blacked精品一区国产| 美女干逼2| 探花激情视频| 台湾佬大香蕉| 淫色网综合| 国内精品嫩模A∨私拍小视频| 青青草十区九区爱夜| 中文字幕一区二区日韩网| 欧美日韩大陆黑人少妇99| 岛国片国产成人亚洲播放| 亚洲国产丝袜在线观看| 黄片在线免费在线观看| 国产强奸无码乱伦| 久久综合久色欧美综合狠狠| 久久99久久99久久99人受| 嗯嗯啊啊好爽| www.高清无码诱惑一区.com| 国产精品亚洲免费| 日本一道在线播放高清| 学生妹天天看| 婷婷亚洲中文字幕在线| 亚洲精品xxx| 超碰地址久久| 操死我了嗯嗯嗯| 久久人人看| 韩国久久97| 日韩乱伦AⅤ| 色97欧美| 加勒比AV网| 免费久久精品麻豆一区二区av| 97操| 97中文字幕一区| 久久秀这里有精品| 激情接吻视频久久久久久| 性天堂| 九七人妻在线| 伊人网在线观看| 亚洲夜夜欢无码一区二区| 大香蕉线| 在线电影亚洲色图| 人妻插插人妻人| 依人大香蕉| 久久性爱精品一区| 欧美精品成人一区二区在线观看| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 天堂精品一区| 9999九九九久久久| 91久久精品国产| 免费综合亚洲中文| 亚洲综合另类小说色区亚洲成av人片在www | 麻豆性爱视频在线播放| 久久久久久99999国产精品| 午夜欧美J进J出白浆流出久久久| av在线资源| 欧美色www亚洲国产阿娇要播| 9精品久久久久| 免费超碰97久久| 91亚州欧美| 激情综合五月| 色婷五月天| 日本性爱网址| 国产大学生口爆吞精合集| 强奸乱伦 亚洲一区| 国产激情在线| 欲色综合| 偷拍新久久| 精品乱码在线观看| 国产1727欧美| 久久99999| 亚洲综合有玛| 五月天伊人| 一区二区三区国产精产| 精品久久久中文字幕不| 夜夜中出国产| 精品国产乱码久久久久久影片| 婷婷亚洲综合| 久热99| 国模吧 一区二区三区| 九九探花视频在线观看| 国人欧美精品一区二区| 日本五十路熟女一区二区| AV污污污污| 国产精品毛片?v一区二区三区| 妇女性内射冈站HDWWWCOM| 色噜噜综合在线| 99免费视频| 午夜大香蕉| 亚洲综合在线视频| 一本一道人妻久久一区二区三区| 女优视频第10页| 久操黄色视频| 一道本东京热加勒比一区二区三区| 婷婷五月天成人网| 欧美熟爽综合| 日本丝袜美腿人妻九九| 天堂伊人久久| 久久久久九九九九九| 成人区人妻精品一| 欧美夜夜| 9国产超碰| 超97在线精品视频| 日韩av不卡在线观看| 97色在线| 日韩影片中文字幕一区二区三区| 96国产污污污丝袜| 欧美日韩性爱精品| 亚洲97网站| 亚洲综合第一页| 九九九久久久久| 吉川爱美亚洲二区在线 | 蜜臀久久一区二区| 亚洲九九九| 熟妇乱伦一区二区| 狠狠干狠狠色| 四虎精品永久在线播放| 有码免费观看| 国产乱码精品一区二区三区四川| 国产高清成人免费视频| 精品人妻一区二区三区鲁大师| 成人精品视频| 久久久久久国产精品| 四虎午夜影院| 久久精品超碰| 欧美 综合 亚洲| 91熟女熟妇视频网站 | 国产精品情侣啪啪| 中文字幕三四五区| 色就色综合| 91人妻爽爽人人做人人澡| 欧洲在线性爱视频| 99久草| 97视频在线免费播放| 人妻激情视频| 97干在线| 国产精品视频播放| 久久夜夜夜| 久草网站免费在线观看| 欧美自拍偷拍综合图片| 四虎影视欧美| 久9综合在线| 日韩传媒在线| 97欧美色资源| 伊人午夜福利视频| 中文字幕乱偷人妻久久艾草网| 国产AV天美| 亚洲图片 91| 乱伦图一区| 国产精品免费久久久久久久久久| 蜜桃久久精品一区二区三区| 天天插夜夜操| 欧美日韩天堂| 国产网红精品| 操逼操逼逼操操逼91 | 一区二区三区探花在线观看| 激情AV| 91美女视频电影| 国产精品点击进入在线影院高清 | 99操逼| 亚洲限制级在线| 1024久久高清视频| 熟女色图在线| 老汉网| 97国产伦理| 后入式视频国产自| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 亚洲在线网站| 国产精品日本无码A片| 乱伦日本色图AⅤ| 国产亚州高清国产拍精| 久久天天艹| 乱伦av麻豆| 韩三级a视频在线观看| 日日骚网站| 人妻夜夜爽天天爽三区麻豆AV网站| 精品一级毛片在线观看| 欧美五十路熟| 青青草日本中文字幕| 日本色日夜干| 屌色在线97视频| 竹菊影视国产一区二区| 熟女高潮合集-永久久久-成人AV | 十八禁啪啦拍视频无遮挡| 超碰吊日色| 亚洲成人黄色在线观看| www99热| 亚洲情色1区| 亚洲综人网| 超碰免费人妻在线| 久久九色| 欧美日韩国产色五月综合在线| 国产在线观看一区二区三区| 91校园春色长篇| 男人成人黄色视频在线观看免费下载| 人妻偷拍一区二区三区| 日本在线一二| 上特色A在线| 国产精品4p在线观看| 人人色人人操在线| 日韩免费a级毛片无码a∨| 久久在肏| 韩国一级婬片A片AAAAA| 精品偷拍13p欧美dodk视频| 伊人一区二区在线播放| 啊啊啊啊啊啊啊啊要喷了| 亚洲精品影视老司机| 天躁夜夜躁2021| 久久在肏| 丁香六月激情| 极品一区二区三区免费| 五月天色色色| 午夜男人的天堂| 久久激情综合| 91欧美经典| 99色在线观看| 玖玖综合网| 欧美淫穴| 18禁无码永久免费无限制| 精品免费1| 美国日韩黄片| 色亚州人久干视频在线观看免费版| 免费一级性爱久久| 日本高清一本二本免费不卡| 青娱乐亚洲自拍| 亚拍在线| 亚洲性综合11| 亚洲日韩人妻中文字幕一区| 国产女上位好爽在线| 一区二区三区 日韩欧美| 欧美色五月| 国产内射爽爽大片| 亚洲玖玖爱| 国产一区二区三区不卡手机在线| 亚洲欧洲精品成人| 亚洲aV性爱| 99精品丰满人妻| 国产 v乱码一区二| 亚洲97资源| 日欧美色| 国产精品熟女九九九| 欧洲自拍第一页| 国产伦精品免编号公布| 99国产天美| 欧美色交| 欲色啪| 国产精品制服丝袜中文字幕日韩一区二区三区| 免费又黄又裸乳的视频| 久久精品91| 国产激情片在线观看| www.男人的天堂| 91超碰人人| 亚洲AV无码成人精品久久| 91色综合色| 久久精视频美日韩在线视频| 日本欧美一区二区三区视频麻豆| 美女的肌被草喷水视频| 免费精品无码一级毛片牛牛影视 | 淫妻综合网| 超碰国产精品久| 国产三级片在线观看| 97精品全部| 天天操美美| 毛片视频白嫩| 亚洲男人的天堂亚洲| 97在线视频观看| japan日本高清乱xxxx| 精品久久久久久无码| 日日摸日日碰| 蜜臀99久久精品| 亚州高清av| 国产人妻一区二区三区欧美毛片| 五月天伊人| 日韩人妻丝袜中文字幕| 美女97超碰| 亚洲激情网一二三四区| 内射夫妻三片| 久夜视频| 97超碰精品图片| 亚洲欧美清纯| 青娱乐手机日韩在线视频| 超碰97久久观看| 啊啊啊好大好深| 色婷婷日韩精品一区二区三区| 麻豆成人AV| 男人的天堂久久狠| 色操逼网| 婷婷午夜成人色中色| 日日操丁香五月天| 亚洲少妇综合在线播放| A级毛片在线看免费| 婷婷亚洲五月***久久| 国产67194| 1区2区3区在线视频| 欧美精品双插| yazhououmeizongya| 亚洲av青草久久一区二区| а√天堂资源官网在线资源| 久久无码一区二区二三区性色| 久久综合日韩亚洲欧美| 曰韩av中文字幕专区| 亚洲人妻一区二区三区| 亚洲天天操| 中文日本免费高清| 偷拍欧美综合| 欧美精品丝袜久久久中文字幕| 97国伦国色| 欧美亚洲激情一二三| 五月丁香大香蕉| 少妇与黑人高潮在线| 99色在线| 少妇高潮特黄A片| 六九九九| 色婷婷日韩精品一区二区三区| 人妻色偷色噜| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 夜精品久无码| 神马麻豆福利院| 欧美一级A片在线看视频性色| 超碰色美女| 厕所偷拍在线| 9999亚洲电影| 99性爱| 91网站18+| 久久久性少妇| 曰韩人妻中文字幕在线| 无码天天操| 操逼网站地址| 天天看片天天爽| 亚洲人妖网| 性爱网站一区二区| 一区二区三区日韩欧美| 日本αv| 日韩AV一区二区三区三州三州| 久久在肏| 天天欧美色| 欧美黑人熟妇精品91| 天天影视色香色欲| 探花精品 一区二区| 久久精品人体| 亚洲欧美日韩激情不卡| 日欧美色| 约操熟妇| 天天色综合影视网| 精品一区二区综合熟妇| 肉丝无码中文高清| 精品 码产区一区二-1080P高清在线www-B029AV | 97久久免费| 亚洲有薄码区日本系列中文字幕| 国产懂色精品国产av| 久草视频制服诱惑| 亚欧操逼片在线观看 | 欧美十八禁网站| 日韩福利综合一区| 激情四射婷婷六月天| 水野优香在线观看| 亚洲国产91精品一区二区久久| 国内一级精品| 欧州色图区| 久久久久久国产无码精品| 岛国天天午夜影院传媒网| 国产精品视频| 国产免费一区二区三区最新不卡| 男人天堂2019亚洲| 久久久久久波多野吉衣高潮| 干干干天天| 人人性爱视频免费| 美女t无毒不卡不卡| 看看日B真人视频| 在线观看午夜婷婷久久久久清性观看| 欧美性区| 激情亚洲天堂| 成人五月天色网| 99精品丰满人妻| 欧美日韩国产电影| 少妇三P| 婷婷五月天无码 | 在线 制服丝袜中出 人妻| 女同女同恋久久级三级| 亚洲图片激情综合另类| 国产日韩在线播放av| 女性喷水高潮在线观看| 高清无码学生妹高潮| 国产亚洲禁久一区二区 | 伊人九九| 丁香五月婷婷基地| 丝袜美腿91| 熟女精品一区二区三区| 久久大香蕉97| 人妻天天夜夜爽一区二区| 久久啊啊啊| 麻豆av一区二区三区| 国产91影院| 躁躁日曰躁2020| 色欲av一区二区三区蜜芽| JULIA人妻风俗店中出电影| TS人妖另类精品视频系列| 日韩欧美成人大香蕉| 亚洲一区操| 先锋音影AV| 乱伦日本色图AⅤ| 午夜九九| 综合久草| 午夜福利一区二区影院| 一级黄碟在线看| 欧美特大黄一级片片免费| 97久久国产精品女不卡| 亚洲精品久久久久久久久豆丁网| 天天色欧美| 亚洲国产剧情少妇激情| 午夜一级免费毛片| 九九九九九九九九九九精品视频| 日韩三级天堂在线观看| 中文字幕在线免费观看 | 男女激情黄色网址| 久草色在线观看| 中文字幕高清20页视频| 思思久热在线精品66| 成人十八禁日韩欧美一二三| 九九热精品| 99婷婷一区二区| 九热超碰| 91欧美高清| 国产极品美女高潮无套在线观看 | 中文字幕88av在线| 熟女精品va中文字幕| 麻豆成人影音在线| 国产白丝在线| 青娱乐日韩无码| 国产精品懂色tv影视免费观看| 亚洲黄色网址| 日本一二区免费| 日本Xx性爱| 女人天堂av在线播放| 97网址97| 黑丝91视频| 亚洲 欧美日韩 另类| 91中文字幕| 久久精品视| a久久| 99re热有精品视频国产| 日本幼女18+| 久久大精品乱码视频人妻熟女| 激情五月婷| 成人免费福利网站国产| 人人模人人看| juliaann丝袜| 亚洲欧美日韩电影网站一区| 日本免费不卡二区| 大香蕉乱伦视频网| 国产精品成人福利在线| 亚洲人成在线放东京热| 一区二区三区一亚洲中文字幕、综合区灬 | 天天插夜夜操| 麻豆久久一区二区三区| 97伊人超碰| 欧美情色贴图| 九九九九九九九精品视频| 欧美顶级黄色大片免费| 亚洲av无码国产精品字幕| 久久久久久久97| 精品视频一区二区| 亚洲第一色页夜| 97爱爱爱综合| 校园春色之综合网| 91精品黄在线观看| 国产精品午夜高潮呻吟久久av| 亚洲精品乱码线路中文字幕| 蜜乳AV免费观看| 99re在线| 丝袜亚洲综合| 色97干| 日本加勒比无码专区| 久久精品国产97欧美精品亚洲| 另类成人首页一区| 欧色性第一页| 超碰97久久国| 牛牛久久国产精品视频一二三 | 中文字幕99999| 中国黄色特级精品一区二区三区片| 91丝袜激情在线| 99re不伦| 九九九综合精品| 97视频在线观看播放与子乱对白在线……| 欧美日韩成人| 久久婷婷五月综合| 99这里都是精品| www.超碰| 欧美少妇大量自拍视频在线观看| 色性欧美| 狠狠搞 亚洲91| 亚洲91网。| 超碰碰激情97+久| 九九热在线精品视频| 久久超碰av在线| AV男人天堂网| 久久国产精品一区二区| 久久精品无码一区二区三区| 一区二区高清视频| 97香蕉网| 国产男女边吃边摸视频网站| 丰满美女一级毛片在线播放| 日本一级婬片试看三分钟| 综合五月婷婷亚洲一区| 免费看黄视频亚洲网站| 青娱乐国产盛宴视频| 强奸a片网| 五月天激情小说网| 婷婷午夜| 国内精品不卡无毒99999| 国产精品高潮久久AV| 国产精品久久久久久久久久久久久久久久 | 农村女一级毛卡片| 日韩黄色片子| 人人干人人操人人..com| 国产精品成人无码av| 亚洲色人妻综合| 欧中日成人免费影视| 久久人妻少妇| 99日免费视频中文字幕| 蜜臀99久久国产| 人妻少妇久久中文字幕一区二区 麻豆| 91福利网在线观看| 无码最新| 99热最新网址| 成人熟女视频一区二区三区| 97视频在线观看网站| 少妇三p| 色黄污美女啪啪啪免费网站| 欧美少妇性爱网站| 欧美有码激情视频一区二区三区| 97香蕉人人乳| 亚洲色婷婷综合久久久久中文| 九九九热| 免费人成?大片在线播放| 亚洲av在线免费观看| B049AV在线播放| 婷婷激情四射| 狠狠中文字幕| 亚洲精品乱码久久久久久蜜桃麻豆| 精品人人| 超碰97在线色男人??| 精品人妻一区二区三区蜜桃视频| 欧洲亚洲人妻无码高清久久三区四区| 婷婷av在线中文字幕| 大香蕉一线视频| 韩国轻伦国内自拍一区| 97精品人妻一二三四| 精品人妻中文字幕高清| 午夜男女爽爽爽在线视频| 亚洲欧美天堂在线| 91综合天天看| 18禁在线视频| 夜夜操2028| 91N综合网在线| 欧美人与动性人交a| 色婷婷导航| 人妻少妇精品久久久| 久久人妻| 五月丁香综合网| 亚洲性猛| 亚洲AV成人精品网站在AV| A片 AV一级在线播放观看免费| 神马久久网| 五月婷亚洲精品天堂| 九九综合久久| 久久久久网站-538在线视频-欧美永久乱码 | 久久高清欧美国产| 2017大香蕉国产精品久久| 久 久无码人妻AV| 成人国产精品三级A片| 操死我了啊啊啊| 日日操免费视频| 日韩紧密久久| 久久婷婷成人综合色怡春院| 欧美一区二区观看在线| 青青草吊丝| 一区二区三| 色五月网址| 日韩人妻精品| 激情网色| 日韩中文字幕2020| 人人操 欧美| 天天综合,91综合永久| 日本高清视频在线观看黄已三辽| 26uuu国产日韩综合在线观看| 亚州精品一区二区三区香中文字幕在线| 五十路成人在线视频二区三区| 国产精品久久久久无码A√| 欧美午夜色妇色鬼| 2021国产成人精品久久| 操逼日韩无码| 好色美女九七第一页| 精品区国产区一区二区三区| 伊人991| 五月婷网站| 91九九九小逼| 乱性AV| A啊啊在线观看| 久久精品一区二区一8| 色色五月婷| 四虎国产成人精品免费一女五男| 九九碰九九爱97超碰| 色老汉玖玖爱| 91九色丰满高潮| 亚洲一曲日韩精品| 婷婷成人久久久精品| 综合五月天| 久久精品性| 91精品国久久久久久无码| 国产兽交视频在线播放| 少妇免费视频| 天天看片青娱乐| 天天躁日日躁AAAXX| 日韩欧美~中文字| 色综合久久88色综合久久天天| 久久久久ab| 国产精品国产自产高清AV| 91l欧美在线| 久久狠狠色噜噜狠狠狠狠97| 中文伊人大香蕉视频| 男人的天堂va| 欧美一区二区日韩传媒搭讪精品| 私人尤物在线精品不卡| 九九热精品在线| 老司机福利青青草| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 操死我了啊啊啊| 精品一区二区成人| 欧美人妻另类在线| 婷婷成人五月天| 啊啊嗯嗯好爽| 欧美成人亚洲精品| 日本免费人成视频播放120秒| 人人妻人人色| 亚洲**2021在线观看| 欧美青青视频| av无码精品久久久久| 中文字幕成人乱码熟女精品国50| 综合色图,成人综合网| 中文字幕一区二区三区字幕| 日少妇亚洲版| 91久久久久久| 国产乱伦视频污| 二级久久网| www.伪伪| 九九九九热| 少好三P| 少妇一区二区三区在线观看| 国产午夜无码片在线观看影视 | 全国男人天堂网| 天美传媒Av在线| 99综合免费视频| 日韩性爱1级片视频| 亚洲另类色综合网站| 亚洲精品 超碰| 99∨VTV| 人妻丰满熟妇一区二区三| 97视频免费| 国产av热热色| 日本一区三级韩国| 色五月亚洲| 性久久| 国产精品久久久久无码Av网曝门| 黄页网站成人免费| 91在线美女| 久久草在线综合视频| AV不卡在线| 欧美一级国产一级| 狠狠操使劲操| 久久专区| 亚洲色图图片| 熟妇人妻一二三区免费| 中文字幕女同在线| 亚洲情色图片区| 97爱b| 久久999久| 日韩在线97| 亚洲综合一| 清清草影| 熟女高潮合集-永久久久-成人AV| 丰满精品人妻少妇久久字幕| 国产精品久久久777| 97 国产一区| 91强在线播放| 综合情欲网| 女人香蕉久久毛毛片精品| 久草成人影片| 蜜臀va69| 亚洲91色| 免费的黄片有限公司| 91人妻做a观看视频| 国产亚洲精品第一最新| 久久九九99| 五月天色图影视| 很很干很很操| 亚洲射综合网| 男人把坤坤插入女人的下体| 黄色一区三区| 中文字幕激情小说| 2021国产成人精品久久| 国产强奸乱伦xd| 无码 有码 国产18p| 久久久中文| 国产又粗又又黄又猛| 91老熟女老女人国产老太| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 欧美18 在线观看| 国产精品视频在线播放| 91超碰在线播放| 综合 亚洲 欧美| 国产精品探花色| 日韩在线观看中文字幕视频| 神马视频久久久久久| 丝袜美女诱惑 91 视频| 男同专区一区二区三区在线| 欧美日本中字另类在线| 色婷婷影院| 嗯嗯啊啊好大好爽| 在线观看不卡一区二区三区| 久久精品国产亚洲AV片多多| 97九色人妻| 大逼色网站| 一区二区三区免费岛国片| 麻豆天美电影一区二区| 熟妇女伦乱视频视频| 日韩欧美操逼xxx| 欧美顶级黄片AAAAA在线免费看| 理论久久婷婷网 8| 欧洲精品欧洲精品| 爱爱动态60秒| 欧美一区二区三区日韩| 9久久美女首页| 国产精品人妻熟女aⅴ| 中文字幕av色| 亚洲性高潮| 欧美少妇熟女| 国产精品在线免费| 五月天婷婷综合| 91n处女在线观看| 日韩图区 偷拍| 久热99999| 国产精品视频白浆免费|