試試二維紋理對映
試試二維紋理對映
轉載https://github.com/wangdingqiao/noteForOpenGL/blob/master/textures/textures01/texture01.cpp
// 引入GLEW庫 定義靜態連結
#define GLEW_STATIC
#include <GLEW/glew.h>
// 引入GLFW庫
#include <GLFW/glfw3.h>
// 引入SOIL庫
#include <SOIL/SOIL.h>
#include
#include
// 包含著色器載入庫
#include “shader.h”
// 鍵盤迴調函式原型宣告
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
// 定義程式常量
const int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 600;
int main(int argc, char** argv)
{
if (!glfwInit()) // 初始化glfw庫
{
std::cout << "Error::GLFW could not initialize GLFW!" << std::endl;
return -1;
}
// 開啟OpenGL 3.3 core profile
std::cout << "Start OpenGL core profile version 3.3" << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// 建立視窗
GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT,
"Demo of 2D texture", NULL, NULL);
if (!window)
{
std::cout << "Error::GLFW could not create winddow!" << std::endl;
glfwTerminate();
return -1;
}
// 建立的視窗的context指定為當前context
glfwMakeContextCurrent(window);
// 註冊視窗鍵盤事件回撥函式
glfwSetKeyCallback(window, key_callback);
// 初始化GLEW 獲取OpenGL函式
glewExperimental = GL_TRUE; // 讓glew獲取所有擴充函式
GLenum status = glewInit();
if (status != GLEW_OK)
{
std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION)
<< " error string:" << glewGetErrorString(status) << std::endl;
glfwTerminate();
return -1;
}
// 設定視口引數
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
// Section1 準備頂點資料
// 指定頂點屬性資料 頂點位置 顏色 紋理
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,0.0f, 0.0f, // 0
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,1.0f, 0.0f, // 1
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f,1.0f, 1.0f, // 2
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f,0.0f, 1.0f // 3
};
GLushort indices[] = {
0, 1, 2, // 第一個三角形
0, 2, 3 // 第二個三角形
};
// 建立快取物件
GLuint VAOId, VBOId, EBOId;
// Step1: 建立並繫結VAO物件
glGenVertexArrays(1, &VAOId);
glBindVertexArray(VAOId);
// Step2: 建立並繫結VBO 物件 傳送資料
glGenBuffers(1, &VBOId);
glBindBuffer(GL_ARRAY_BUFFER, VBOId);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Step3: 建立並繫結EBO 物件 傳送資料
glGenBuffers(1, &EBOId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// Step4: 指定解析方式 並啟用頂點屬性
// 頂點位置屬性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
8 * sizeof(GL_FLOAT), (GLvoid*)0);
glEnableVertexAttribArray(0);
// 頂點顏色屬性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
8 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT)));
glEnableVertexAttribArray(1);
// 頂點紋理座標
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE,
8 * sizeof(GL_FLOAT), (GLvoid*)(6 * sizeof(GL_FLOAT)));
glEnableVertexAttribArray(2);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // 注意不要解除EBO繫結
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// Section2 準備著色器程式
Shader shader("triangle.vertex", "triangle.frag");
// Section3 準備紋理物件
// Step1 建立並繫結紋理物件
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
// Step2 設定wrap引數
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// Step3 設定filter引數
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR); // 為MipMap設定filter方法
// Step4 載入紋理
GLubyte *imageData = NULL;
int picWidth, picHeight;
imageData = SOIL_load_image("../../resources/textures/wood.png",
&picWidth, &picHeight, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, picWidth, picHeight,
0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
glGenerateMipmap(GL_TEXTURE_2D);
// Step5 釋放紋理圖片資源
SOIL_free_image_data(imageData);
glBindTexture(GL_TEXTURE_2D, 0);
// 開始遊戲主迴圈
while (!glfwWindowShouldClose(window))
{
glfwPollEvents(); // 處理例如滑鼠 鍵盤等事件
// 清除顏色緩衝區 重置為指定顏色
glClearColor(0.18f, 0.04f, 0.14f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 這裡填寫場景繪製程式碼
glBindVertexArray(VAOId);
shader.use();
// 啟用紋理單元 繫結紋理物件
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glUniform1i(glGetUniformLocation(shader.programId, "tex"), 0); // 設定紋理單元為0號
// 使用索引繪製
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
glBindVertexArray(0);
glUseProgram(0);
glfwSwapBuffers(window); // 交換快取
}
// 釋放資源
glDeleteVertexArrays(1, &VAOId);
glDeleteBuffers(1, &VBOId);
glfwTerminate();
return 0;
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, GL_TRUE); // 關閉視窗
}
}
相關文章
- 多視角三維模型紋理對映 01模型
- 圖形學_opengl紋理對映
- Three.js進階篇之9 - 紋理對映和UV對映JS
- 【5min+】 物件對映只有AutoMapper?試試Mapster物件APP
- PAT-B 1041 考試座位號【對映】
- CUDA一維紋理記憶體記憶體
- 幹掉 BeanUtils!試試這款 Bean 自動對映工具,真心強大!Bean
- 演算法面試通關40講 - 雜湊表/對映演算法面試
- 多測師肖sir_測試理論之測試思維(1)
- 2020年二級鍋爐水質處理考試試卷及二級鍋爐水質處理模擬考試題庫
- 如何高效的處理陣列對映陣列
- JavaScript 資料處理 - 對映表篇JavaScript
- 4.QOpenGLWidget-對三角形進行紋理貼圖、紋理疊加
- Webgl 紋理Web
- 頂點著色網格轉換為 UV 對映的紋理化網格
- MyBaits | 對映檔案之引數處理AI
- 對映
- 圖形學之紋理後續/WebGL多紋理處理Web
- 法線紋理
- 測試面試問題(二)面試
- 測試筆試邏輯思維題筆試
- 二進位制檔案記憶體對映記憶體
- 影像處理筆試面試題筆試面試題
- JB的測試之旅-jenkins打包產物生成二維碼Jenkins
- 常見Linux運維面試題,你答對了嗎?Linux運維面試題
- 多重對映
- 測試理論
- 考試試題A卷第二題
- 紋理最佳化:讓你的紋理也 “瘦” 下來
- MyBatis(四) 對映器配置(自動對映、resultMap手動對映、引數傳遞)MyBatis
- 【程式設計測試題】素數對、不要二、求和程式設計
- Substance 3D Designer for mac(DS三維材質紋理製作)3DMac
- OpenGL 紋理詳解
- 軟體測試面試問題_介面測試(二)面試
- python初試二Python
- 嘗試 Leetcode(二)LeetCode
- 網站安全維護對公司網站滲透測試剖析網站
- 自動化測試時對驗證碼的處理