2017-07-06 100 views
1

所以我想在OpenGL中紋理一個對象,我有兩個紋理,我想在片段着色器(rock.tga和grass.tga)中混合在一起。我的片段着色器:如何將多個紋理加載到片段着色器

out vec3 color; 

in vec2 uv; 

uniform sampler2D grasstexture; 
uniform sampler2D rocktexture; 

要加載sampler2D質地這裏就是我在我的頭文件的確在C++:

OpenGP::EigenImage<vec3> image; 
OpenGP::imread("grass.tga", image); 

glGenTextures(0, &_tex); 
glBindTexture(GL_TEXTURE_2D, _tex); 

check_error_gl(); 
glTexParameteri(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_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
check_error_gl(); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 
      image.cols(), image.rows(), 0, 
      GL_RGB, GL_FLOAT, image.data()); 
check_error_gl(); 
tex_id = glGetUniformLocation(_pid, "grasstexture"); 
glUniform1i(tex_id, 0); 

它裝載草質地到我的片段着色器。現在我想知道的是如何加載多個紋理。我不能複製上面的代碼兩次,因爲一個紋理總是被另一個覆蓋。那麼如何將多個紋理加載到片段着色器中呢?

編輯:這是我的_tex聲明,其中:

class Mesh{ 
    protected: 
     GLuint _tex; 

     GLuint _vpoint; ///< memory buffer 
     GLuint _vnormal; ///< memory buffer 

    public: 
     GLuint getProgramID(){ return _pid; } 

     void init(){ 
//code for the textures goes in here 

這裏是我更新的代碼:

OpenGP::EigenImage<vec3> image; 
glActiveTexture(GL_TEXTURE0); 
OpenGP::imread("grass.tga", image); 

//glGenTextures(1, &_tex); 
glBindTexture(GL_TEXTURE_2D, _tex); 

check_error_gl(); 
glTexParameteri(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_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
check_error_gl(); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 
      image.cols(), image.rows(), 0, 
      GL_RGB, GL_FLOAT, image.data()); 
check_error_gl(); 
tex_id = glGetUniformLocation(_pid, "grasstexture"); 
glUniform1i(tex_id, 0); 

glActiveTexture(GL_TEXTURE1); 
OpenGP::imread("rock.tga", image); 

//glGenTextures(0, &_tex); 

glBindTexture(GL_TEXTURE_2D, _tex); 

check_error_gl(); 
glTexParameteri(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_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
check_error_gl(); 
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB32F, 
      image.cols(), image.rows(), 0, 
      GL_RGB, GL_FLOAT, image.data()); 
check_error_gl(); 
tex_id = glGetUniformLocation(_pid, "rocktexture"); 
glUniform1i(tex_id, 1); 

回答

3

Opengl的隱藏了許多它的上下文中,所以你需要記住它。你有質感的三個部分:

  • 紋理 - 只是一個整數,各地通過。
  • 活動紋理單元 - 方面的事情,與GL_TEXTURE0設置...
  • 紋理目標 - 對於初學者GL_TEXTURE_2D是你所需要的。

以下是你需要什麼,以獲得2D紋理的工作要做:

  1. glGenTextures
  2. 設置了以下行動設置了紋理創建的OpenGL紋理

    2.1集活性紋理單元glActiveTexture

    2.2指定目標活性紋理單元到的命名紋理結合glBindTexture。爲此,所有三個紋理部分應該「在控制之下」。

    2.3指定與glTexImage2D

    2爲活性紋理單元二維紋理圖像。4個爲活動紋理單元設置參數與glTexParameteri

  3. 爲了同時使用多重紋理確保它們具有獨特的紋理單元

    3.1設置活動紋理單元到0

    3.2綁定一個命名爲紋理到活動紋理單位

    3.3通行證紋理單元(0)到着色器

    3.4設置活動紋理單元1

    3.5綁定另一個命名紋理活性紋理單元

    3.6通行證紋理單元(1)着色器

    ...

  4. 而當你完成,不要忘記刪除所有命名的紋理與glDeleteTextures

命令的順序是不是唯一的一個可能的命令集,是不是最小的 - 這只是典型的。


原來的答覆:

您需要設置下一個活動紋理就像這樣:

glActiveTexture(GL_TEXTURE1); 
綁定綁定接下來的質地前

。 它也可以這樣工作:

std::vector<std::string> textures = {"grass.tga", "rock.tga"}; 
for(int i = 0; i < textures.size(); i++) { 
    glActiveTexture(GL_TEXTURE0 + i); 
    // create the texture 
} 
+0

它不工作。我會用我最新的代碼更新我的問題。基本上發生的事情是,我的岩石紋理顯得非常白。我甚至不確定這是岩石質地還是我草地紋理的非常明亮的版本。你知道我做錯了什麼嗎?我也評論了我的glGenTextures系列,因爲某些原因使我的紋理根本不出現。 –

+0

@SarahMacleod我已經更新了答案 – teivaz

相關問題