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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL天空盒skybox

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL天空盒skybox 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

痛徹的感悟

天空盒可能的難題

天空盒代碼


痛徹的感悟

今天考完試才發現自己和別人的差距還挺大的,四五六班下午的考試題目,我很快做了出來,但是自己的班級的考試題目,我竟然一道都沒有成功!!!所以我決定把我之前準備的代碼公布一下,也希望對一些人有所幫助吧。


天空盒可能的難題

  • SOIL2的配置
  • glm的配置
  • mac的xcode里面還有res資源庫的配置
  • 主要參考網站:立方體貼圖,往下翻有源碼
  • 前面的理論部分參考我的好友博客:碼辣香鍋

天空盒代碼

項目目錄概覽:(天空盒六張圖片可以在上述?立方體貼圖?鏈接下載到)

或者在我的Github上找到GitHub - NaughtyRacoon/GLskybox

?

main.cpp

//main.cpp#include <iostream> #include <vector> using namespace std; //GLEW #define GLEW_STATIC #include <GL/glew.h>//GLFW #include <GLFW/glfw3.h>//GLM #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtx/rotate_vector.hpp>//利用旋轉所需頭文件#include "SOIL2/SOIL2.h" #include "SOIL2/stb_image.h"#include "camera.h" #include "Shader.h" #include "light.h"const GLint WIDTH = 800, HEIGHT = 600; void KeyCallback(GLFWwindow *window , int key ,int scancode, int action,int mode);//退出函數 void ScrollCallback(GLFWwindow *window,double xOffset,double yOffset);//滾輪移動 void MouseCallback(GLFWwindow *window,double xPos,double yPos);//鼠標移動void DoMovement();//獲得當前這幀下按鍵處理,每次poll event之后才會有鍵盤操作GLuint loadTexture(GLchar* path); GLuint loadCubemap(vector<const GLchar*> faces);bool keys[1024];//臨時變量存儲所有鍵盤操作 Camera camera(glm::vec3(0.0f,0.0f,2.0f));//實例化,往后看GLfloat deltaTime = 0.0f; GLfloat lastTime = 0.0f; GLfloat lastX = WIDTH/2.0f; GLfloat lastY = HEIGHT/2.0f; bool firstMouse = true; int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // must for Mac glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//不讓窗口變動大小//大寫開頭是變量 GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL", nullptr, nullptr);//創建窗口if (nullptr == window) { std::cout<<"Failed to create GLFW window"<<std::endl;glfwTerminate(); return -1; }// next two lines are for mac retina displayint screenWidth, screenHeight;glfwGetFramebufferSize( window, &screenWidth, &screenHeight);glfwMakeContextCurrent( window );glfwSetKeyCallback(window, KeyCallback);glfwSetCursorPosCallback(window, MouseCallback);glfwSetScrollCallback(window, ScrollCallback);glewExperimental = GL_TRUE;if (GLEW_OK != glewInit() ) { std::cout << "Failed to initialise GLEW" << std::endl; return -1; }glEnable(GL_DEPTH_TEST);//深度測試開啟glDepthFunc(GL_LESS);//小于就改變glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glViewport( 0, 0, screenWidth, screenHeight );Shader ourShader = Shader("res/shaders/core.vs","res/shaders/core.fs");Shader lightShader = Shader("res/shaders/light.vs","res/shaders/light.fs");Shader skyboxShader = Shader("res/shaders/skybox.vs","res/shaders/skybox.fs");// Light lightModel = Light();GLfloat cubeVertices[]={//position //法向量nomal-0.5f,-0.5f,-0.5f, 0.0f,0.0f,-1.0f,0.5f,-0.5f,-0.5f, 0.0f,0.0f,-1.0f,0.5f, 0.5f,-0.5f, 0.0f,0.0f,-1.0f,0.5f, 0.5f,-0.5f, 0.0f,0.0f,-1.0f,-0.5f, 0.5f,-0.5f, 0.0f,0.0f,-1.0f,-0.5f,-0.5f,-0.5f, 0.0f,0.0f,-1.0f,-0.5f,-0.5f,0.5f, 0.0f,0.0f,1.0f,0.5f,-0.5f,0.5f, 0.0f,0.0f,1.0f,0.5f, 0.5f,0.5f, 0.0f,0.0f,1.0f,0.5f, 0.5f,0.5f, 0.0f,0.0f,1.0f,-0.5f, 0.5f,0.5f, 0.0f,0.0f,1.0f,-0.5f,-0.5f,0.5f, 0.0f,0.0f,1.0f,-0.5f, 0.5f, 0.5f, -1.0f,0.0f,0.0f,-0.5f, 0.5f,-0.5f, -1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f, -1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f, -1.0f,0.0f,0.0f,-0.5f,-0.5f, 0.5f, -1.0f,0.0f,0.0f,-0.5f, 0.5f, 0.5f, -1.0f,0.0f,0.0f,0.5f, 0.5f, 0.5f, 1.0f,0.0f,0.0f,0.5f, 0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f,-0.5f, 0.5f, 1.0f,0.0f,0.0f,0.5f, 0.5f, 0.5f, 1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f, 0.0f,-1.0f,0.0f,0.5f,-0.5f,-0.5f, 0.0f,-1.0f,0.0f,0.5f,-0.5f, 0.5f, 0.0f,-1.0f,0.0f,0.5f,-0.5f, 0.5f, 0.0f,-1.0f,0.0f,-0.5f,-0.5f, 0.5f, 0.0f,-1.0f,0.0f,-0.5f,-0.5f,-0.5f, 0.0f,-1.0f,0.0f,-0.5f,0.5f,-0.5f, 0.0f,1.0f,0.0f,0.5f,0.5f,-0.5f, 0.0f,1.0f,0.0f,0.5f,0.5f, 0.5f, 0.0f,1.0f,0.0f,0.5f,0.5f, 0.5f, 0.0f,1.0f,0.0f,-0.5f,0.5f, 0.5f, 0.0f,1.0f,0.0f,-0.5f,0.5f,-0.5f, 0.0f,1.0f,0.0f,};GLfloat skyboxVertices[] = {// Positions-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};GLfloat vertices[]={//position //color-0.5f,-0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f, 0.5f,-0.5f, 1.0f,0.0f,0.0f,0.5f, 0.5f,-0.5f, 1.0f,0.0f,0.0f,-0.5f, 0.5f,-0.5f, 1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f, 1.0f,0.0f,0.0f,-0.5f,-0.5f,0.5f, 0.0f,1.0f,0.0f,0.5f,-0.5f,0.5f, 0.0f,1.0f,0.0f,0.5f, 0.5f,0.5f, 0.0f,1.0f,0.0f,0.5f, 0.5f,0.5f, 0.0f,1.0f,0.0f,-0.5f, 0.5f,0.5f, 0.0f,1.0f,0.0f,-0.5f,-0.5f,0.5f, 0.0f,1.0f,0.0f,-0.5f, 0.5f, 0.5f, 0.0f,0.0f,1.0f,-0.5f, 0.5f,-0.5f, 0.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f, 0.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f, 0.0f,0.0f,1.0f,-0.5f,-0.5f, 0.5f, 0.0f,0.0f,1.0f,-0.5f, 0.5f, 0.5f, 0.0f,0.0f,1.0f,0.5f, 0.5f, 0.5f, 1.0f,1.0f,0.0f,0.5f, 0.5f,-0.5f, 1.0f,1.0f,0.0f,0.5f,-0.5f,-0.5f, 1.0f,1.0f,0.0f,0.5f,-0.5f,-0.5f, 1.0f,1.0f,0.0f,0.5f,-0.5f, 0.5f, 1.0f,1.0f,0.0f,0.5f, 0.5f, 0.5f, 1.0f,1.0f,0.0f,-0.5f,-0.5f,-0.5f, 1.0f,0.0f,1.0f,0.5f,-0.5f,-0.5f, 1.0f,0.0f,1.0f,0.5f,-0.5f, 0.5f, 1.0f,0.0f,1.0f,0.5f,-0.5f, 0.5f, 1.0f,0.0f,1.0f,-0.5f,-0.5f, 0.5f, 1.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f, 1.0f,0.0f,1.0f,-0.5f,0.5f,-0.5f, 0.0f,1.0f,1.0f,0.5f,0.5f,-0.5f, 0.0f,1.0f,1.0f,0.5f,0.5f, 0.5f, 0.0f,1.0f,1.0f,0.5f,0.5f, 0.5f, 0.0f,1.0f,1.0f,-0.5f,0.5f, 0.5f, 0.0f,1.0f,1.0f,-0.5f,0.5f,-0.5f, 0.0f,1.0f,1.0f};GLuint VAO,VBO;glGenVertexArrays(1,&VAO);glGenBuffers(1,&VBO);//綁定 VAO 和 VBOglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);//告訴顯卡需要預留空間//傳輸數據glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//static多次讀不改數據,dynamic多次讀并且修改//設置VAO//location=0的變量,每次讀三個浮點數,賦值到position,每隔三個浮點數取一個當作位置信息glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof(GLfloat),(GLvoid *)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof(GLfloat),(GLvoid *)(3*sizeof(GLfloat)));glEnableVertexAttribArray(1);//下面是解綁操作glBindBuffer(GL_ARRAY_BUFFER,0); //VBO解綁glBindVertexArray(0); //VAO解綁// Setup cube VAOGLuint cubeVAO, cubeVBO;glGenVertexArrays(1, &cubeVAO);glGenBuffers(1, &cubeVBO);glBindVertexArray(cubeVAO);glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), &cubeVertices, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glBindVertexArray(0);// Setup skybox VAOGLuint skyboxVAO, skyboxVBO;glGenVertexArrays(1, &skyboxVAO);glGenBuffers(1, &skyboxVBO);glBindVertexArray(skyboxVAO);glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);glBindVertexArray(0);vector<const GLchar*> faces;faces.push_back("res/images/right.jpg");faces.push_back("res/images/left.jpg");faces.push_back("res/images/top.jpg");faces.push_back("res/images/bottom.jpg");faces.push_back("res/images/back.jpg");faces.push_back("res/images/front.jpg");GLuint skyboxTexture = loadCubemap(faces);//draw loop 繪制循環 while (!glfwWindowShouldClose (window)) {GLfloat currentTime = glfwGetTime();deltaTime = currentTime - lastTime;lastTime = currentTime;glViewport(0, 0, screenWidth, screenHeight);glfwPollEvents();DoMovement();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// Draw scene as normalourShader.use();glm::mat4 model;glm::mat4 view = camera.GetViewMatrix();glm::mat4 projection = glm::perspective(camera.GetZoom(), (float)screenWidth/(float)screenHeight, 0.1f, 100.0f);glUniformMatrix4fv(glGetUniformLocation(ourShader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(glGetUniformLocation(ourShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(glGetUniformLocation(ourShader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection));glUniform3f(glGetUniformLocation(ourShader.Program, "cameraPos"), camera.GetPosition().x, camera.GetPosition().y, camera.GetPosition().z);// CubesglBindVertexArray(cubeVAO);glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);// Draw skybox as lastglDepthFunc(GL_LEQUAL);skyboxShader.use();view = glm::mat4(glm::mat3(camera.GetViewMatrix()));glUniformMatrix4fv(glGetUniformLocation(skyboxShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(glGetUniformLocation(skyboxShader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection));// skybox cubeglBindVertexArray(skyboxVAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);glfwSwapBuffers (window);}glfwTerminate(); glDeleteVertexArrays(1,&skyboxVAO); glDeleteBuffers(1,&skyboxVBO);glDeleteVertexArrays(1,&VAO);glDeleteBuffers(1,&VBO);return 0;}void KeyCallback(GLFWwindow *window,int key,int scancode,int action,int mode) {if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){glfwSetWindowShouldClose(window, GL_TRUE);}if(key>=0 && key<1024){if(action==GLFW_PRESS){keys[key]=true;}else if(action==GLFW_RELEASE){keys[key]=false;}} }void DoMovement() {if(keys[GLFW_KEY_W] ){camera.ProcessKeyboard(FORWARD, deltaTime);}if(keys[GLFW_KEY_S] ){camera.ProcessKeyboard(BACKWORD, deltaTime);}if(keys[GLFW_KEY_A] ){camera.ProcessKeyboard(LEFT, deltaTime);}if(keys[GLFW_KEY_D] ){camera.ProcessKeyboard(RIGHT, deltaTime);} }void MouseCallback(GLFWwindow *window,double xPos,double yPos) {//取消第一次變換,讓圖形一開始就出現在屏幕上if (firstMouse) {lastX = xPos;lastY = yPos;firstMouse = false;}GLfloat xOffset = xPos - lastX;GLfloat yOffset = lastY - yPos;lastX = xPos;lastY = yPos;camera.ProcessMouseMovement(xOffset, yOffset);}void ScrollCallback(GLFWwindow *window,double xOffset,double yOffset) {camera.ProcessMouseScroll(yOffset);}GLuint loadCubemap(vector<const GLchar*> faces) {GLuint textureID;glGenTextures(1, &textureID);glActiveTexture(GL_TEXTURE0);int width,height;unsigned char* image;glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);for(GLuint i = 0; i < faces.size(); i++){image = SOIL_load_image(faces[i], &width, &height, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);}glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);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);glBindTexture(GL_TEXTURE_CUBE_MAP, 0);return textureID; } GLuint loadTexture(GLchar* path) {//Generate texture ID and load texture dataGLuint textureID;glGenTextures(1, &textureID);int width,height;unsigned char* image = SOIL_load_image(path, &width, &height, 0, SOIL_LOAD_RGB);// Assign texture to IDglBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);// ParametersglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glBindTexture(GL_TEXTURE_2D, 0);SOIL_free_image_data(image);return textureID; }

