2017-12-16 17 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は、フラグメントシェーダにコメントアウト行を入れ替えた場合、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)を呼び出しています。このコマンドでは、テクスチャは現在アクティブなテクスチャユニットにバインドされています。

関連する問題