在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 着色器中混合多个纹理会导致反向行为