c++ - OpenGL,着色器模型 3.3 纹理 : Black Textures?

标签 c++ qt opengl glsl texturing

几个小时以来,我一直在努力解决这个问题,我确信这很简单,但我就是得不到结果。我不得不稍微编辑一下这段代码,因为我构建了一个小库来封装 OpenGL 调用,但以下是对事态的准确描述。

我正在使用以下顶点着色器:

#version 330
in vec4 position;
in vec2 uv;
out vec2 varying_uv;
void main(void)
{
    gl_Position = position;
    varying_uv = uv;
}

以及以下片段着色器:

#version 330
in vec2 varying_uv;
uniform sampler2D base_texture;
out vec4 fragment_colour;
void main(void)
{
    fragment_colour = texture2D(base_texture, varying_uv);
}

两个着色器都可以编译并且程序链接没有问题。

在我的初始化部分,我像这样加载一个纹理:

// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

// Load an image.
QImage image("G:/test_image.png");
image = image.convertToFormat(QImage::Format_RGB888);

if(!image.isNull())
{
    // Load up a single texture.
    glGenTextures(1, &Texture);
    glBindTexture(GL_TEXTURE_2D, Texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits());
    glBindTexture(GL_TEXTURE_2D, 0);
}

// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

您会发现我正在使用 Qt 加载纹理。对::throw_on_error() 的调用检查 OpenGL 中的错误(通过调用 Error()),如果发生错误则抛出异常。这段代码没有出现OpenGL错误,使用Qt加载的图片是有效的。

绘图执行如下:

// Clear previous.
glClear(GL_COLOR_BUFFER_BIT |
    GL_DEPTH_BUFFER_BIT |
    GL_STENCIL_BUFFER_BIT);

// Use our program.
glUseProgram(GLProgram);

// Bind the vertex array.
glBindVertexArray(GLVertexArray);

/* ------------------ Setting active texture here ------------------- */

// Tell the shader which textures are which.
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture");
glUniform1i(tAddr, 0);

// Activate the texture Texture(0) as texture 0.
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, Texture);

/* ------------------------------------------------------------------ */

// Draw vertex array as triangles.
glDrawArrays(GL_TRIANGLES, 0, 4);
glBindVertexArray(0);
glUseProgram(0);

// Detect errors.
kt::kits::open_gl::Core<QString>::throw_on_error();

类似地,没有出现 OpenGL 错误,并且在屏幕上绘制了一个三角形。然而,它看起来像这样:

Texturing, not as expected.

我想到这个问题可能与我的纹理坐标有关。因此,我使用 s 作为“红色”组件并使用 t 作为“绿色”组件渲染了以下图像:

Coloring using st coordinates.

纹理坐标看起来是正确的,但我仍然收到厄运的黑色三角形。我做错了什么?

最佳答案

我认为这可能取决于您的纹理对象的不完整初始化。

尝试初始化纹理 MIN 和 MAG 过滤器

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

此外,我建议检查纹理的大小。如果不是2的幂,则必须将wrapping mode设置为CLAMP_TO_EDGE

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

黑色纹理通常是由于这个问题引起的,这是一个非常普遍的问题。

再见

关于c++ - OpenGL,着色器模型 3.3 纹理 : Black Textures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818125/

相关文章:

java - OpenGL 版本在 ContextAttribs() 值更改时更改

c++ - Opengl:视口(viewport)、裁剪、矩阵模式困惑

c++ - 在 C++ 应用程序中检测硬件信息?

qt - 如何使 QList<QVector3D> 独一无二

html - QT html和CSS在没有QWebEngineView的情况下创建pdf

qt - QSoundEffect 始终在 Qt 5.4 中加载状态

qt - 对自己的 QML 类使用 float 或 double

c++ - 如何从 initializer_list 初始化二维数组

c++ - Release() 和析构函数的区别?

c++ - 静态 constexpr 成员存储