計算機圖形學編程(使用OpenGL和C++)(第2版)學習筆記 09.天空和背景

天空和背景

對于 3D 場景,通常可以通過在遠處的地平線附近創造一些逼真的效果,來增強其真實感。

我們可以采用天空盒、天空柱(Skydome)或天空穹(Skydome)等技術來模擬天空。

天空盒

天空盒(Skybox)是一種在3D圖形渲染中用于模擬遠處背景的技術。它通過將場景包裹在一個巨大的立方體(或球體)中,并在其內表面貼上紋理來實現。天空盒通常用于表示天空、云、山脈或其他遠景背景。

工作原理:

  1. 立方體模型:天空盒通常是一個立方體,攝像機位于其中心。
  2. 紋理貼圖:立方體的六個面分別貼上對應的紋理(前、后、左、右、上、下),這些紋理拼接在一起形成完整的背景。
  3. 固定位置:天空盒始終跟隨攝像機移動,但不會旋轉或縮放,從而給人一種背景無限遠的錯覺。
  4. 渲染順序:天空盒通常在渲染場景之前繪制,并禁用深度測試,以確保它始終位于場景的最遠處。

優點:

  • 高效:天空盒的實現簡單,性能開銷低。
  • 真實感:可以通過高質量紋理提供逼真的背景效果。
  • 靈活性:適用于各種場景,如白天、夜晚、宇宙等。

缺點:

  • 分辨率限制:紋理分辨率過低可能導致模糊或失真。
  • 接縫問題:如果紋理拼接不當,可能會在立方體的邊緣出現接縫。

天空盒廣泛應用于游戲和虛擬現實中,用于增強場景的沉浸感和視覺效果。

對于天空盒,可以有兩下兩種實現方式:

  1. 采用6張圖片,對應立方體的六個面,分別貼上圖片,然后渲染。
  2. 采用一張圖片,將圖片貼在立方體的六個面,然后渲染。

我們先采用第二種方式,實現天空盒。
下面是將6張圖片放到一張圖片上形成的紋理

其與立方體六個面的關系如下:

實現思路

  1. 創建一個立方體模型,設置其紋理坐標,使其與天空盒紋理對應。
  2. 創建一個紋理對象,將天空盒紋理加載到該對象中。
  3. 在渲染循環中,將紋理對象綁定到著色器,并繪制立方體模型。
  4. 立方體的中心位置始終與攝像機的位置相同。在攝像機移動時,更新立方體的位置,使其始終跟隨攝像機。
  5. 渲染時,不要啟用深度測試,以確保天空盒始終位于場景的最遠處。
  6. 由于攝像機是在內部,而我們定義立方體時,是從外部定義,外部立方體三角形是逆時針,當我們從內部看時,需要將三角形定義為順時針

4

