想知道是否有人经历过这种情况并知道原因。使用“纹理数组”后,我得到了这些奇怪的工件
http://i.imgur.com/ZfLYmQB.png
(我的GPU是AMD R9 270)
片段:
#version 330 core
layout (location = 0) out vec4 color;
uniform vec4 colour;
uniform vec2 light;
in DATA{
vec4 position;
vec2 uv;
float tid;
vec4 color;
}fs_in;
uniform sampler2D textures[32];
void main()
{
float intensity = 1.0 / length(fs_in.position.xy - light);
vec4 texColor = fs_in.color;
if(fs_in.tid > 0.0){
int tid = int(fs_in.tid - 0.5);
texColor = texture(textures[tid], fs_in.uv);
}
color = texColor; // * intensity;
}
编辑:github repos(很抱歉,如果它缺少一些库,无法将它们链接到github)https://github.com/PedDavid/NubDevEngineCpp
编辑:感谢derhass指出我正在做一些未定义结果的事情(不带常量([tid])访问数组)。我现在有与之合作
switch(tid){
case 0: textureColor = texture(textures[0], fs_in.uv); break;
...
case 31: textureColor = texture(textures[31], fs_in.uv); break;
}
不是最漂亮的,但现在还可以!
使用“纹理数组”后,我得到了这些奇怪的工件
您没有使用“纹理数组”。您使用纹理采样器数组。从片段着色器:
#version 330 core // ... in DATA{ // ... float tid; }fs_in; //... if(fs_in.tid > 0.0){ int tid = int(fs_in.tid - 0.5); texColor = texture(textures[tid], fs_in.uv); }
根据GLSL 3.30规范,您在此处尝试做的事情是不允许的
聚合到着色器中的数组中的采样器(使用方括号[])只能用整数常量表达式索引(请参见第4.3.3节“常量表达式”)。
您tid
不是一个常数,因此这将不起作用。
在GL 4中,此约束有所放松(引自GLSL 4.50 spec):
当将它们聚合到着色器中的数组中时,只能使用动态统一的整数表达式对采样器进行索引,否则结果将不确定。
您现在输入的内容也不是动态统一的,因此您也将获得未定义的结果。
我不知道您要达到什么目的,但是也许可以通过使用数组纹理来实现,它可以将一组完整的图像表示为单个GL纹理对象,并且在访问它们时不会施加此类约束。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句