light.h

#ifndef Light_h #define Light_h#include <GL/glew.h>GLfloat vertices_light[] = {//position-0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f, 0.5f,-0.5f,0.5f, 0.5f,-0.5f,-0.5f, 0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f,-0.5f-0.5f,-0.5f,-0.5f-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f }; class Light { public:Light(){this->update();}void Draw(Shader &shader){glBindVertexArray(this->VAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);} private:GLuint VAO,VBO;void update(){glGenVertexArrays(1,&this->VAO);glGenBuffers(1,&this->VBO);//connect the VAO and VBOglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,this->VBO);glBufferData(GL_ARRAY_BUFFER,sizeof(vertices_light),vertices_light,GL_STATIC_DRAW);glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(GLvoid *)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);glBindVertexArray(0);} };#endif

mesh.h

#pragma once#include <string> #include <fstream> #include <sstream> #include <iostream> #include <vector> using namespace std;#include <GL/glew.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp>struct Vertex {glm::vec3 Position;glm::vec3 Normal;glm::vec2 TexCoords; };struct Texture {GLuint id;string type;aiString path; };class Mesh { public:vector<Vertex> vertices;vector<GLuint> indices;vector<Texture> textures;Mesh(vector<Vertex> vertices, vector<GLuint> indices, vector<Texture> textures){this->vertices = vertices;this->indices = indices;this->textures = textures;// Now that we have all the required data, set the vertex buffers and its attribute pointers.this->setupMesh();}// Render the meshvoid Draw(Shader shader){// Bind appropriate texturesGLuint diffuseNr = 1;GLuint specularNr = 1;for(GLuint i = 0; i < this->textures.size(); i++){glActiveTexture(GL_TEXTURE0 + i); // Active proper texture unit before binding// Retrieve texture number (the N in diffuse_textureN)stringstream ss;string number;string name = this->textures[i].type;if(name == "texture_diffuse")ss << diffuseNr++; // Transfer GLuint to streamelse if(name == "texture_specular")ss << specularNr++; // Transfer GLuint to streamnumber = ss.str();// Now set the sampler to the correct texture unitglUniform1i(glGetUniformLocation(shader.Program, (name + number).c_str()), i);// And finally bind the textureglBindTexture(GL_TEXTURE_2D, this->textures[i].id);}// Also set each mesh's shininess property to a default value (if you want you could extend this to another mesh property and possibly change this value)glUniform1f(glGetUniformLocation(shader.Program, "material.shininess"), 16.0f);// Draw meshglBindVertexArray(this->VAO);glDrawElements(GL_TRIANGLES, this->indices.size(), GL_UNSIGNED_INT, 0);glBindVertexArray(0);// Always good practice to set everything back to defaults once configured.for (GLuint i = 0; i < this->textures.size(); i++){glActiveTexture(GL_TEXTURE0 + i);glBindTexture(GL_TEXTURE_2D, 0);}}private:/* Render data */GLuint VAO, VBO, EBO;/* Functions */// Initializes all the buffer objects/arraysvoid setupMesh(){// Create buffers/arraysglGenVertexArrays(1, &this->VAO);glGenBuffers(1, &this->VBO);glGenBuffers(1, &this->EBO);glBindVertexArray(this->VAO);// Load data into vertex buffersglBindBuffer(GL_ARRAY_BUFFER, this->VBO);// A great thing about structs is that their memory layout is sequential for all its items.// The effect is that we can simply pass a pointer to the struct and it translates perfectly to a glm::vec3/2 array which// again translates to 3/2 floats which translates to a byte array.glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(Vertex), &this->vertices[0], GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indices.size() * sizeof(GLuint), &this->indices[0], GL_STATIC_DRAW);// Set the vertex attribute pointers// Vertex PositionsglEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)0);// Vertex NormalsglEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Normal));// Vertex Texture CoordsglEnableVertexAttribArray(2);glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, TexCoords));glBindVertexArray(0);} };

