c++/OpenGL/GLSL,带有 "random" 工件的纹理
c++/OpenGL/GLSL, textures with "random" artifacts
想知道是否有人遇到过这种情况并知道原因。使用 "texture arrays"
后我得到了这些奇怪的工件
http://i.imgur.com/ZfLYmQB.png
(我的GPU是AMD R9 270)
- ninja edit 删除了 post 的其余部分以提高可读性,因为它只是显示可能出现问题的代码,因为该项目现在是开源的我只显示问题的根源(片段着色器)
片段:
#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;
}
不是最漂亮的,但现在还不错!
看起来着色器正在渲染它在内存中找到的任何随机数据。
您是否尝试检查是否在正确的时间(渲染之前)调用了 glBindTexture(...) 以及使用的值(由 glGenTextures(...) 返回)是否有效?
I'm getting these strange artifacts after using "texture arrays"
您没有使用 "texture arrays"。您使用 纹理采样器数组 。来自您的片段着色器:
#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 specification 的规定
,不允许您在此处尝试执行的操作
Samplers aggregated into arrays within a shader (using square brackets
[ ]) can only be indexed with integral constant expressions (see
section 4.3.3 “Constant Expressions”).
您的 tid
不是常量,所以这行不通。
在 GL 4 中,此限制有所放宽(引用自 GLSL 4.50 spec):
When aggregated into arrays within a shader, samplers can only be
indexed with a dynamically uniform integral expression, otherwise
results are undefined.
你现在的输入也不是动态统一,所以你也会得到未定义的结果。
我不知道你想达到什么目的,但也许你可以通过使用 array textures 来实现它,它会将一组完整的图像表示为单个 GL 纹理对象,并且不会强加访问它们时的此类限制。
想知道是否有人遇到过这种情况并知道原因。使用 "texture arrays"
后我得到了这些奇怪的工件http://i.imgur.com/ZfLYmQB.png
(我的GPU是AMD R9 270)
- ninja edit 删除了 post 的其余部分以提高可读性,因为它只是显示可能出现问题的代码,因为该项目现在是开源的我只显示问题的根源(片段着色器)
片段:
#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;
}
不是最漂亮的,但现在还不错!
看起来着色器正在渲染它在内存中找到的任何随机数据。 您是否尝试检查是否在正确的时间(渲染之前)调用了 glBindTexture(...) 以及使用的值(由 glGenTextures(...) 返回)是否有效?
I'm getting these strange artifacts after using "texture arrays"
您没有使用 "texture arrays"。您使用 纹理采样器数组 。来自您的片段着色器:
#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 specification 的规定
,不允许您在此处尝试执行的操作Samplers aggregated into arrays within a shader (using square brackets [ ]) can only be indexed with integral constant expressions (see section 4.3.3 “Constant Expressions”).
您的 tid
不是常量,所以这行不通。
在 GL 4 中,此限制有所放宽(引用自 GLSL 4.50 spec):
When aggregated into arrays within a shader, samplers can only be indexed with a dynamically uniform integral expression, otherwise results are undefined.
你现在的输入也不是动态统一,所以你也会得到未定义的结果。
我不知道你想达到什么目的,但也许你可以通过使用 array textures 来实现它,它会将一组完整的图像表示为单个 GL 纹理对象,并且不会强加访问它们时的此类限制。