C++ OpenGL黑色纹理

C++ OpenGL黑色纹理,c++,opengl,textures,C++,Opengl,Textures,尝试使用位图纹理渲染二维标签时,“我的纹理采样”返回黑色。我尝试使用RenderDoc进行调试,但找不到问题。纹理似乎加载良好,并存储在正确的寄存器中,但仍渲染为黑色 我甚至尝试使用全红色纹理来检查纹理坐标,但纹理仍然显示为黑色 下面是我用于加载/渲染纹理的代码。它试图呈现一个标签。genMipMaps是错误的 void Texture::CreateGLTextureWithData(GLubyte* data, bool genMipMaps) { if (bitmap)

尝试使用位图纹理渲染二维标签时,“我的纹理采样”返回黑色。我尝试使用RenderDoc进行调试,但找不到问题。纹理似乎加载良好,并存储在正确的寄存器中,但仍渲染为黑色

我甚至尝试使用全红色纹理来检查纹理坐标,但纹理仍然显示为黑色

下面是我用于加载/渲染纹理的代码。它试图呈现一个标签。genMipMaps是错误的

void Texture::CreateGLTextureWithData(GLubyte* data, bool genMipMaps) {
    if (bitmap)
        glDeleteTextures(1, &bitmap);

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

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    if (genMipMaps)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    else
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

    if (genMipMaps)
        glGenerateMipmap(GL_TEXTURE_2D);
}
自定义采样器:

glGenSamplers(1, &linearSampler);
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

glSamplerParameteri(linearSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glSamplerParameteri(linearSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glSamplerParameteri(linearSampler, GL_TEXTURE_COMPARE_FUNC, GL_NEVER);

glSamplerParameterf(linearSampler, GL_TEXTURE_MIN_LOD, 0);
glSamplerParameterf(linearSampler, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MAX_LOD);
glBindSampler(0, linearSampler);
渲染:

glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST); 
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, texture->getBitmap());
// Set index and vertex buffers
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);


if (glIsBuffer(vertBuffer) && vertBuffer != lastVertBuffer)
    glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);

if (glIsBuffer(indexBuffer) && indexBuffer != lastIndexBuffer)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

shader->updateLayout();

// Draw
const void* firstIndex = reinterpret_cast<const void*>(0);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, firstIndex);

glBindVertexArray(0);
FS:我尝试在不使用纹理的情况下将颜色设置为红色,并且它正确地以红色渲染

#version 430 core

in vec4 v_color;
in vec2 v_texture;

layout(binding = 0) uniform sampler2D u_texture;

out vec4 fragColor;

void main()
{
    fragColor = v_color * texture(u_texture, v_texture);
}

找出问题所在。我没有为2D纹理生成mipmap,但采样器仍在使用它们

纹理加载:

...
if (genMipMaps)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
else
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

if (genMipMaps)
    glGenerateMipmap(GL_TEXTURE_2D);
...
取样器:

...
glSamplerParameteri(linearSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glSamplerParameteri(linearSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
...
我所做的只是总是为纹理生成mipmap

...
glSamplerParameteri(linearSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glSamplerParameteri(linearSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
...