2017-11-03 8 views
1

OpenGL에서 텍스처를 메시에 적용 할 때 문제가 있습니다. 나는 해결책을 찾기 위해 높고 낮게 보였지만 여러 시간 동안의 연구에서 해결책을 찾지 못했습니다.OpenGL에서 텍스처를 표시 할 수 없습니다.

다른 눈 쌍이 내 코드에서 오류를 잡아낼 수 있기를 바랍니다. 내 쉐이더에서 색상을 설정할 때

모든 것이 잘 작동,하지만 난 그것을 질감을 전달하려고하면로드 된 이미지가 투명 또는

  • 이있는 경우, I 중 하나는,

    • 완전히 보이지 않는 메쉬를 얻을 수 내 이미지에 실제 색상이 혼합되어 보이는 균일 한 색상의 메쉬 (투명하지 않은 이미지의 경우).

    아래 코드는 간단한 사각형을 그리고 텍스처를 적용해야합니다.

    이미지 로더 : 나는 데이터를 읽을 수있는 형식으로 이미지 데이터를 출력하여 올바른 이미지 파일이로드 있다는 것을 확인했다

    void Texture::loadTexture(const char* _filename) 
    { 
        char fn[255] = "assets/textures/"; 
        strcat(fn, _filename); 
    
        std::cout << fn << std::endl; 
    
        FREE_IMAGE_FORMAT format = FreeImage_GetFileType(fn, 0); 
        FIBITMAP* bitmap = FreeImage_Load(format, fn); 
        FIBITMAP* bitmap32 = nullptr; 
    
        unsigned int bitsPerPixel = FreeImage_GetBPP(bitmap); 
        std::cout << "Image BPP: " << bitsPerPixel << std::endl; 
    
        int imageWidth = FreeImage_GetWidth(bitmap); 
        int imageHeight = FreeImage_GetHeight(bitmap); 
        std::cout << "Image size: " << imageWidth << " x " << imageHeight << std::endl; 
    
        if (bitsPerPixel != 32) 
         bitmap32 = FreeImage_ConvertTo32Bits(bitmap); 
        else 
         bitmap32 = bitmap; 
    
        BYTE* textureData = FreeImage_GetBits(bitmap32); 
    
        //for(int i = 0; i < imageWidth * imageHeight * 4; i += 4) { 
        // std::cout << (int)textureData[i] << ", " << (int)textureData[i+1] << ", " << (int)textureData[i+2] << ", " << (int)textureData[i+3] << std::endl; 
        //} 
    
        glBindTexture(GL_TEXTURE_2D, m_ID); 
    
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageWidth, imageHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)textureData); 
    
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    
        FreeImage_Unload(bitmap); 
    
        if (bitsPerPixel != 32) 
         FreeImage_Unload(bitmap32); 
    
    } 
    

    . 결과는 예상대로입니다.

    내 메인 루프 :

    int main() 
    { 
    
    const std::vector<sun::Vertex> vertices = { 
         sun::Vertex(sun::Vector3f(-4.0f, 4.0f, 0.0f), sun::Vector2f(0.0f, 1.0f)), 
         sun::Vertex(sun::Vector3f(4.0f, 4.0f, 0.0f), sun::Vector2f(1.0f, 1.0f)), 
         sun::Vertex(sun::Vector3f(-4.0f, -4.0f, 0.0f), sun::Vector2f(0.0f, 0.0f)), 
         sun::Vertex(sun::Vector3f(4.0f, -4.0f, 0.0f), sun::Vector2f(1.0f, 0.0f)) 
    }; 
    
    const std::vector<unsigned int> indices = {0, 1, 2, 1, 3, 2}; 
    
    sun::Window window("My Game", 1280, 800); 
    sun::Shader shader("basic.vs", "basic.fs"); 
    sun::Mesh mesh; 
    sun::Transform transform; 
    sun::Texture texture; 
    
    transform.setProjection(70.0f, window.getWidth(), window.getHeight(), 1.0f, -1000.0f); 
    
    mesh.addVertices(vertices, indices); 
    texture.loadTexture("test2.png"); 
    
    shader.addUniform("transform"); 
    shader.bind(); 
    
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    
    // Start the main loop 
    while (!window.closeWindow()) { 
    
        // Render 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glClearColor(0.3f, 0.8f, 1.0f, 1.0f); 
    
        transform.setTranslation(0.0f, 0.0f, 10.0f); 
    
        shader.setUniform("transform", transform.getProjectedTransformation()); 
    
        texture.bind(); // { glBindTexture(GL_TEXTURE_2D, m_ID); } 
        glEnable(GL_TEXTURE_2D); 
    
        mesh.draw(); // See below for details. 
    
        glDisable(GL_TEXTURE_2D); 
        glBindTexture(GL_TEXTURE_2D, 0); 
    
        window.update(); 
    
    } 
    
    return 1; 
    } 
    

    mesh.draw() 메서드를 각각

    void Mesh::draw() 
    { 
        //std::cout << m_Index << std::endl; 
        glEnableVertexAttribArray(0); 
        glEnableVertexAttribArray(1); 
    
        glBindBuffer(GL_ARRAY_BUFFER, m_VBO); 
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const void*)sizeof(Vector3f)); 
    
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO); 
        glDrawElements(GL_TRIANGLES, m_SizeIndices, GL_UNSIGNED_INT, 0); 
    
        glDisableVertexAttribArray(1); 
        glDisableVertexAttribArray(0); 
    } 
    

    그리고 마침내, 내 정점과 조각 쉐이더 :

    #version 330 core 
    
    layout(location = 0) in vec3 position; 
    layout(location = 1) in vec2 texCoord; 
    
    uniform mat4 transform; 
    
    out vec2 coords; 
    
    void main() 
    { 
        gl_Position = transform * vec4(position, 1.0f); 
        coords = texCoord; 
    } 
    

    #version 330 core 
    
    in vec2 coord; 
    
    uniform sampler2D sampler; 
    
    void main() 
    { 
        gl_FragColor = texture2D(sampler, coord.xy);//vec4(1.0f, 0.0f, 0.0f, 1.0f); 
    } 
    

    으로는 다음과 같은 OpenGL을 매개 변수를 초기화하는 동안 활성화/설정, 정보를 추가 :

    void Window::init() 
    { 
        // Set viewport size 
        glfwGetFramebufferSize(m_Window, &m_Width, &m_Height); 
        glViewport(0, 0, m_Width, m_Height); 
    
        // Set vsync 
        glfwSwapInterval(0); 
    
        // Set face culling and depth test. 
        glFrontFace(GL_CW); 
        glCullFace(GL_BACK); 
        glEnable(GL_CULL_FACE); 
        glEnable(GL_DEPTH_TEST); 
    
        // Enable 2D textures 
        glEnable(GL_TEXTURE_2D); 
    
        // Enable gamma correction 
        glEnable(GL_FRAMEBUFFER_SRGB); 
    } 
    

    어떤 도움을 주시면 감사하겠습니다.

    감사합니다.

  • 답변

    1

    Annnnd 문제가 발견되었습니다. 너무 오랫동안 자신의 코드를 쳐다 보면서 가장 명백한 것을 놓치게된다는 것을 보여주기 위해 이동합니다.

    문제가 내 쉐이더에 있습니다. 버텍스 쉐이더는

    vec2 coords 
    

    를 출력했다하지만 일치하는 변수 이름을 변경하면 조각 쉐이더가

    vec2 coord 
    

    를 기다리고 있었다, 나는 나의 질감을 얻었다.