2016-08-11 125 views
-1

我有一个简单的函数来加载纹理,但问题是当我加载2纹理第二纹理是相同的第一纹理。纹理复制opengl

我认为这可能是纹理加载或渲染的问题?

纹理加载:

GLuint loadTexture(std::string path) 
{ 

    GLuint load; 

    glGenTextures(1, &load); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, load); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    float borderColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; 

    glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); 


    int tw, th; 
    unsigned char* image = SOIL_load_image(path.c_str(), &tw, &th, 0, SOIL_LOAD_RGB); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
    glGenerateMipmap(GL_TEXTURE_2D); 
    SOIL_free_image_data(image); 

    glBindTexture(GL_TEXTURE_2D, 0); 
    return load; 
} 

渲染及其它:

class TexturedCube { 
    static GLuint vbo; 
    static GLuint vao; 
    bool spec; 
    GLuint texture, specular; 
    glm::vec3 ambient, diffuse, Lspecular,viewPos; 
    float shiny; 
public: 
    TexturedCube(); 

    void render(Shader* shader, glm::mat4* model, glm::mat4* view, glm::mat4* projection,glm::vec3 cam); 
    void setTexture(std::string path); 
    void setSpecular(std::string path); 
    void useSpecular(bool x); 
    void setAttribs(glm::vec3 amb, glm::vec3 diff, glm::vec3 specs, float shine); 
}; 

GLuint loadTexture(std::string); 

const GLfloat cubeverts[] = { 
    // Positions   // Normals   // Texture Coords 
    -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 
    0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, 
    0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, 
    -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 
    -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 

    -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 
    0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 
    0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 
    -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 
    -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 

    -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 
    -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 
    -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
    -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
    -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 
    -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 

    0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 
    0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
    0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
    0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 
    0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 

    -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 
    0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 
    0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 
    0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 
    -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 
    -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 

    -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 
    0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 
    0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
    -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 
    -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f 
}; 

CPP

void TexturedCube::render(Shader * shader, glm::mat4 * model, glm::mat4 * view, glm::mat4 * projection, glm::vec3 cam) 
{ 
    glBindVertexArray(vao); 
    shader->Use(); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glUniform1i(glGetUniformLocation(shader->Program, "texture0"), GL_TEXTURE0); 

    if (spec) 
    { 
     glActiveTexture(GL_TEXTURE1); 
     glBindTexture(GL_TEXTURE_2D, specular); 
     glUniform1i(glGetUniformLocation(shader->Program, "texture1"), GL_TEXTURE1); 
    } 

    glUniformMatrix4fv(glGetUniformLocation(shader->Program, "model"), 1, GL_FALSE, glm::value_ptr(*model)); 
    glUniformMatrix4fv(glGetUniformLocation(shader->Program, "view"), 1, GL_FALSE, glm::value_ptr(*view)); 
    glUniformMatrix4fv(glGetUniformLocation(shader->Program, "projection"), 1, GL_FALSE, glm::value_ptr(*projection)); 

    glUniform1f(glGetUniformLocation(shader->Program, "material.shininess"), shiny); 
    glUniform3f(glGetUniformLocation(shader->Program, "material.ambient"), ambient.r, ambient.g, ambient.b); 
    glUniform3f(glGetUniformLocation(shader->Program, "material.diffuse"), diffuse.r, diffuse.g, diffuse.b); 
    glUniform3f(glGetUniformLocation(shader->Program, "material.specular"), Lspecular.r, Lspecular.g, Lspecular.b); 
    glUniform3f(glGetUniformLocation(shader->Program, "viewPos"), cam.x, cam.y, cam.z); 

    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glBindVertexArray(0); 
} 

void TexturedCube::setTexture(std::string path) 
{ 
    texture = loadTexture(path); 
} 

void TexturedCube::setSpecular(std::string path) 
{ 
    specular = loadTexture(path); 
    spec = true; 
} 

破片着色器

#version 330 core 
struct Material { 
    sampler2D texture0; 
    sampler2D texture1; 
    float  shininess; 

    vec3 ambient; 
    vec3 diffuse; 
    vec3 specular; 
}; 

struct PointLight { 
    vec3 position; 
    vec3 color; 
}; 

in vec3 FragPos; 
in vec3 Normal; 
in vec2 TexCoords; 

out vec4 color; 

uniform vec3 viewPos; 
uniform Material material; 
uniform PointLight light; 

void main() 
{ 
    // Ambient 
    vec3 ambient = material.ambient * vec3(texture(material.texture0, TexCoords)); 

    // Diffuse 
    vec3 norm = normalize(Normal); 
    vec3 lightDir = normalize(light.position - FragPos); 
    float diff = max(dot(norm, lightDir), 0.0); 
    vec3 diffuse = material.diffuse * diff * vec3(texture(material.texture0, TexCoords)); 

    // Specular 
    vec3 viewDir = normalize(viewPos - FragPos); 
    vec3 reflectDir = reflect(-lightDir, norm); 
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 
    vec3 specular = material.specular * spec * vec3(texture(material.texture1, TexCoords)); 

    color = vec4(ambient + diffuse + specular, 1.0f); 

} 

然后,我只需在渲染循环中调用SetSpecular()和SetTexture()然后render()。

感谢您的帮助。

+1

什么是'texture'的声明? –

+0

GLuint纹理,镜面;在头文件中。 – Adrian

+0

它是某个班的成员吗?哪一堂课?发布适当的[mcve]。 –

回答

2

问题是,你将错误的值传递给制服。你必须做的是传递纹理单元索引而不是OpenGL常量。所以

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture); 
glUniform1i(glGetUniformLocation(shader->Program, "texture0"), GL_TEXTURE0); 

必须改变以

glUniform1i(glGetUniformLocation(shader->Program, "texture0"), 0); 

同为其他质地:

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, specular); 
glUniform1i(glGetUniformLocation(shader->Program, "texture1"), 1); 
+0

仍然没有工作,但无论如何感谢。 – Adrian

+0

我试图做一些调试,它看起来像第一个纹理覆盖第二个纹理,但我不知道如何。 – Adrian

+1

我很确定它需要合格的“material.texture0”和“material.texture1”。现在你很可能为这两者获得** - 1 **的值,并且统一结构的'sampler2D'成员都被赋予相同的未定义值。 –