2017-06-29 6 views
-1

Ich versuche, an einem Textur-Mapping 2D zu einem Dreieck zu arbeiten. Aber zur Zeit kann ich nur ein Dreieck mit einer Farbverlauf ohne Textur auf ihm bekommen. Das heißt, meine Texturfunktion in Glsl gibt immer vec4 (1,1,1,1) zurück und mein TextCoords funktioniert. Wie soll ich es beheben? Irgendwelche Vorschläge wären hilfreich zu versuchen!OpenGL GLSL Textur-Funktion immer vec4 (1,1,1,1), weißes Dreieck

Übrigens, habe daran seit 3 ​​Tagen gearbeitet.

in Texturklasse:

Konstruktor:

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); 
} 

Texture Bindungsfunktion:

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

In meinem 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; 

uploade Dreiecksdaten zu puffern

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; 

Datenkartenpuffer

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; 

Upload Uniform Shader

m_shader.enable(); 

    ... 

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

    m_shader.disable(); 

    CHECK_GL_ERRORS; 

Und in meinem Draw Funktion Shader:

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; 

Hier werde ich auch meine Shadern anhängen verte x-Shader:

#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; 
} 

Und mein 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

Kleber alle Stücke zusammen und bearbeiten in die resultierende [MCVE]. – genpfault

+0

Haben Sie versucht, das interne Texturformat von 'GL_RGBA32F_ARB' in' GL_RGBA8' zu ändern? – Rabbid76

+0

Hallo, gerade versucht, aber hat nicht funktioniert. @ Rabbid76 – Lalaphoon

Antwort

0

Ich fand einen Weg, es funktioniert.

Ich kopiere alle Linien im Texture-Konstruktor und füge sie in draw() ein, anstatt texture.Bind() aufzurufen. Sieht so aus, als ob ich eine Textur mache, bevor sie fertig ist, um eine Geometrie zu zeichnen, und so funktioniert es.

Aber ich muss immer noch wissen, warum es so passiert. Für den Codierungsstil muss ich meinen Code immer noch in die Texture-Klasse einfügen. Würde es Ihnen etwas ausmachen, eine Lösung dafür zu finden, was vorher passiert ist?

it looks like this right now

+0

Festhalten. Etwas Magie passiert hier. Ich bin verrückt. Eine andere Lösung hier: Ich ändere meinen Konstruktor in eine Funktion namens setUp (fileName). Jetzt ist mein Konstruktor leer. Anstatt eine Instanz im obigen Code zu initialisieren, habe ich textur.setUp ("bricks.jpg") aufgerufen und die Textur ist immer noch da und ich muss nicht einmal texture.Bind() in meiner Zeichnung aufrufen ??? – Lalaphoon