model.h

#pragma once // Std. Includes #include <string> #include <fstream> #include <sstream> #include <iostream> #include <map> #include <vector> using namespace std; // GL Includes #include <GL/glew.h> // Contains all the necessery OpenGL includes #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include "SOIL2/SOIL2.h" #include "SOIL2/stb_image.h" #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h>#include "mesh.h"GLint TextureFromFile(const char* path, string directory);class Model { public:/* Functions */// Constructor, expects a filepath to a 3D model.Model(GLchar* path){this->loadModel(path);}// Draws the model, and thus all its meshesvoid Draw(Shader shader){for(GLuint i = 0; i < this->meshes.size(); i++)this->meshes[i].Draw(shader);}private:/* Model Data */vector<Mesh> meshes;string directory;vector<Texture> textures_loaded; // Stores all the textures loaded so far, optimization to make sure textures aren't loaded more than once./* Functions */// Loads a model with supported ASSIMP extensions from file and stores the resulting meshes in the meshes vector.void loadModel(string path){// Read file via ASSIMPAssimp::Importer importer;const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);// Check for errorsif(!scene || scene->mFlags == AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero{cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << endl;return;}// Retrieve the directory path of the filepaththis->directory = path.substr(0, path.find_last_of('/'));// Process ASSIMP's root node recursivelythis->processNode(scene->mRootNode, scene);}// Processes a node in a recursive fashion. Processes each individual mesh located at the node and repeats this process on its children nodes (if any).void processNode(aiNode* node, const aiScene* scene){// Process each mesh located at the current nodefor(GLuint i = 0; i < node->mNumMeshes; i++){// The node object only contains indices to index the actual objects in the scene.// The scene contains all the data, node is just to keep stuff organized (like relations between nodes).aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];this->meshes.push_back(this->processMesh(mesh, scene));}// After we've processed all of the meshes (if any) we then recursively process each of the children nodesfor(GLuint i = 0; i < node->mNumChildren; i++){this->processNode(node->mChildren[i], scene);}}Mesh processMesh(aiMesh* mesh, const aiScene* scene){// Data to fillvector<Vertex> vertices;vector<GLuint> indices;vector<Texture> textures;// Walk through each of the mesh's verticesfor(GLuint i = 0; i < mesh->mNumVertices; i++){Vertex vertex;glm::vec3 vector; // We declare a placeholder vector since assimp uses its own vector class that doesn't directly convert to glm's vec3 class so we transfer the data to this placeholder glm::vec3 first.// Positionsvector.x = mesh->mVertices[i].x;vector.y = mesh->mVertices[i].y;vector.z = mesh->mVertices[i].z;vertex.Position = vector;// Normalsvector.x = mesh->mNormals[i].x;vector.y = mesh->mNormals[i].y;vector.z = mesh->mNormals[i].z;vertex.Normal = vector;// Texture Coordinatesif(mesh->mTextureCoords[0]) // Does the mesh contain texture coordinates?{glm::vec2 vec;// A vertex can contain up to 8 different texture coordinates. We thus make the assumption that we won't// use models where a vertex can have multiple texture coordinates so we always take the first set (0).vec.x = mesh->mTextureCoords[0][i].x;vec.y = mesh->mTextureCoords[0][i].y;vertex.TexCoords = vec;}elsevertex.TexCoords = glm::vec2(0.0f, 0.0f);vertices.push_back(vertex);}// Now wak through each of the mesh's faces (a face is a mesh its triangle) and retrieve the corresponding vertex indices.for(GLuint i = 0; i < mesh->mNumFaces; i++){aiFace face = mesh->mFaces[i];// Retrieve all indices of the face and store them in the indices vectorfor(GLuint j = 0; j < face.mNumIndices; j++)indices.push_back(face.mIndices[j]);}// Process materialsif(mesh->mMaterialIndex >= 0){aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];// We assume a convention for sampler names in the shaders. Each diffuse texture should be named// as 'texture_diffuseN' where N is a sequential number ranging from 1 to MAX_SAMPLER_NUMBER.// Same applies to other texture as the following list summarizes:// Diffuse: texture_diffuseN// Specular: texture_specularN// Normal: texture_normalN// 1. Diffuse mapsvector<Texture> diffuseMaps = this->loadMaterialTextures(material, aiTextureType_DIFFUSE, "texture_diffuse");textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());// 2. Specular mapsvector<Texture> specularMaps = this->loadMaterialTextures(material, aiTextureType_SPECULAR, "texture_specular");textures.insert(textures.end(), specularMaps.begin(), specularMaps.end());}// Return a mesh object created from the extracted mesh datareturn Mesh(vertices, indices, textures);}// Checks all material textures of a given type and loads the textures if they're not loaded yet.// The required info is returned as a Texture struct.vector<Texture> loadMaterialTextures(aiMaterial* mat, aiTextureType type, string typeName){vector<Texture> textures;for(GLuint i = 0; i < mat->GetTextureCount(type); i++){aiString str;mat->GetTexture(type, i, &str);// Check if texture was loaded before and if so, continue to next iteration: skip loading a new textureGLboolean skip = false;for(GLuint j = 0; j < textures_loaded.size(); j++){if(std::strcmp(textures_loaded[j].path.C_Str(), str.C_Str()) == 0){textures.push_back(textures_loaded[j]);skip = true; // A texture with the same filepath has already been loaded, continue to next one. (optimization)break;}}if(!skip){ // If texture hasn't been loaded already, load itTexture texture;texture.id = TextureFromFile(str.C_Str(), this->directory);texture.type = typeName;texture.path = str;textures.push_back(texture);this->textures_loaded.push_back(texture); // Store it as texture loaded for entire model, to ensure we won't unnecesery load duplicate textures.}}return textures;} };GLint TextureFromFile(const char* path, string directory) {//Generate texture ID and load texture datastring filename = string(path);filename = directory + '/' + filename;GLuint textureID;glGenTextures(1, &textureID);int width,height;unsigned char* image = SOIL_load_image(filename.c_str(), &width, &height, 0, SOIL_LOAD_RGB);// Assign texture to IDglBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);// ParametersglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glBindTexture(GL_TEXTURE_2D, 0);SOIL_free_image_data(image);return textureID; }

