**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
19天前关门了。
改进这个问题
所以我想知道这是不是可以重现?
在调试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=texture(texture1,uv)的命令并保留其余部分时,我会将texture1渲染到屏幕上。为什么?我的大脑说那是不对的,它不应该仅仅渲染纹理2,因为我覆盖了fragcolor吗?有人能解释一下吗?
更新1:我认为glsl编译有问题。
当没有纹理绑定到sampler0时,是否可以将纹理绑定到sampler1
更新2:创建纹理:在我的例子中,它只是一个带有1个样本的纹理,所以纹理是二维的,它的格式是.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\u texture\u 2d,sampler name是“texture1”或“texture2”(请参见glsl着色器中的内容),sampler只是用于“texture1”:0和“texture2”:1
glActiveTexture(GL_TEXTURE0 + sampler);
glBindTexture(texType, ID);
shader.uniform1i(samplerName, sampler);
1条答案
按热度按时间pgccezyw1#
很可能您没有为采样器制服指定纹理单位,因此它们都被设置为指向
GL_TEXTURE0
. 可以在着色器中指定它,如下所示:然后将纹理绑定到:
如果这样做,你会得到正确的结果,不管什么制服被遗漏了。
请参见将纹理绑定到采样器。