Java GLSL未按预期工作的问题
所以我想知道这是不是可以再创造 在调试java opengl项目时,我发现了一个着色器: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); }
#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(...);
如果这样做的话,你会得到正确的结果,不管什么制服被遗漏了
请参见。绘图前是否同时设置纹理和制服?绘图前是否同时设置纹理和制服?