camera.h

#ifndef camera_h #define camera_h#include <vector> #define GLEW_STATIC #include <GL/glew.h>#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> enum Camera_Movement//解決朝向問題 {FORWARD,BACKWORD,LEFT,RIGHT }; const GLfloat YAW = -90.0f; //從外往里視角,水平角 const GLfloat PITCH = 0.0f; //俯仰角 const GLfloat ZOOM = 45.0f; //視域,控制縮放 const GLfloat SPEED = 6.0f; //設置初始速度 const GLfloat SENSITIVITY = 0.25f; //靈敏度class Camera { public://camera位置信息Camera(glm::vec3 position = glm::vec3(0.0f,0.0f,0.0f),glm::vec3 up = glm::vec3(0.0f,1.0f,0.0f),GLfloat yaw=YAW,GLfloat pitch = PITCH):front(glm::vec3(0.0f,0.0f,-1.0f)),zoom(ZOOM),movementSpeed(SPEED),mouseSensitivity(SENSITIVITY){this->position = position;this->worldUP = up;this->yaw = yaw;this->pitch = pitch;this->updateCameraVectors();}glm::mat4 GetViewMatrix()//獲得私有變量的值{return glm::lookAt(this->position,this->position + this->front,this->up);}GLfloat GetZoom() //獲得私有變量的值{return this->zoom;}glm::vec3 GetPosition(){return this->position;}void ProcessKeyboard(Camera_Movement direction,GLfloat deltaTime){GLfloat velocity = this->movementSpeed * deltaTime;if (direction == FORWARD){this->position+=this->front*velocity;}if (direction == BACKWORD){this->position-=this->front*velocity;}if (direction == LEFT){this->position-=this->right*velocity;}if (direction == RIGHT){this->position+=this->right*velocity;}}void ProcessMouseScroll(GLfloat yOffset){if ( this->zoom >= 1.0f && this->zoom <= 45.0f ){this->zoom += yOffset;}if ( this->zoom <= 1.0f ){this->zoom = 1.0f;}if ( this->zoom >= 45.0f ){this->zoom = 45.0f;}}void ProcessMouseMovement(GLfloat xOffset,GLfloat yOffset){//靈敏度調節xOffset *= this->mouseSensitivity;yOffset *= this->mouseSensitivity;this->yaw += xOffset;this->pitch += yOffset;this->updateCameraVectors();//變化完更新相機指針} private:GLfloat yaw;GLfloat pitch;GLfloat zoom;GLfloat movementSpeed;GLfloat mouseSensitivity;glm::vec3 position;glm::vec3 front;glm::vec3 right;glm::vec3 up;glm::vec3 worldUP;void updateCameraVectors(){glm::vec3 front;front.x=cos(glm::radians(this->pitch)) * cos(glm::radians(this->yaw));front.y=sin(glm::radians(this->pitch));front.z=cos(glm::radians(this->pitch)) * sin(glm::radians(this->yaw));this->front = glm::normalize(front);this->right=glm::normalize(glm::cross(this->front,this->worldUP));this->up = glm::normalize(glm::cross(this->right,this->front));} };#endif /* camera_h */

Shader.h

#pragma once#include <string> #include <fstream> #include <sstream> #include <iostream>#include <GL/glew.h> #include <GLFW/glfw3.h>class Shader {GLuint vertex,fragment; public:GLuint Program;Shader(const GLchar *vertexPath,const GLchar *fragmentPath){std::string vertexCode;std::string fragmentCode;std::ifstream vShaderFile;std::ifstream fShaderFile;vShaderFile.exceptions(std::ifstream::badbit);fShaderFile.exceptions(std::ifstream::badbit);try {vShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);std::stringstream vShaderStream,fShaderStream;vShaderStream<<vShaderFile.rdbuf();fShaderStream<<fShaderFile.rdbuf();vShaderFile.close();fShaderFile.close();vertexCode = vShaderStream.str();fragmentCode = fShaderStream.str();} catch (std::ifstream::failure e) {std::cout<<"ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ"<<std::endl;}const GLchar *vShaderCode = vertexCode.c_str();const GLchar *fShaderCode = fragmentCode.c_str();GLint success;GLchar infoLog[512];vertex = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertex,1,&vShaderCode,NULL);glCompileShader(vertex);glGetShaderiv(vertex,GL_COMPILE_STATUS,&success);if (!success) {glGetShaderInfoLog(vertex,512,NULL,infoLog);std::cout<<"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"<<infoLog<<std::endl;}fragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment,1,&fShaderCode,NULL);glCompileShader(fragment);glGetShaderiv(fragment,GL_COMPILE_STATUS,&success);if (!success) {glGetShaderInfoLog(fragment,512,NULL,infoLog);std::cout<<"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"<<infoLog<<std::endl;}this->Program= glCreateProgram();glAttachShader(this->Program,vertex);glAttachShader(this->Program,fragment);glLinkProgram(this->Program);glGetProgramiv(this->Program,GL_LINK_STATUS,&success);if (!success) {glGetProgramInfoLog(this->Program,512,NULL,infoLog);std::cout<<"ERROR::SHADER::PROGRAM::LINKING_FAILED\n"<<infoLog<<std::endl;}}~Shader(){glDetachShader(this->Program,vertex);glDetachShader(this->Program,fragment);glDeleteShader(vertex);glDeleteShader(fragment);glDeleteProgram(this->Program);}void use(){glUseProgram(this->Program);} };

core.vs

#version 330 core layout(location = 0) in vec3 position; //layout(location = 1) in vec3 ourColor; layout(location = 1) in vec3 normal;//out vec3 vertexColor; out vec3 Normal; out vec3 FragPos; uniform mat4 transform;//頂點位置修改 uniform mat4 view; uniform mat4 projection;void main() {gl_Position = projection * view * transform * vec4(position,1.0f);FragPos =vec3 (transform * vec4(position,1.0f)); // vertexColor = ourColor;Normal = mat3(transpose(inverse(transform)))*normal;}

core.fs

#version 330 core out vec4 color; //in vec3 vertexColor; in vec3 Normal; in vec3 FragPos;//uniform運行過程中從CPU傳給我們的 uniform float time; uniform vec3 LightPos; uniform vec3 ViewPos;struct Material {float diffuse;float specular;}; uniform Material material;void main() { //color = vec4(vertexColor,1.0f);vec3 lightDirection = normalize(LightPos-FragPos);//光源方向vec3 viewDirection = normalize(ViewPos-FragPos);//視野方向vec3 norm = normalize(Normal);//ambient環境部分 // vec3 ambient = 0.5 * vertexColor;//diffusefloat diff = material.diffuse * max(dot(norm,lightDirection),0.0f);//vec3 diffuse = diff * vertexColor;//specularvec3 halfAngle = normalize(viewDirection + lightDirection);float spec = material.specular * pow(max (dot(norm,halfAngle),0.0f),64.0f);//vec3 specular = spec * vertexColor;color = vec4(1.0f,0.0f,0.0f,1.0f);}

light.vs

#version 330 core layout(location = 0) in vec3 position; uniform mat4 transform;//頂點位置修改 uniform mat4 view; uniform mat4 projection; void main() {gl_Position = projection * view * transform * vec4(position,1.0f); }

