2017-06-29 4 views
-1

J'essaie de travailler sur un mappage de texture 2D vers un triangle. Mais actuellement, je peux seulement obtenir un triangle qui a une couleur de dégradé sans aucune texture dessus. Ce qui signifie que ma fonction de texture dans glsl retourne toujours vec4 (1,1,1,1) et que mon textCoords fonctionne. Comment devrais-je le réparer? Toutes les suggestions seraient utiles pour essayer! D'ailleurs, j'ai travaillé sur cela pendant 3 jours.Fonction de texture OpenGL GLSL renvoyant toujours vec4 (1,1,1,1), triangle blanc

dans la classe de texture:

constructeur:

Texture::Texture(const std::string& fileName){ 

    int width, height, numComponents; 
    //float* imageData = stbi_loadf(fileName.c_str(), &width, &height, &numComponents, 4); 
    unsigned char* imageData = stbi_load(fileName.c_str(), &width, &height, &numComponents, 4); 
    if(imageData == NULL){ 
     cerr << "Texture loading failed for "<<fileName<< endl; 
    } 

    glGenTextures(1, &m_texture); 
    glBindTexture(GL_TEXTURE_2D, m_texture); 

    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_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 


    stbi_image_free(imageData); 
} 

fonction de liaison Texture:

void Texture::Bind(){ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, m_texture); 
} 

Dans mon main.cpp:

m_shader.generateProgramObject(); 
m_shader.attachVertexShader(getAssetFilePath("VertexShader.vs").c_str()); 
m_shader.attachFragmentShader(getAssetFilePath("FragmentShader.fs").c_str() ); 
m_shader.link(); 

// texture created here 
texture = Texture("Assets/bricks.jpg"); 


// enable vertex attribute indices 
glGenVertexArrays(1, &m_vao_triangle); 
glBindVertexArray(m_vao_triangle); 

// Enable the attribute index location for "position" when rendering. 
GLint positionAttribLocation = m_shader.getAttribLocation("position"); 
glEnableVertexAttribArray(positionAttribLocation); 

GLint textCoordLocation = m_shader.getAttribLocation("atextCoord"); 
glEnableVertexAttribArray(textCoordLocation); 


// Restore defaults 
glBindVertexArray(0); 


CHECK_GL_ERRORS; 

données triangle uploade au tampon

vec3 triangleVertices[] = { 
    // Construct equalaterial triangle 
    vec3(0.0f, 0.0f, 0.0f), 
    vec3(0.25f, 1.0f, 0.0), 
    vec3(0.5f, 0.0f, 0.0f) 
}; 

vec2 textCoords[] = { 
     vec2(1.0f, 0.0f), 
     vec2(0.25f, 1.0f), 
     vec2(0.5f, 0.0f)}; 



// Generate a vertex buffer object to hold the triangle's vertex data. 
glGenBuffers(1, &m_vbo_triangle); 

//-- Upload triangle vertex data to the vertex buffer: 
glBindBuffer(GL_ARRAY_BUFFER, m_vbo_triangle); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, 
     GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
CHECK_GL_ERRORS; 




//====generate buffer for holding texture coordinates==== 
glGenBuffers(1, &m_uv_triangle); 
glBindBuffer(GL_ARRAY_BUFFER, m_uv_triangle); 
glBufferData(GL_ARRAY_BUFFER, sizeof(textCoords), textCoords, 
      GL_STATIC_DRAW); 

// Unbind the target GL_ARRAY_BUFFER, now that we are finished using it. 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

CHECK_GL_ERRORS; 

données tampons carte pour Shader

glBindVertexArray(m_vao_triangle); 

glBindBuffer(GL_ARRAY_BUFFER, m_vbo_triangle); 
GLint positionAttribLocation = m_shader.getAttribLocation("position"); 
glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 



glBindBuffer(GL_ARRAY_BUFFER, m_uv_triangle); 
GLint textCoordLocation = m_shader.getAttribLocation("atextCoord"); 
glVertexAttribPointer(textCoordLocation,2, GL_FLOAT, GL_FALSE, 0, nullptr); 


//-- Unbind target, and restore default values: 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

CHECK_GL_ERRORS; 

télécharger uniforme shader

m_shader.enable(); 

    ... 

    GLint uniformLocation_diffuse = m_shader.getUniformLocation("diffuse"); 
    glUniform1i(uniformLocation_diffuse, 0); 
    CHECK_GL_ERRORS; 

    m_shader.disable(); 

    CHECK_GL_ERRORS; 

Et dans ma fonction de tirage:

glBindVertexArray(m_vao_triangle); 
// below I tried, but didn't work 
// glClear(GL_STENCIL_BUFFER_BIT); 
// glEnable(GL_BLEND); 
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
// glEnable(GL_DEPTH_TEST); 

texture.Bind(); 
// do these below: 
// glActiveTexture(GL_TEXTURE0); 
// glBindTexture(GL_TEXTURE_2D, texture.m_texture); 

m_shader.enable(); 

glDrawArrays(GL_TRIANGLES, 0, 3); 


m_shader.disable(); 


// Restore defaults 
glBindVertexArray(0); 

CHECK_GL_ERRORS; 

Ici, je vais également joindre mes shaders verte x shaders:

#version 330 

in vec3 position; 
in vec2 atextCoord; 

uniform mat4 transform; 
out vec2 textCoord; 

void main() { 
    gl_Position = transform * vec4(position, 1.0); 
    textCoord = atextCoord; 
} 

Et mon fragment shader:

#version 330 

uniform sampler2D diffuse; 

out vec4 fragColor; 
in vec2 textCoord; 

void main() { 

    fragColor = vec4(texture(diffuse, textCoord).rgb,1.0) * vec4(textCoord,0.0,1.0); 
    // texture(...) shows vec4(1,1,1,1) 
    // radiant colour can only prove my textCoord is working 
    // fragColor = texture(diffuse, textCoord); <- only shows a default texture 
} 

here is the running result

Here is the texture image

+0

colle tous vos morceaux ensemble et modifier dans le résultat [mcve]. – genpfault

+0

Avez-vous essayé de changer le format de texture interne de 'GL_RGBA32F_ARB' à' GL_RGBA8'? – Rabbid76

+0

Salut, juste essayé, mais n'a pas fonctionné. @ Rabbid76 – Lalaphoon

Répondre

0

je trouve un moyen de le faire fonctionner.

Je copie toutes les lignes du constructeur Texture et je le colle à draw(), en appelant texture.Bind(). On dirait que je crée une texture juste avant qu'elle ne soit prête à dessiner une géométrie et ainsi fonctionne.

Mais je dois encore savoir pourquoi ça se passe comme ça. Pour le style de codage, je dois encore mettre mon code dans la classe Texture. Pourriez-vous fournir une solution à ce qui est arrivé avant?

it looks like this right now

+0

Accrochez-vous. Quelque chose de magique arrive ici. Je suis bizarre. Une autre solution ici: je change mon constructeur en une fonction appelée setUp (nomfichier) .Maintenant, mon constructeur est vide. Au lieu d'initialiser une instance dans le code ci-dessus, j'ai appelé texture.setUp ("bricks.jpg") et la texture est toujours là et je n'ai même pas besoin d'appeler texture.Bind() dans mon dessin ??? – Lalaphoon