2017-12-16 5 views
0

OpenGL을 사용하여 png 파일을 그리려고하고 텍스처를 설정하는 방법에 문제가있는 것 같습니다.현대 OpenGL 3.3 핵심 검은 질감

하여 Main.cpp :

float positions[] = { 
    -1.0f, -1.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 

}; 

float texCoords[] = { 
    -1.0f, -1.0f, 
    -1.0f, 1.0f, 
    1.0f, 1.0f, 
}; 


unsigned int buffer; 
glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

unsigned int texBuffer; 
glGenBuffers(1, &texBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, texBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW); 

glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

int w; 
int h; 
int comp; 
unsigned char* image = stbi_load("res/images/background_level.png", &w, &h, &comp, STBI_rgb_alpha); 

if (image == nullptr) 
    throw(std::string("Failed to load texture")); 

//std::cout << image << std::endl; 

unsigned int m_texture; 

glGenTextures(1, &m_texture); 

glBindTexture(GL_TEXTURE_2D, m_texture); 

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

if (comp == 3) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
else if (comp == 4) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 

glBindTexture(GL_TEXTURE_2D, 0); 

stbi_image_free(image); 


/* Loop until the user closes the window */ 
while (!glfwWindowShouldClose(window)) 
{ 
    /* Render here */ 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // draw our first triangle 
    glUseProgram(programID); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    int uniformLoc = glGetUniformLocation(programID, "tex"); 
    glUniform1i(uniformLoc, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 


    /* Swap front and back buffers */ 
    glfwSwapBuffers(window); 

    /* Poll for and process events */ 
    glfwPollEvents(); 
} 

vertex.shader :

#shader VERTEX 
#version 330 core 

layout (location=0) in vec2 vert; 
layout (location=1) in vec2 vertTexCoord; 
out vec2 fragTexCoord; 

void main() { 
    // Pass the tex coord straight through to the fragment shader 
    fragTexCoord = vertTexCoord; 

    gl_Position = vec4(vert, 0, 1); 
} 

fragment.shader :

#shader FRAGMENT 

#version 330 core 
uniform sampler2D tex; //this is the texture 
in vec2 fragTexCoord; //this is the texture coord 
out vec4 finalColor; //this is the output color of the pixel 

void main() { 
    //finalColor = vec4(1.0, 1.0, 1.0, 1.0); 
    finalColor = texture(tex, fragTexCoord); 
} 

나는 조각 쉐이더에서 주석 라인을 교체하는 경우

, I 렌더링 된 모든 흰색 삼각형을 얻으십시오. 그러나 텍스처를 사용하려고하는 선으로 삼각형은 모두 검은 색으로 나타납니다. 나는 단지 OpenGL로 시작 했으므로 반드시 모든 초기 개념을 확실하게 이해하지는 못했습니다. 텍스처가 내 스킬 레벨보다 앞서있을 수도 있지만, 혼란스러워하는 부분을 누군가가 보여줄 수 있기 때문에 여기에 묻기를 시도 할 때 상처를 줄 수 없다고 생각했습니다.

+1

렌더 루프 내에서'glBindTexture (GL_TEXTURE_2D, 0);'를 호출하는 이유가 있습니까? 이것은'm_texture == 0'이라고 가정하는 것 같습니다. – BDL

+0

@BDL 'glBindTexture (GL_TEXTURE_2D, m_texture);로 변경했고 예상대로 작동합니다. 감사! 내가 '0'을 바인드해야한다고 생각한 이유는'glActiveTexture (GL_TEXTURE0); '에 대한 호출이었습니다. –

답변

1

렌더 루프 내에서 glBindTexture(GL_TEXTURE_2D, m_texture) 대신 glBindTexture(GL_TEXTURE_2D, 0)을 호출하고 있습니다. 이 명령을 사용하면 텍스처가 현재 활성 텍스처 단위에 바인딩됩니다.

관련 문제