light.fs

#version 330 core out vec4 color; void main() { color = vec4(1.0f,1.0f,1.0f,1.0f);}

skybox.vs

#version 330 core layout (location = 0) in vec3 position; out vec3 TexCoords;uniform mat4 projection; uniform mat4 view;void main() {gl_Position = projection * view * vec4(position, 1.0);TexCoords = position; }

skybox.fs

#version 330 core in vec3 TexCoords; out vec4 color;uniform samplerCube skybox;void main() {color = texture(skybox, TexCoords); }

總結

以上是生活随笔為你收集整理的OpenGL天空盒skybox的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成人资源在线观看 | 久久99热久久99精品 | 国产日韩欧美在线看 | 91在线www | 国产成人精品在线播放 | 国产精品高清免费在线观看 | 国产精品日韩在线 | 热久久国产 | 国产午夜精品理论片在线 | 黄色一级大片在线免费看国产一 | 国产色在线观看 | www.色婷婷.com| 色在线亚洲 | 国产资源站| 91片黄在线观 | 亚州成人av在线 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 色播激情五月 | 色噜噜日韩精品欧美一区二区 | 色吧av色av | 日本精品在线 | 欧美影院久久 | 国产又粗又长的视频 | 国产a免费 | 亚洲九九爱 | 亚洲免费av片| 国产国产人免费人成免费视频 | 亚洲国产精品va在线看黑人动漫 | 久草在线观看资源 | 色综合久久五月天 | 久久久久久毛片精品免费不卡 | 在线电影日韩 | 日本在线观看中文字幕无线观看 | 亚洲va欧洲va国产va不卡 | 婷婷av综合| 香蕉久久久久 | 中文字幕免费成人 | 国产精品免费一区二区三区在线观看 | www.国产高清 | 97精品国产 | 视频在线播放国产 | 国产一级大片在线观看 | 国产精品久久av | 激情综合电影网 | 毛片在线网 | 99国产情侣在线播放 | 成人黄色小说网 | 中文字幕日韩在线播放 | 免费色视频网站 | 久久视频在线视频 | 国产精品伦一区二区三区视频 | 欧美日韩精品综合 | 亚洲黄色av一区 | 欧美激情精品久久久久久免费 | 久久久久成人精品免费播放动漫 | 久久伦理网 | 一区二区中文字幕在线观看 | 中文字幕永久免费 | 成人小视频在线 | 九九精品视频在线看 | 久久精品视频网站 | 日韩区欠美精品av视频 | 欧美在线视频一区二区三区 | 国产高清视频免费观看 | 91麻豆精品国产自产 | 九月婷婷人人澡人人添人人爽 | 青青河边草免费观看完整版高清 | 国产亚洲精品成人av久久ww | 欧美激情精品久久久久久免费 | 久久久五月婷婷 | 91亚洲精品久久久 | 日韩一区二区三区在线看 | 国产精品久久久精品 | 色婷婷综合久色 | 久久免费国产视频 | 激情视频国产 | 在线观看精品黄av片免费 | 欧美老女人xx | 欧美动漫一区二区三区 | 狠狠夜夜 | 久久精品精品电影网 | 成人av.com| av网站播放| 国产精品99久久久久久人免费 | 国产在线精品播放 | 国产精品乱码久久久久久1区2区 | 黄色亚洲大片免费在线观看 | 手机在线看片日韩 | 缴情综合网五月天 | 夜夜操综合网 | 国产日韩欧美在线免费观看 | 亚洲一级片在线看 | 亚洲一区欧美精品 | 日本在线观看一区二区三区 | 日日弄天天弄美女bbbb | 中文字幕在线观看视频一区二区三区 | 久久成人黄色 | 麻豆观看 | 天天曰天天曰 | 国产精品原创 | 人人干干人人 | 欧美日bb| 成年人黄色在线观看 | 99r在线播放 | 久久久黄色免费网站 | 毛片永久新网址首页 | 国产剧情在线一区 | 国产福利网站 | 精品亚洲男同gayvideo网站 | 亚洲午夜久久久久久久久久久 | 美女黄频在线观看 | 日韩在线免费 | 色视频在线免费观看 | 碰天天操天天 | 国产色网| 99免费在线视频 | 91成人在线视频 | 在线黄色免费av | 蜜桃视频色| 久久99精品视频 | 97色综合 | 亚洲不卡av一区二区三区 | 成人片在线播放 | 色av男人的天堂免费在线 | 国产视频99 | 99精品国产兔费观看久久99 | 人人添人人澡 | 日韩精品一区二区三区视频播放 | 超碰av在线播放 | 欧美资源在线观看 | 特黄特色特刺激视频免费播放 | 久精品在线 | 日韩欧美视频在线 | 欧美色插| 丝袜美女视频网站 | 日韩激情一二三区 | 精品视频999 | 日韩精品第一区 | 五月天亚洲激情 | 亚洲欧美日韩一级 | 中文在线a天堂 | 久久黄色精品视频 | 99精品亚洲 | 久久精品欧美日韩精品 | 国产精品嫩草69影院 | 亚洲视频免费 | 国产精彩视频一区二区 | 狠狠综合久久av | 国产精品视频免费在线观看 | 精品国产一区二区三区四区在线观看 | 国产伦精品一区二区三区四区视频 | 久久综合久久综合九色 | 五月天激情视频在线观看 | 欧美aa级| 激情文学丁香 | 国产欧美日韩视频 | 久久av观看 | 国产精品 国内视频 | 国产精品99久久久久久久久久久久 | 欧美日韩高清 | 99精品视频99 | 国产一卡二卡在线 | 日韩丝袜在线观看 | 成人精品电影 | 精品久久免费看 | 成人免费视频网站在线观看 | 免费看国产a | 免费日韩视频 | 中字幕视频在线永久在线观看免费 | 麻豆一二三精选视频 | 成人毛片a | 伊人婷婷色 | 国产污视频在线观看 | 日日夜夜狠狠干 | 99久久精品免费看国产免费软件 | 天天干天天草 | 国产99久 | 久久免费视频观看 | 色婷婷国产 | 草久中文字幕 | 超碰在线人 | 国产精品久久久久久久久久免费看 | 国产一区二区三区视频在线 | 二区三区中文字幕 | 91视频大全 | 国产精品区一区 | 国产高清一 | 久久99久久久久久 | 日韩在线电影观看 | 亚洲日韩精品欧美一区二区 | 久久伊人国产精品 | 久久国产午夜精品理论片最新版本 | 精品久久久久一区二区国产 | 六月激情丁香 | 国产精品久久久久久吹潮天美传媒 | 国产精品女 | 精品视频123区在线观看 | 国内精品毛片 | 手机看片中文字幕 | 免费69视频 | 国产精品你懂的在线观看 | 精品在线视频一区二区三区 | 99精品国产一区二区三区麻豆 | 日日夜夜天天综合 | 黄色影院在线免费观看 | 国产成人精品一区二区三区福利 | 2023年中文无字幕文字 | 99r在线| 麻豆一区在线观看 | 精品一区二区久久久久久久网站 | 最近中文字幕在线中文高清版 | 国产在线精品观看 | 人人涩 | 涩涩网站在线观看 | 国产黄色美女 | 欧美日韩不卡一区 | 日韩精品免费一区 | 亚洲成a人片77777潘金莲 | 综合激情 | 91麻豆国产福利在线观看 | 久久激情视频 久久 | av不卡网站 | 日韩视频一区二区在线观看 | 91精品国产综合久久婷婷香蕉 | 欧美日韩性生活 | 这里有精品在线视频 | 国产99久久久久久免费看 | 国产中出在线观看 | 亚洲精品视频偷拍 | 午夜精品一区二区三区免费 | 国产麻豆视频在线观看 | 区一区二区三在线观看 | 2018亚洲男人天堂 | 国产色在线视频 | 97香蕉视频 | 99精品国产福利在线观看免费 | 国产明星视频三级a三级点| 91麻豆精品久久久久久 | 国产a网站 | 福利电影一区二区 | 日韩三级免费 | 日韩午夜电影网 | 亚洲一级片免费观看 | 久久久久这里只有精品 | 欧美成人基地 | 久久视频这里只有精品 | 日日夜夜婷婷 | 久久精品99国产精品亚洲最刺激 | 久久久久久97三级 | 国产精品嫩草69影院 | 91香蕉亚洲精品 | 日韩剧情| 天天草综合| 中文在线www | 久久这里只有精品视频首页 | 欧美国产精品久久久久久免费 | 亚洲三级黄色 | 色国产精品一区在线观看 | 中文字幕视频网 | 色狠狠婷婷 | 免费观看www小视频的软件 | 久久久精品 一区二区三区 国产99视频在线观看 | 成年人在线播放视频 | 最近免费中文字幕mv在线视频3 | 天干啦夜天干天干在线线 | 五月婷婷综合在线观看 | 国产高清专区 | 免费在线黄网 | 91免费国产在线观看 | 日日夜夜天天操 | www黄色大片 | 在线观看亚洲精品 | 国产1区2 | 亚洲一区视频在线播放 | 国产精品热 | 高清色免费| 97人人澡人人爽人人模亚洲 | 国内揄拍国产精品 | 久久午夜影院 | 亚洲国产中文字幕在线观看 | 国产手机精品视频 | 1区2区视频 | 国产在线看 | 在线免费观看不卡av | 国产婷婷一区二区 | 亚洲天天做 | 人人涩| 国产精品国产三级国产aⅴ入口 | 99热这里只有精品久久 | 欧美日本中文字幕 | 99精品在线播放 | 日韩高清观看 | 久久久久麻豆v国产 | 天天干天天搞天天射 | 国产69精品久久99不卡的观看体验 | 久久精品99 | 国产69精品久久久久99尤 | 精品99久久 | 成人亚洲网 | 日本美女xx | 亚洲aⅴ在线 | 婷婷五月色综合 | 97国产情侣爱久久免费观看 | japanesexxxxfreehd乱熟| 探花视频免费观看高清视频 | 国产精品原创在线 | 91久久精品一区 | av国产在线观看 | 久草在线观看 | 天堂av影院 | 成年人视频免费在线播放 | 国产亚洲精品日韩在线tv黄 | 久久久影院| 一区二区精品在线视频 | 欧美激情视频在线免费观看 | 精品国精品自拍自在线 | 九九免费在线观看 | 日韩精品一区二区三区中文字幕 | 亚洲蜜桃av | 亚洲一区二区高潮无套美女 | 在线视频国产区 | 国产精品日韩在线播放 | 欧美性受极品xxxx喷水 | av电影不卡 | 最新国产精品久久精品 | 欧美性黄网官网 | 射综合网 | 91在线亚洲 | 九九色在线观看 | 999电影免费在线观看 | 黄色大全视频 | 中文不卡视频 | 96av麻豆蜜桃一区二区 | 婷婷色亚洲 | 天天天天天天干 | www.日日日.com| 久久综合成人 | 国产人成一区二区三区影院 | 免费看网站在线 | 日日干夜夜骑 | 国产美女免费观看 | 911精品美国片911久久久 | 不卡电影一区二区三区 | 久久久www成人免费精品 | 人人躁 | 亚洲 欧洲av | 91福利视频免费观看 | 日韩免费在线看 | 四虎在线免费 | 夜色资源网 | 777视频在线观看 | 精品免费久久久久 | 99国产精品 | 久久一区二区三区四区 | h文在线观看免费 | 美女在线免费观看视频 | 日日激情 | 国内精品久久天天躁人人爽 | 久草在线资源观看 | 国产精品 中文在线 | 国产精品激情偷乱一区二区∴ | 久综合网 | 日韩欧美国产激情在线播放 | 91日韩精品一区 | 日韩电影一区二区在线观看 | 国产精品一区二区 91 | 黄色视屏免费在线观看 | 成人在线播放网站 | 中文字幕 国产视频 | 久久怡红院 | 免费福利影院 | 日韩精品在线视频免费观看 | 日本久久综合网 | 日韩精品免费一区二区三区 | 2023年中文无字幕文字 | 国产欧美日韩精品一区二区免费 | 久草视频首页 | 美女网站在线观看 | 久草视频在线观 | 婷婷狠狠操 | 手机在线小视频 | 精品国产伦一区二区三区观看方式 | 亚洲精品乱码久久久久久 | 天天躁日日躁狠狠 | 日韩成人黄色 | 狠狠色丁香婷婷综合基地 | 蜜桃麻豆www久久囤产精品 | 欧美精品国产综合久久 | av黄色av| 夜夜爱av | 国产精品18久久久 | 国产精品久久久久影院 | 免费在线观看成人av | 日日插日日干 | 区一区二在线 | 国产高清第一页 | 欧美成人xxxxxxxx | 久久精品香蕉视频 | 国产精品观看视频 | 国产黄色免费电影 | 欧洲视频一区 | 国产成人免费网站 | 一区二区三高清 | 久久精品欧美一区二区三区麻豆 | 日韩精品电影在线播放 | 极品久久久| 美女黄频在线观看 | 国产福利电影网址 | 精品福利av| 国产精品123 | 西西444www大胆高清图片 | 国产99久久 | 五月婷婷综合激情 | 中文字幕在线观看不卡 | 国内外成人在线 | 亚洲婷婷综合色高清在线 | 波多野结衣在线观看一区二区三区 | 在线亚洲日本 | 成人在线黄色电影 | 91精品办公室少妇高潮对白 | 久久神马影院 | av黄免费看| 中文字幕在线观看第三页 | 国产小视频免费观看 | 久草视频网 | 国产在线观看99 | 在线免费观看国产视频 | 欧美性色综合网 | 日韩在线大片 | 99视频国产精品免费观看 | 狠狠色丁香婷婷 | 午夜视频在线瓜伦 | www.超碰97.com | 丁香伊人网| 日韩电影在线一区二区 | 亚洲精品欧美精品 | 免费黄色激情视频 | 亚洲精品97 | 亚洲精品视频免费在线观看 | 中文字幕成人一区 | 国产精品久久久久久久久毛片 | 久久久精品视频成人 | 91一区二区三区久久久久国产乱 | 国产精品久久久av久久久 | 日本三级久久 | 午夜丰满寂寞少妇精品 | 欧美乱淫视频 | 国产精品99久久久久 | 精品毛片久久久久久 | 亚洲精品一区二区网址 | 91香蕉视频好色先生 | 久久九九国产精品 | 99久久久免费视频 | 91精品国产一区二区在线观看 | 久久精品99北条麻妃 | 欧美久久久久久 | 在线播放亚洲 | 黄污网站在线 | 国产免费av一区二区三区 | 亚洲综合色丁香婷婷六月图片 | 国产激情小视频在线观看 | 国产综合小视频 | 亚洲精品在线免费 | 日韩免费b | 中文电影网 | 五月婷婷综合激情网 | 成人黄色在线视频 | 园产精品久久久久久久7电影 | 久久久三级视频 | 91香蕉视频黄色 | 99热这里只有精品国产首页 | 国产精品热视频 | 国产成免费视频 | 91成人精品一区在线播放69 | 欧美另类交在线观看 | 国产精品原创 | 91福利视频久久久久 | 在线天堂中文在线资源网 | 精品国产免费一区二区三区五区 | 久草在线资源视频 | 日韩三级久久 | 亚洲乱码在线观看 | 日韩中文字幕91 | 日韩av资源站 | 欧美在线aa | 成人va视频 | 亚洲成人第一区 | 一区二区三区高清在线观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 五月天综合网站 | av午夜电影 | 少妇性色午夜淫片aaaze | 成人h动漫精品一区二 | 国产精品系列在线观看 | 91九色自拍 | 免费成人结看片 | 精品亚洲一区二区三区 | 日本中文字幕在线观看 | 久久精品草 | 欧美最猛性xxxxx免费 | 精品欧美一区二区精品久久 | 五月婷网| 高清av中文在线字幕观看1 | 狠狠狠色丁香综合久久天下网 | 久久久久久久久久久久99 | 亚洲国产成人在线 | 男女男视频 | 日韩精品免费在线视频 | 欧美一区二区日韩一区二区 | 精品你懂的 | 久久综合婷婷综合 | 色婷婷视频在线 | 国产免费二区 | 白丝av免费观看 | 成人免费在线视频 | 天天操夜夜操夜夜操 | 玖玖精品在线 | 亚洲精品www | 亚洲最新av在线网站 | 激情五月色播五月 | 欧美日韩国产亚洲乱码字幕 | 成人h视频在线播放 | 亚洲视屏在线播放 | 91超级碰| www.五月天婷婷 | 亚洲女同videos | 色com网 | www激情久久| 色夜视频| 黄色成人av在线 | 激情综合网五月婷婷 | 国产成人免费在线 | 色婷婷激情四射 | 99久久精品免费看国产麻豆 | 久久免费毛片视频 | 人人舔人人爱 | 欧洲精品视频一区二区 | 欧美色图东方 | 久久精品99国产精品 | 日韩午夜大片 | 日韩欧美精品在线 | www..com黄色片 | 一区二区三区日韩在线观看 | 中文字幕在线播放一区二区 | 99久久精品免费看国产 | 在线观看午夜av | 国产久视频 | 蜜桃视频在线观看一区 | 亚洲一级电影在线观看 | 国产精品男女视频 | 色婷婷福利视频 | 99免在线观看免费视频高清 | 在线观看视频国产一区 | 国产精品第一 | 91麻豆精品91久久久久同性 | 亚洲精品免费在线播放 | 亚洲精品视频在线看 | 精品国产成人 | 午夜国产福利在线 | 日韩手机在线 | 国产精品成人a免费观看 | av一区二区在线观看中文字幕 | 免费看国产曰批40分钟 | 免费黄色av. | 五月天综合| 精品国产理论 | 国产在线欧美日韩 | 中文字幕在线高清 | 国产日产av | 中文字幕日韩国产 | 爱射综合| 在线国产视频 | 波多野结衣小视频 | 国产精品一区二区av日韩在线 | 久久精品一区二区三区中文字幕 | 免费在线播放黄色 | 久久综合九色综合欧美狠狠 | 中文字幕乱码视频 | 午夜久久久精品 | 色综合久久久久久久久五月 | 麻豆国产在线播放 | 97久久精品午夜一区二区 | 丁香资源影视免费观看 | 久久久精品在线观看 | 欧美色888 | 一区二区视频在线看 | 日韩h在线观看 | 超级碰碰碰免费视频 | 日韩欧美视频在线播放 | 中文字幕免费观看全部电影 | 在线观看视频三级 | 成人午夜剧场在线观看 | 国产精品久久久久影视 | 国产中文字幕91 | 中文字幕av专区 | 精品人人爽 | 97超碰精品 | 久久婷婷精品 | 青草视频免费观看 | 国产在线v | 免费毛片aaaaaa | 国产在线精品福利 | 欧美aa一级 | 国产精品毛片一区二区 | 中文字幕日韩国产 | 色综合www| 亚洲无线视频 | 亚洲女人天堂成人av在线 | 91精彩视频在线观看 | 久久午夜鲁丝片 | 日本黄色免费观看 | 国产精品永久免费在线 | 麻花豆传媒mv在线观看网站 | 狠狠久久 | 国产不卡一 | 91日韩精品一区 | 日免费视频 | 久草香蕉在线 | 中文字幕免费观看视频 | 久久久久久国产一区二区三区 | 人人爱人人爽 | 在线免费观看视频一区二区三区 | 色噜噜狠狠狠狠色综合久不 | bbb搡bbb爽爽爽 | 久久精品免费播放 | 午夜丰满寂寞少妇精品 | 97超碰色 | 怡红院av久久久久久久 | 黄色三级免费 | h视频在线看 | avav99| 人人澡人人添人人爽一区二区 | 亚洲一级电影视频 | 国产裸体永久免费视频网站 | 国产精品美女久久久 | 二区三区在线视频 | 日精品在线观看 | 日韩免费观看av | 久久首页| 日韩精品一区二区三区在线播放 | 国产a网站 | 久久99久久99精品中文字幕 | 色中色综合 | 免费h漫在线观看 | 四虎永久免费 | 中文字幕视频一区二区 | 91热在线| 视频一区在线免费观看 | 日韩成人精品在线观看 | 国产小视频在线免费观看 | 在线观看免费日韩 | 亚洲精品久久久蜜桃 | 国产精品自产拍在线观看桃花 | 亚洲专区中文字幕 | 国产不卡免费视频 | 五月婷婷av在线 | 国产永久免费高清在线观看视频 | 国产一级91 | 中文字幕第一页在线视频 | 五月综合激情网 | 中文av字幕在线观看 | 中文字幕一区二区在线观看 | 在线观看国产高清视频 | 国产最新在线观看 | 国产破处在线播放 | 国产精品久久久久9999吃药 | 国产91精品一区二区绿帽 | 美女久久久久久久 | 日本精品久久久久中文字幕5 | 在线观看视频国产 | 欧美另类xxxx | 91av在| 日韩成人免费在线电影 | 少妇bbbb搡bbbb桶 | 国产精品久久99 | 久久久久国产精品厨房 | 日韩v在线91成人自拍 | 久久综合中文字幕 | 亚洲高清在线精品 | 成人超碰在线 | 国产不卡在线视频 | 天天干天天操人体 | 在线免费av网 | 久久久久免费看 | 国产精品久久久久久久av电影 | 9免费视频 | 91成人网页版 | 久草色在线观看 | 久久色网站 | 久久国产成人午夜av影院宅 | 网址你懂的在线观看 | 午夜视频在线观看一区二区三区 | 91高清在线看 | 天天操狠狠操 | 欧美极品裸体 | 91久久精| 一级成人在线 | a一片一级 | 亚洲三级性片 | 国产亚洲精品久久久久久无几年桃 | 国产精品视频地址 | 亚洲综合激情五月 | 午夜久久网站 | 精品伦理一区二区三区 | 欧美激精品| 黄色小说在线观看视频 | 欧美激情综合五月 | 日日干网址 | 91精品久久久久久综合乱菊 | www.com黄色 | 黄色在线免费观看网址 | 99久久9 | 香蕉一区| 日韩视频在线观看视频 | 精品国产免费久久 | 丁香五月缴情综合网 | a在线观看视频 | 久久综合成人网 | 91传媒视频在线观看 | 色就是色综合 | 中文字幕在线观看播放 | 日日草视频| 久久精品国产一区二区 | 久久99精品一区二区三区三区 | www.xxxx欧美 | 日韩久久精品一区二区 | 亚洲精品动漫久久久久 | 2021久久| 91九色在线播放 | 成年人在线免费看片 | 97电影手机 | 精品v亚洲v欧美v高清v | 天天操天天操天天操天天操天天操天天操 | 婷婷视频在线 | av成人在线看 | 日韩一片| 国产偷v国产偷∨精品视频 在线草 | 激情综合网五月婷婷 | 国产一区在线观看视频 | 91黄色小视频 | a视频在线看 | 日韩高清在线一区 | 欧美男同视频网站 | 久久精品一区二区三 | www黄com| 一区二区三区在线不卡 | 999一区二区三区 | 2021国产精品视频 | 国产亚洲精品久久久久久大师 | 免费看成年人 | 色妞色视频一区二区三区四区 | 精品国产a| av综合av| 麻豆国产露脸在线观看 | av成人免费在线看 | 夜夜躁天天躁很躁波 | 特级大胆西西4444www | 成人一级免费电影 | 天天摸天天舔 | 国产精品毛片久久 | 91麻豆.com| 久久久免费精品 | 国产精品视频在线观看 | 国产福利小视频在线 | 6699私人影院 | 99riav1国产精品视频 | 天天操夜夜叫 | 激情黄色av | 欧美精品一区在线 | 91精品免费在线 | 国产视频日本 | 岛国大片免费视频 | 亚洲精品videossex少妇 | 欧美日韩一区二区在线 | 国产一区免费视频 | 久久精品国产精品亚洲 | 99精品国产福利在线观看免费 | 在线看欧美 | 综合久久久久久久 | 免费看日韩片 | 国产三级视频在线 | 久久久免费电影 | 久久久污 | 懂色av一区二区三区蜜臀 | 国产免费久久精品 | 麻豆国产精品永久免费视频 | 成人性生交大片免费看中文网站 | 天天操夜夜叫 | 亚洲色图美腿丝袜 | 91最新国产 | 玖玖爱免费视频 | 久久婷婷精品 | 色狠狠综合天天综合综合 | 亚洲成av| 精品在线观看一区二区 | 日韩在线观看中文字幕 | 久久久久久久久久久网站 | 手机在线视频福利 | 国产成人一区二区啪在线观看 | 国产色在线观看 | 久久久网址 | 在线观看91精品视频 | 婷婷丁香色| 欧美性生交大片免网 | 婷婷精品视频 | 成人黄色大片在线免费观看 | 黄色毛片电影 | 制服丝袜亚洲 | 国产一区二区三区免费视频 | 色香天天 | 欧美亚洲一级片 | 亚洲精品欧美精品 | 亚洲精品视 | 麻豆精品传媒视频 | 国产精品资源网 | 免费观看v片在线观看 | 九色精品免费永久在线 | 黄色av免费看 | 黄色成人av网址 | 麻豆精品视频在线观看免费 | 亚洲国产福利视频 | 日韩在线不卡视频 | 99在线精品免费视频九九视 | 免费a级观看 | 国内精品久久久久久 | 美女国产 | 国产理论片在线观看 | 天堂在线一区二区 | 最新国产福利 | 五月婷婷激情 | 天天天干 | 免费高清男女打扑克视频 | 丁香婷婷久久久综合精品国产 | 免费在线91 | 狠狠狠综合 | 美女网色 | 免费日韩一区二区三区 | 日韩欧美一区二区三区在线观看 | 久久国产影院 | 亚洲欧美色婷婷 | 国产视频亚洲视频 | 一区二区三区国产精品 | 色综合久久88 | 丁香视频在线观看 | 成人午夜影院在线观看 | 亚洲电影一区二区 | 国产在线97 | 国产又粗又猛又色又黄视频 | 国产99免费视频 | 激情久久综合网 | 国产小视频福利在线 | 亚洲国产一区二区精品专区 | a√天堂中文在线 | 国产成人av在线影院 | 在线亚洲播放 | 久久久久久久久久久高潮一区二区 | 日韩亚洲国产精品 | 国产97av| 精品v亚洲v欧美v高清v | 国产在线播放一区二区三区 | 亚洲午夜精品久久久 | 成年人在线免费看视频 | 午夜精品一二区 | 黄色日视频 | 黄色国产高清 | 人人爱人人做人人爽 | 成人a在线观看高清电影 | 免费成人av网站 | 碰超人人 | 久艹在线免费观看 | 人人插人人费 | 天天操天天操天天操天天操天天操天天操 | 91精品麻豆| 午夜精品视频免费在线观看 | 国产精品入口麻豆 | 怡春院av| 国产高清av在线播放 | 最近中文字幕国语免费av | 国产破处在线视频 | 国产va在线观看免费 | 99视频一区二区 | 521色香蕉网站在线观看 | 中文字幕 国产精品 | 五月天最新网址 | 香蕉成人在线视频 | 免费看三级网站 | 欧美性受极品xxxx喷水 | v片在线播放 | 久久精品电影院 | 911免费视频| 免费国产在线精品 | 免费在线观看的av网站 | 911久久 | 不卡电影一区二区三区 | 就色干综合 | 六月久久婷婷 | 国内精品视频在线 | 成年人黄色av | 亚洲特级毛片 | 成人国产精品入口 | 欧美日韩免费网站 | 2017狠狠干| 精品视频中文字幕 | 日韩一级电影在线观看 | 国产在线视频一区二区三区 | 久久免费看a级毛毛片 | 日本一区二区高清不卡 | 国产 日韩 中文字幕 | 人人网av | 亚洲精品在线视频 | 人人爽爽人人 | 亚洲国产精品99久久久久久久久 | 国产精品ⅴa有声小说 | 五月婷婷综合在线观看 | 日韩av网站在线播放 | 国产精品一二 | 国产97在线看 | 国产 色 | 国产日韩欧美中文 | 久久人人爽人人爽人人 | 欧美精品乱码久久久久久按摩 | 四虎成人网 | 久久99亚洲精品 | 国产精品五月天 | 欧美在线视频一区二区 | 日韩欧美在线视频一区二区 | 婷婷色综合色 | 中文字幕精品一区久久久久 | 国产福利电影网址 | 九色精品免费永久在线 | 美女视频黄在线观看 | 超碰97.com| 国内视频在线观看 | 在线观看精品视频 | 久久久久久综合 | 在线性视频日韩欧美 | 日韩欧美精品一区二区三区经典 | 国产精品九九视频 | 亚洲精品色 | 久久伦理电影网 | 亚洲最快最全在线视频 | av国产在线观看 | 日韩av看片| 久久综合五月婷婷 | 久99久在线视频 | 精品免费在线视频 | 亚洲国产中文字幕 | 国产视频欧美视频 | 欧美精品亚州精品 | 免费久久99精品国产婷婷六月 | 欧美久久久久 | 欧美 亚洲 另类 激情 另类 | av超碰免费在线 | 五月激情久久久 | 国产精品99久久久久 | 国产精品美女久久久久久久久 | 中文字幕在线观看第三页 | 亚洲精品高清在线观看 | 久久新视频 | 久久精品一区二区国产 | 99久精品 | 天天综合久久 | 久久视讯 | 久久国产女人 | 久久综合五月天婷婷伊人 | www.夜夜操.com | 婷婷深爱五月 | 日日躁天天躁 | 天天精品视频 | 搡bbbb搡bbb视频 | 欧美一区二区三区激情视频 | 亚洲精品1区2区3区 超碰成人网 | 精品久久久久一区二区国产 | 成人欧美一区二区三区黑人麻豆 | av中文天堂 | 国产精品一区二区久久精品爱微奶 | 国产97在线视频 | 久久露脸国产精品 | 99久久er热在这里只有精品15 | 欧美污污网站 | 二区三区中文字幕 | 成人小视频在线 | 97av视频| 久久五月精品 | 国产69精品久久久久久 | 国产第一页在线观看 | 亚洲精品午夜国产va久久成人 | 国产高清在线看 | 99热日本| 日韩久久在线 | 亚洲精品国产成人 | 国产欧美日韩精品一区二区免费 | 又爽又黄在线观看 | 日韩精品高清不卡 | 国产特级毛片aaaaaa | 在线免费观看的av网站 | 亚洲精品资源在线 | 狠狠色丁香久久综合网 |