Java GLSL未按预期工作的问题

Java GLSL未按预期工作的问题,java,opengl,glsl,lwjgl,Java,Opengl,Glsl,Lwjgl,所以我想知道这是不是可以再创造 在调试java opengl项目时,我发现了一个着色器: #version 420 core uniform sampler2D texture1; uniform sampler2D texture2; in vec2 uv; out vec4 fragColor; void main(){ //fragColor = texture(texture1, uv); fragColor = texture(texture2, uv); }

所以我想知道这是不是可以再创造

在调试java opengl项目时,我发现了一个着色器:

#version 420 core

uniform sampler2D texture1;
uniform sampler2D texture2;

in vec2 uv;

out vec4 fragColor;

void main(){
    //fragColor = texture(texture1, uv);
    fragColor = texture(texture2, uv);
}
看起来很简单,但现在当我取消对//fragColor=纹理(texture1,uv)的命令并保留其余部分时,我会将texture1渲染到屏幕上。为什么?我的大脑说那是不对的,它不应该只渲染纹理2,因为我覆盖了fragColor吗?有人能解释一下吗

更新1: 我相信这是glsl编译的问题

当没有纹理绑定到采样器0时,是否可以将纹理绑定到采样器1

更新2: 创建纹理: 在我的例子中,它只是一个带有1个样本的纹理,所以纹理为2D 它的格式是.png,所以有4个频道 并且没有应用插值

       texType = samples > 1 ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D;

        int format;
        if (channels == 3) {
            format = GL_RGB;
        } else if (channels == 4) {
            format = GL_RGBA;
        } else {
            throw new AspectGraphicsException("textures can't be initialized with " + channels + " channels");
        }

        ID = glGenTextures();

        glBindTexture(texType, ID);

        glTexParameteri(texType,
                GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(texType,
                GL_TEXTURE_MAG_FILTER, interpolation ? GL_LINEAR : GL_NEAREST);

        glTexParameteri(texType, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(texType, GL_TEXTURE_WRAP_T, GL_REPEAT);

        if (samples > 1) {
            if (pixels == null) {
                glTexImage2DMultisample(texType, samples, format,
                        width, height, true);
            } else {
                throw new AspectGraphicsException("textures with defined with pixels can't be multisampled");
            }
        } else {
            if (pixels == null) {
                glTexImage2D(texType, 0, format, width, height,
                        0, format, GL_UNSIGNED_BYTE, NULL);
            } else {
                glTexImage2D(texType, 0, format,
                        width, height, 0, format,
                        GL_UNSIGNED_BYTE, pixels);
            }
        }
        glBindTexture(texType, 0);
绑定纹理: texType只是GL_纹理_2D 取样器名称为“texture1”或“texture2”(请参见glsl着色器中的) 取样器仅用于“texture1”:0和“texture2”:1


很可能您没有为采样器制服指定纹理单位,因此它们都被设置为指向
GL_TEXTURE0
。可以在着色器中指定它,如下所示:

#version 420 core
layout(binding=0) uniform sampler2D texture1;
layout(binding=1) uniform sampler2D texture2;
// ...
然后使用以下对象绑定纹理:

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, your_texture);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, other_texture);
glDrawArrays(...);
如果这样做的话,你会得到正确的结果,不管什么制服被遗漏了


请参阅。

很可能您没有为采样器制服指定纹理单位,因此它们都被设置为指向
GL\u TEXTURE0
。可以在着色器中指定它,如下所示:

#version 420 core
layout(binding=0) uniform sampler2D texture1;
layout(binding=1) uniform sampler2D texture2;
// ...
然后使用以下对象绑定纹理:

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, your_texture);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, other_texture);
glDrawArrays(...);
如果这样做的话,你会得到正确的结果,不管什么制服被遗漏了


请参见。

绘图前是否同时设置纹理和制服?绘图前是否同时设置纹理和制服?