在opengl矩形上使用着色器会导致它消失[关闭]

Posted

技术标签:

【中文标题】在opengl矩形上使用着色器会导致它消失[关闭]【英文标题】:Using shader on opengl rectangle causes it to disappear [closed] 【发布时间】:2019-05-25 12:40:30 【问题描述】:

我目前正在尝试使用 OpenGL 将纹理渲染到我一直在研究的游戏引擎中,但遇到了一个我不确定如何解决的问题。在矩形上使用我的着色器来渲染纹理时,它根本不显示。

我可以注释掉一行代码,然后会显示一个黑色矩形,因此我知道该矩形至少可以正确呈现。问题是当我要求 OpenGL 使用我的着色器程序时。

这里注释掉了ourshader.Use

// Clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

//ourShader.Use(); <----this is using the shader
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture"), 0);

// Draw container
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

我明白了

没有我就得到了

这对我来说很奇怪,因为在另一个测试项目中,我可以使用完全相同的代码完全渲染纹理。

片段着色器

#version 330 core
in vec3 ourColor;
in vec2 TexCoord;

out vec4 color;

// Texture samplers
uniform sampler2D ourTexture1;

void main()

    // Linearly interpolate between both textures (second texture is only slightly combined)
    color = texture(ourTexture1, TexCoord);

垂直着色器

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
layout (location = 2) in vec2 texCoord;

out vec3 ourColor;
out vec2 TexCoord;

void main()

    gl_Position = vec4(position, 1.0f);
    ourColor = color;
    // We swap the y-axis by substracing our coordinates from 1. This is done because most images have the top y-axis inversed with OpenGL's top y-axis.
    // TexCoord = texCoord;
    TexCoord = vec2(texCoord.x, 1.0 - texCoord.y);

我确实复制并粘贴了代码,但似乎无法获得相同的结果。问题之一可能是我在一个构建为 .dll 的项目中渲染它,然后在同一解决方案中的另一个项目中引用它,但我知道 OpenGL 正在工作,因为我仍然可以渲染矩形?

我还通过绘制一个简单的无纹理三角形对此进行了测试,效果很好。

我什至可以在它上面使用着色器并弄乱颜色等等,那么为什么这个纹理着色器不起作用呢?特别令人困惑,因为我已经在另一个项目中测试了这个着色器并且它工作正常?所以我很困,不得不在这里寻求帮助。

【问题讨论】:

在哪里生成纹理名称(glGenTextures)?你在哪里指定纹理图像glTexImage2D?当您指定纹理图像时,OpenGL 上下文是否有效(并且是当前的)?请阅读How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:
    glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture"), 0);

您使用名称“ourTexture”指定采样器的位置,但着色器内部的采样器名称为“ourTexture1”。

您还可以在着色器中明确指定纹理位置

layout (location = 0) uniform sampler2D ourTexture;

那你只需要调用

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);

将纹理绑定到纹理单元 0。

【讨论】:

成功了!我之前实际上注意到了这一点,并相应地更改了采样器名称,但没有任何结果,但在再次测试后它似乎有效?我肯定错过了什么。感谢您的回答!不可否认,我是一个 opengl 菜鸟,它似乎想在每一步都与我战斗哈哈。这可能不会是您最后一次收到我的消息。再次感谢!

以上是关于在opengl矩形上使用着色器会导致它消失[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:只模糊纹理的一部分;可以使用顶点着色器加速吗?

在 iOS 上的 OpenGL ES 着色器中混合多个纹理会导致反向行为

如何避免使用着色器在 OpenGL 中消失线?

c ++ opengl我如何制作着色器文件并在主cpp中使用它[关闭]

用于在大满贯中绘制特征点的opengl着色器[关闭]

光照在 OpenGL 中不显示