立方體的坐標
float cubeVertexPositions[108] ={	-1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f,  1.0f, -1.0f, -1.0f,  1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f, -1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f,  1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f, -1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,-1.0f,  1.0f, -1.0f, 1.0f,  1.0f, -1.0f, 1.0f,  1.0f,  1.0f,1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f, -1.0f};float cubeTextureCoord[72] ={	1.00f, 0.6666666f, 1.00f, 0.3333333f, 0.75f, 0.3333333f,	// back face lower right0.75f, 0.3333333f, 0.75f, 0.6666666f, 1.00f, 0.6666666f,	// back face upper left0.75f, 0.3333333f, 0.50f, 0.3333333f, 0.75f, 0.6666666f,	// right face lower right0.50f, 0.3333333f, 0.50f, 0.6666666f, 0.75f, 0.6666666f,	// right face upper left0.50f, 0.3333333f, 0.25f, 0.3333333f, 0.50f, 0.6666666f,	// front face lower right0.25f, 0.3333333f, 0.25f, 0.6666666f, 0.50f, 0.6666666f,	// front face upper left0.25f, 0.3333333f, 0.00f, 0.3333333f, 0.25f, 0.6666666f,	// left face lower right0.00f, 0.3333333f, 0.00f, 0.6666666f, 0.25f, 0.6666666f,	// left face upper left0.25f, 0.3333333f, 0.50f, 0.3333333f, 0.50f, 0.0000000f,	// bottom face upper right0.50f, 0.0000000f, 0.25f, 0.0000000f, 0.25f, 0.3333333f,	// bottom face lower left0.25f, 1.0000000f, 0.50f, 1.0000000f, 0.50f, 0.6666666f,	// top face upper right0.50f, 0.6666666f, 0.25f, 0.6666666f, 0.25f, 1.0000000f		// top face lower left};
渲染代碼(部分) 繪制立方體
void display()
{//...//立方體的位置始終同攝像機位置相同mMat = glm::translate(glm::mat4(1.0f), glm::vec3(cameraX, cameraY, cameraZ))glDisable(GL_DEPTH_TEST); // 關閉深度測試glEnable(GL_CULL_FACE); // 開啟面剔除glFrontFace(GL_CCW); // 設置正面為順時針glDrawArrays(GL_TRIANGLES, 0, 36); // 繪制三角形}

頂點著色器代碼

頂點著色器相對簡單,只是將頂點位置和紋理坐標傳遞給片段著色器。

#version 430
// 指定 GLSL 的版本為 4.30layout (location=0) in vec3 position;
layout (location=1) in vec2 texCoord; // 輸入變量,表示頂點的顏色,綁定到 location = 1uniform mat4 mv_matrix;
// uniform 變量,表示模型-視圖矩陣,用于將頂點從模型空間變換到視圖空間uniform mat4 proj_matrix;
// uniform 變量,表示投影矩陣,用于將頂點從視圖空間變換到裁剪空間out vec2 tc;
// 輸出變量,表示頂點的顏色,綁定到 location = 0
void main(void)
// 主函數,計算頂點的最終位置
{gl_Position = proj_matrix * mv_matrix * vec4(position,1.0);// 將頂點位置從模型空間依次變換到視圖空間和裁剪空間// 最終結果存儲在內置變量 gl_Position 中,用于后續的光柵化階段tc = texCoord;}

片段著色器代碼

#version 430
// 指定 GLSL 的版本為 4.30in vec2 tc;out vec4 color;
// 輸出變量,表示片段的最終顏色uniform mat4 mv_matrix;
// uniform 變量,模型-視圖矩陣(未使用)uniform mat4 proj_matrix;
// uniform 變量,投影矩陣(未使用)
layout (binding=0) uniform sampler2D tex0;
//uniform sampler2D tex0;void main(void)
// 主函數,計算片段的最終顏色
{color = texture(tex0, tc);
}

下圖上方能看到立方體的接縫

使用 OpenGL 立方體貼圖

用 OpenGL 立方體貼圖有自己的優點,例如可以減少接縫以及支持環境貼圖
OpenGL 紋理立方體貼圖類似于稍后將要研究的3D 紋理,它們都使用帶有3 個變量的紋理坐標訪問——通常標記為**(s, t, r)**,而不是我們目前為止用到的帶有兩個變量的紋理坐標。OpenGL立方體貼圖的另一個特性是,其中的圖像以紋理圖像的左上角而不是通常的左下角)作為紋理坐標(0, 0, 0)

實現思路

  1. 創建一個立方體模型,無需額外立方體紋理坐標,立方體頂點坐標就是紋理坐標
  2. 創建一個紋理對象(片段著色器中 samplerCube),將6張天空盒圖片加載到該對象中。
  3. 在渲染循環中,將紋理對象綁定到著色器,并繪制立方體模型。
  4. 立方體的中心位置始終與攝像機的位置相同。在攝像機移動時,更新立方體的位置,使其始終跟隨攝像機。
  5. 渲染時,不要啟用深度測試,以確保天空盒始終位于場景的最遠處。
  6. 由于攝像機是在內部,而我們定義立方體時,是從外部定義,外部立方體三角形是逆時針,當我們從內部看時,需要將三角形定義為順時針

采樣器類型

采樣器類型維度主要用途特點
sampler2D2D普通2D紋理采樣? 用于常規2D紋理映射
? 返回(r,g,b,a)四個分量
? 最常用的紋理采樣器類型
samplerCube3D立方體貼圖采樣? 用于環境映射、天空盒等
? 使用3D向量作為采樣坐標
? 六個面的紋理組合成立方體
sampler2DShadow2D陰影貼圖采樣? 專門用于陰影映射
? 返回單個深度值(0.0到1.0)
? 自動進行深度值比較
? 通常與深度紋理配合使用

代碼實現

以下是運行效果

加載6張天空盒圖片
GLuint Utils::loadCubeMap(const char* mapDir) {GLuint textureRef;string xp = mapDir; xp = xp + "/xp.jpg";string xn = mapDir; xn = xn + "/xn.jpg";string yp = mapDir; yp = yp + "/yp.jpg";string yn = mapDir; yn = yn + "/yn.jpg";string zp = mapDir; zp = zp + "/zp.jpg";string zn = mapDir; zn = zn + "/zn.jpg";textureRef = SOIL_load_OGL_cubemap(xp.c_str(), xn.c_str(), yp.c_str(), yn.c_str(), zp.c_str(), zn.c_str(),SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);if (textureRef == 0) cout << "didnt find cube map image file" << endl;//	glBindTexture(GL_TEXTURE_CUBE_MAP, textureRef);// reduce seams//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);return textureRef;
}
渲染立方體

此部份與之前代碼基本相同,只是綁定 GL_TEXTURE_CUBE_MAP

    glActiveTexture(GL_TEXTURE0);                    // 激活紋理單元 glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture); // 綁定紋理對象glDisable(GL_DEPTH_TEST);          // 關閉深度測試glEnable(GL_CULL_FACE);            // 開啟面剔除glFrontFace(GL_CCW);               // 設置正面為順時針
頂點著色器

此處采用 mat4(mat3(mv_matrix)) 來將模型-視圖矩陣轉換為模型-視圖矩陣,去除平移部分,這樣確保天空盒與攝像機始終處于同一位置


#version 430
// 指定 GLSL 的版本為 4.30
layout (location=0) in vec3 position; // 輸入變量,表示頂點的三維位置,綁定到 location = 0out vec3 texCoord; // 輸出變量uniform mat4 mv_matrix;
// uniform 變量,表示模型-視圖矩陣,用于將頂點從模型空間變換到視圖空間
uniform mat4 proj_matrix;
// uniform 變量,表示投影矩陣,用于將頂點從視圖空間變換到裁剪空間
void main(void)
// 主函數,計算頂點的最終位置
{mat4 vrot_matrix=mat4(mat3(mv_matrix)); //remove the translation partgl_Position = proj_matrix * vrot_matrix * vec4(position,1.0);// 將頂點位置從模型空間依次變換到視圖空間和裁剪空間// 最終結果存儲在內置變量 gl_Position 中,用于后續的光柵化階段texCoord = position;
}
片段著色器

片段著色器中 只是進行紋理采樣

#version 430
// 指定 GLSL 的版本為 4.30in vec3 texCoord; // 輸入變量,表示頂點對應的紋理坐標
out vec4 fragColor; // 輸出變量,表示片元最終的顏色
uniform samplerCube texCube; // 紋理采樣器,表示立方體貼圖
void main(void)
{fragColor = texture(texCube, texCoord); // 采樣立方體貼圖,得到片元的顏色
}

環境貼圖

環境貼圖概述

環境貼圖是一種模擬物體表面反射周圍環境的渲染技術,主要用于實現鏡面反射、金屬材質等效果。

工作原理

反射原理

  • 通過采集物體周圍環境的圖像信息
  • 根據視角和表面法線計算反射向量
  • 使用反射向量從立方體貼圖中采樣顏色

主要應用場景

  1. 鏡面物體

    • 鏡子
    • 金屬表面
    • 光滑水面
  2. 金屬材質

    • 車身漆面
    • 金屬器皿
    • 珠寶首飾

優缺點

優點
  • 渲染效率高
  • 可以實現逼真的反射效果
  • 適合實時渲染
缺點
  • 無法實現真實的反射折射
  • 環境貼圖分辨率限制細節表現
  • 難以實現動態場景的實時反射

常見變體

  1. 球形環境貼圖

    • 使用單張球形投影的圖像
    • 實現簡單但有畸變
  2. 立方體環境貼圖

    • 使用六張圖構成立方體
    • 質量更好,無畸變問題
  3. 動態環境貼圖

    • 實時渲染場景到環境貼圖
    • 可實現動態反射效果

相應實現原理

頂點著色器

#version 430
// 指定 GLSL 的版本為 4.30layout (location=0) in vec3 position;
layout (location=1) in vec2 texCoord; // 輸入變量,表示頂點的顏色,綁定到 location = 1
layout (location=2) in vec3 normal; // 輸入變量,表示頂點的法線,綁定到 location = 2
// 輸入變量,表示頂點的三維位置,綁定到 location = 0uniform mat4 mv_matrix;
// uniform 變量,表示模型-視圖矩陣,用于將頂點從模型空間變換到視圖空間uniform mat4 proj_matrix;
// uniform 變量,表示投影矩陣,用于將頂點從視圖空間變換到裁剪空間uniform mat4 normal_matrix;
out vec2 tc;out vec3 fragNormal;out vec3 vertPos; 
void main(void)
// 主函數,計算頂點的最終位置
{vertPos=(mv_matrix*vec4(position,1.0)).xyz;gl_Position = proj_matrix * mv_matrix * vec4(position,1.0);// 將頂點位置從模型空間依次變換到視圖空間和裁剪空間// 最終結果存儲在內置變量 gl_Position 中,用于后續的光柵化階段tc = texCoord;fragNormal = mat3(normal_matrix) * normal;// 將法線從模型空間變換到視圖空間}

片段著色器

核心代碼為 vec3 R = -reflect(V, N); 其中 reflect 函數的第一個參數為入射向量,第二個參數為法線向量,返回值為反射向量。

#version 430
// 指定 GLSL 的版本為 4.30in vec2 tc;in vec3 fragNormal;
in vec3 vertPos;
out vec4 color;
// 輸出變量,表示片段的最終顏色uniform mat4 mv_matrix;
// uniform 變量,模型-視圖矩陣(未使用)uniform mat4 proj_matrix;
// uniform 變量,投影矩陣(未使用)
layout (binding=0) uniform samplerCube tex0;void main(void)
// 主函數,計算片段的最終顏色
{vec3 N = normalize(fragNormal);vec3 V = normalize(-vertPos); // 視線方向vec3 R = -reflect(V, N); // 反射方向color = texture(tex0, R);// 采樣環境貼圖,獲取反射顏色//color=vec4(R,1.0); // 僅用于調試,顯示反射方向
}

參考

  1. 學習筆記完整代碼下載
  2. OpenGL shader開發實戰學習筆記:第十一章 立方體貼圖和天空盒_opengl 天空盒-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Leetcode 每日一題】1550. 存在連續三個奇數的數組

問題背景 給你一個整數數組 a r r arr arr&#xff0c;請你判斷數組中是否存在連續三個元素都是奇數的情況&#xff1a;如果存在&#xff0c;請返回 t r u e true true&#xff1b;否則&#xff0c;返回 f a l s e false false。 數據約束 1 ≤ a r r . l e n g t h ≤ 10…

面試題解析 | C++空類的默認成員函數(附生成條件與底層原理)

在C面試中&#xff0c;“空類默認生成哪些成員函數”是考察對象模型和編譯器行為的高頻題目。許多資料僅提及前4個函數&#xff0c;但完整的答案應包含6個核心函數&#xff0c;并結合C標準深入解析其生成規則與使用場景。 一、空類默認生成的6大成員函數 1. ?缺省構造函數? …

視頻編解碼學習7之視頻編碼簡介

視頻編碼技術發展歷程與主流編碼標準詳解 視頻編碼技術是現代數字媒體領域的核心技術之一&#xff0c;它通過高效的壓縮算法大幅減少了視頻數據的體積&#xff0c;使得視頻的存儲、傳輸和播放變得更加高效和經濟。從早期的H.261標準到最新的AV1和H.266/VVC&#xff0c;視頻編碼…

使用Stable Diffusion(SD)中,步數(Steps)指的是什么?該如何使用?

Ⅰ定義&#xff1a; 在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;步數&#xff08;Steps&#xff09; 指的是采樣過程中的迭代次數&#xff0c;也就是模型從純噪聲一步步“清晰化”圖像的次數。你可以理解為模型在畫這張圖時“潤色”的輪數。 Ⅱ步數的具體作…

消息隊列如何保證消息可靠性(kafka以及RabbitMQ)

目錄 RabbitMQ保證消息可靠性 生產者丟失消息 MQ丟失消息 消費端丟失了數據 Kakfa的消息可靠性 生產者的消息可靠性 Kakfa的消息可靠性 消費者的消息可靠性 RabbitMQ保證消息可靠性 生產者丟失消息 1.事務消息保證 生產者在發送消息之前&#xff0c;開啟事務消息隨后生…

如何查看項目是否支持最新 Android 16K Page Size 一文匯總

前幾天剛聊過 《Google 開始正式強制 Android 適配 16 K Page Size》 之后&#xff0c;被問到最多的問題是「怎么查看項目是否支持 16K Page Size」 &#xff1f;其實有很多直接的方式&#xff0c;但是最難的是當你的項目有很多依賴時&#xff0c;怎么知道這個「不支持的動態庫…

HttpServletResponse的理解

HttpServletResponse 是 Java Servlet API 提供的一個接口 常用方法 方法用途setContentType(String type)設置響應內容類型&#xff08;如 "application/json"、"text/html"&#xff09;setStatus(int sc)設置響應狀態碼&#xff08;如 200、404&#x…

可靈 AI:開啟 AI 視頻創作新時代

在當今數字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的速度滲透到各個領域&#xff0c;尤其是在內容創作領域&#xff0c;AI 的應用正引發一場革命性的變革。可靈 AI 作為快手團隊精心打造的一款前沿 AI 視頻生成工具&#xff0c;宛如一顆璀璨的…

用 AltSnap 解鎖 Windows 窗口管理的“魔法”

你有沒有遇到過這樣的場景&#xff1a;電腦屏幕上堆滿了窗口&#xff0c;想快速調整它們的大小和位置&#xff0c;卻只能拖來拖去&#xff0c;費時又費力&#xff1f;或者你是個多任務狂魔&#xff0c;喜歡一邊寫代碼、一邊看文檔、一邊刷視頻&#xff0c;卻發現 Windows 自帶的…

深度策略梯度算法PPO

一、策略梯度核心思想和原理 從時序差分算法Q學習到深度Q網絡&#xff0c;這些算法都側重于學習和優化價值函數&#xff0c;屬于基于價值的強化學習算法&#xff08;Value-based&#xff09;。 1. 基于策略方法的主要思想&#xff08;Policy-based&#xff09; 基于價值類方…

【LaTeX】Word插入LaTeX行間公式如何編號和對齊

在 Word 文檔中插入公式&#xff0c;需要用到 LaTeX \LaTeX LATE?X 。但遺憾的是&#xff0c;Word 只支持部分 LaTeX \LaTeX LATE?X 語法&#xff0c;這就導致很多在 Markdown 能正常渲染的公式在 Word 中無法正常顯示。 “內嵌”和“顯示” 首先介紹一下 Word 的“內嵌”…

互聯網大廠Java面試實戰:Spring Boot到微服務的技術問答解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

spring boot3.0自定義校驗注解:文章狀態校驗示例

文章目錄 Spring Boot 自定義校驗注解&#xff1a;狀態校驗示例一、創建 State 注解步驟&#xff1a;1. 創建自定義注解&#xff1a;2. 實現校驗邏輯&#xff1a; 二、 實現自定義校驗步驟:1. 在實體類中使用自定義校驗注解 State&#xff1a;2. 添加 State 注解&#xff1a; 總…

無侵入式彈窗體驗_探索 Chrome 的 Close Watcher API

1. 引言 在網頁開發中,彈窗(Popup)是一種常見的交互方式,用于提示用戶進行操作、確認信息或展示關鍵內容。然而,傳統的 JavaScript 彈窗方法如 alert()、confirm() 和 prompt() 存在諸多問題,包括阻塞主線程、樣式不可定制等。 為了解決這些問題,Chrome 瀏覽器引入了 …

調出事件查看器界面的4種方法

方法1. 方法2. 方法3. 方法4.

Ubuntu 安裝遠程桌面連接RDP方式

1. 安裝 XFCE4 桌面環境 如果你的 Ubuntu 系統默認使用 GNOME 或其它桌面環境&#xff0c;可以安裝輕量級的 XFCE4&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies 說明&#xff1a;xfce4-goodies 包含額外的插件和工具&#xff08;如面板插件、終端等&a…

LWIP傳輸層協議筆記

傳輸協議簡介 文件/圖片/視頻 都是一堆二進制數據 經過傳輸層來傳輸 這兩種協議有什么區別呢&#xff1f; 傳輸層的TCP/UDP三個步驟 TCP使用傳輸流程 1、三次握手 作用&#xff1a;三次握手就是建立連接的過程 2、傳輸數據 作用&#xff1a;建立連接完成之后&#xff…

數據分析與邏輯思維:六步解決業務難題;參考書籍《數據分析原理:6步解決業務分析難題 (周文全, 黃怡媛, 馬炯雄)》

文章目錄 一、懂業務&#xff1a;業務背景與邏輯前提1.1 明確業務目標與問題定義1.2 培養批判性思維與高于業務視角 二、定指標&#xff1a;構建科學的指標體系2.1 指標拆解與維度分析2.2 典型指標體系案例&#xff1a;用戶與業務視角 三、選方法&#xff1a;匹配業務需求的分析…

開啟WSL的鏡像網絡模式

開啟WSL的鏡像網絡模式 前提 Windows主機系統版本高于Windows 11 22H2。WLS版本>2.0。 可輸入wsl --version查看當前系統wsl版本。 修改設置 圖形界面修改 在開始菜單中搜索&#xff1a;wsl settings&#xff0c;結果如下圖所示&#xff1a; 點擊“打開”&#xff0…

Python爬蟲第20節-使用 Selenium 爬取小米商城空調商品

目錄 前言 一、 本文目標 二、環境準備 2.1 安裝依賴 2.2 配置 ChromeDriver 三、小米商城頁面結構分析 3.1 商品列表結構 3.2 分頁結構 四、Selenium 自動化爬蟲實現 4.1 腳本整體結構 4.2 代碼實現 五、關鍵技術詳解 5.1 Selenium 啟動與配置 5.2 頁面等待與異…