简体   繁体   English

现代OpenGL 3.3核心黑色纹理

[英]Modern OpenGL 3.3 Core Black Texture

I am attempting to draw a png file using OpenGL and seem to have a problem with how I am setting up the textures. 我正在尝试使用OpenGL绘制png文件,但似乎在设置纹理方面存在问题。

Main.cpp: 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: 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: 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);
}

If I swap the line commented out in the fragment shader, I get an all white triangle rendered. 如果我在片段着色器中交换注释掉的行,则会得到全白色三角形。 However with the line attempting to use the texture, the triangle comes out all black. 但是,当线条尝试使用纹理时,三角形全为黑色。 I am just beginning with OpenGL so I don't necessarily have all of the beginning concepts down pat. 我只是从OpenGL开始,所以我并不一定要一开始就把所有的概念都放下来。 Textures may be ahead of my skill level but I figured it couldn't hurt to try and ask here as someone may be able to show me where I have things confused. 纹理可能超出了我的技能水平,但我认为尝试在这里提问不会有什么坏处,因为有人可以向我展示我在哪里感到困惑。

You are calling glBindTexture(GL_TEXTURE_2D, 0) instead of glBindTexture(GL_TEXTURE_2D, m_texture) inside the renderloop. 您正在glBindTexture(GL_TEXTURE_2D, 0)内部调用glBindTexture(GL_TEXTURE_2D, 0)而不是glBindTexture(GL_TEXTURE_2D, m_texture) With this command, a texture is bound to the currently active texture unit. 使用此命令,纹理将绑定到当前活动的纹理单元。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM