2016-06-13 1 views
1

J'ai essayé de faire des recherches en ligne mais je ne pouvais pas comprendre comment ajouter une texture pour mon modèle. (Il peut être réglé depuis le début) J'ai des problèmes avec cela et je voudrais de l'aide dans les changements que je devrais faire avec mon code.Mappage de texture multiple avec openGL

Ma fonction de réglage de texture:

void Texture::setTexture(unsigned char* data, unsigned int width, unsigned int height) { 
    glGenTextures(1, &m_texture[unit]); // Genatate 1 texture in m_texture 
    glBindTexture(GL_TEXTURE_2D, m_texture[unit]); 


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


    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 

Ma fonction bind:

void Texture::Bind(unsigned int unit) { 
    glActiveTexture(GL_TEXTURE0 + unit); 
    glBindTexture(GL_TEXTURE_2D, m_texture[unit]); 

Et mes vertex shaders ressemble à ceci:

attribute vec3 position; // Position values 
attribute vec2 texCoord; // Texture coordinates values 
attribute vec3 normal;  // Normal 

varying vec2 texCoord0; 
varying vec3 normal0; 

uniform mat4 transform; 

void main() 
{ 
    gl_Position = transform * vec4(position, 1.0); 
    texCoord0 = texCoord; 
    normal0= (transform * vec4(normal, 0.0)).xyz; 
} 

fragment shader:

varying vec2 texCoord0; 
varying vec3 normal0; 

uniform sampler2D diffuse; 

void main() 
{ 
    gl_FragColor = texture2D(diffuse, texCoord0) * 
        clamp(dot(-vec3(0,0,1), normal0), 1.0, 1.0); 
} 

Shader cteur:

Shader::Shader(const string& fileName) 
{ 
    m_program = glCreateProgram(); 
    m_shaders[0] = CreateShader(LoadShader(fileName + ".vs"), GL_VERTEX_SHADER); 
    m_shaders[1] = CreateShader(LoadShader(fileName + ".fs"), GL_FRAGMENT_SHADER); 

    for (unsigned int i = 0; i < NUM_SHADERS; i++) 
     glAttachShader(m_program, m_shaders[i]); 

    glBindAttribLocation(m_program, 0, "position"); 
    glBindAttribLocation(m_program, 1, "texCoord"); 
    glBindAttribLocation(m_program, 2, "normal"); 

    glLinkProgram(m_program); 

    glValidateProgram(m_program); 

    m_uniforms[TRANSFORM_U] = glGetUniformLocation(m_program, "transform"); 
} 

Je veux choisir choisir des sommets d'utiliser la première texture et une l'autre. Par exemple, un cube dont chaque carré a une texture différente.

Comment puis-je ajouter une autre texture? Et quels changements dois-je faire dans ma classe Mesh?

Désolé pour la question stupide, je suis nouveau dans openGL :) Merci d'avance!

+0

En résumé, vous devez utiliser plus d'une unité de texture avec chaque unité puis la mapper à un sampler2D dans votre fragment shader. Quelques excellentes informations peuvent être trouvées [ici] (http://learnopengl.com/#!Getting-started/Textures). –

Répondre

0

Je ne sais pas si c'est ce que vous cherchez. Mais, ici, je vais ..

Dans le fragment shader, vous utilisez plusieurs sampler2D par exemple:

uniform sampler2D tex0; 
uniform sampler2D tex1; 

Et vous devez faire quelques ajustements au code C++ trop attribuer la sampler2D comme ceci:

glUniform1i(glGetUniformLocation(shader, "tex0"), 0); 
glUniform1i(glGetUniformLocation(shader, "tex1"), 1); 

le 0 et 1 est le numéro de texture actif de GL_TEXTURE0 et GL_TEXTURE1. ce serait N s'il est GL_TEXTUREN. Donc, ceci étant dit, vous devez lier les textures avant avec le suivant glActiveTexture comme ceci:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, tex1); 

que je crois que vous avez déjà fait.


Oh, et peut-être que vous pouvez utiliser le tableau aussi dans le fragment shader comme ceci:

uniform sampler2D tex[2]; 

Et le code C++ serait quelque chose comme ceci:

for (int i = 0; i < 2; i++) { 
    glUniform1i(glGetUniformLocation(shader, "tex[" + std::to_string(i) + "]"), i); 
} 

Edit: I ne pas tester si "tex[" + std::to_string(i) + "]" fonctionne. Mais je pense que vous avez l'idée. Peut être("tex[" + std::to_string(i) + "]").c_str()

Éditer: En parlant de tableaux, il y a aussi quelque chose qui s'appelle des tableaux de texture.Pour plus de détails et plus d'options envisagez de voir this

+0

Merci! Comment choisir certains sommets pour utiliser la première texture et l'autre la première? Par exemple, un cube dont chaque carré a une texture différente. –

+0

@ Yuval.Sightec Je n'ai pas encore essayé. Mais si c'était moi, j'attribuerais à chaque sommet un attribut supplémentaire pour déterminer quelle texture devrait être utilisée pour la simplicité. Mais la simplicité n'est pas toujours un bon moyen .. Le moyen le plus simple serait d'utiliser l'atlas de texture (si les textures ne sont pas si grandes). – Greffin28