OpenGL 在四边形上显示黑色纹理

问题描述 投票:0回答:1

无论我尝试什么,我似乎都无法使四边形显示任何纹理,在fragshader中尝试使用纯色效果很好,尝试绘制渐变纹理坐标效果很好..一旦我引入了采样器并尝试设置纹理它不起作用...在下面附加了一些代码和调试详细信息


int width, height, nrChannels;
bool hasAlpha;
unsigned int refID;

glGenTextures(1, &refID);
glBindTexture(GL_TEXTURE_2D, refID);

// set the texture wrapping/filtering options (on the currently bound texture object)

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


unsigned char* data = stbi_load("C:\\Users\\shubhz\\source\\repos\\Lumigen\\assets\\textures\\dia.png", & width, & height, & nrChannels, 0);

bool has_alpha = (nrChannels > 3) ? true : false;

if (data) {
    if (has_alpha)
        glTexImage2D(refID, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    else
        glTexImage2D(refID, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

    Debug::log("Loaded Texture from :", " w: ", width, " h:", height, " alpha : ", has_alpha, "  refID ", refID);
}
else {
    //Failed to load texture
    Debug::log("Failed to load texture : ");
}

//frees up the tempdata after upload
stbi_image_free(data);

app.initialize();

glUseProgram(Resources::GetShader("default-shader"));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, refID);
glUniform1i(glGetUniformLocation(Resources::GetShader("default-shader"), "texture1"), 0);


绘图部分:

void SceneRenderer::render(Mesh& _mesh, Material& _mat, glm::mat4 _modelMatrix)
{
    glUseProgram(_mat.shader);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _mat.texture.refID);
    glBindVertexArray(_mesh.VAO);

    Shader::Mat4f(_mat.shader, "modelMatrix", _modelMatrix);
    Shader::Vec4f(_mat.shader, "_MainColor", glm::vec4(0.2f, 0.3f, 0.5f, 1));

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

}

也使用渲染文档打开应用程序,管道查看器中出现这个奇怪的错误,显示 Base_level 0 中的尺寸无效,但我记录了宽度和高度,它们都很好

c++ opengl stb-image
1个回答
0
投票

glTexImage2D()
的第一个参数是
target
目标而不是纹理句柄(在您的情况下为
refID
)。所以你需要将
refID
替换为
GL_TEXTURE_2D
:

if (has_alpha)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
else
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

这很可能也会产生错误,因此这表明您甚至没有检查

glGetError()
。您至少应该检查
glGetError()
OpenGL 错误 - OpenGL Wiki)。

更好的设置调试输出。查看LearnOpenGL - 调试以获取更深入的解释。

© www.soinside.com 2019 - 2024. All rights reserved.