【发布时间】:2014-11-13 19:35:10
【问题描述】:
我正在使用现代 OpenGL 4.3 核心。
我刚刚意识到 1024p x 1024p 的图块集对于我的需求来说太小了。因此,我将其替换为 1024p x 1024p x 4p 3D 纹理。 (我知道,这不是最好的解决方案,我最好使用 2D 纹理数组。我只是想知道为什么我目前的解决方案不起作用。)
x 和 y 纹理坐标工作正常,和以前一样。 z 也可以,但有点不正确。我希望第一层有z == 0.0,第二层 - z == 0.3333333,第三层 - z == 0.66666666 和第四层 - z == 1.0。
第 1 层和第 4 层按预期工作。但是0.33333333 和0.66666666 给了我不正确的结果:
0.33333333 -> 第一层与第二层混合
0.66666666 -> 第 3 层与第 4 层混合
(我使用的是线性过滤,这就是它们混合在一起的原因。)
我尝试为第 2 层和第 3 层选择正确的 z 值:z == 0.38
时第二个显示正常
z == 0.62
时第三个显示正常
(当然,这些数字是近似值。)
任何想法为什么会发生这种情况以及如何解决这个问题?
这就是我创建纹理的方式:
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &maintex);
glBindTexture(GL_TEXTURE_3D, maintex);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, TEXSIZE, TEXSIZE, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, textemp);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
这是我的着色器:
const char *vertex = 1+R"(
#version 430
uniform layout(location = 3) vec2 fac;
in layout(location = 0) vec2 vpos; // vertex coords
in layout(location = 1) vec3 tpos; // texture coords
in layout(location = 2) vec4 c_off; // color offset = vec4(0,0,0,0) by default
in layout(location = 3) vec4 c_mult; // color multiplicator = vec4(1,1,1,1) by default
// These two are used to do some sort of gamma correction
out vec3 var_tpos;
out vec4 var_c_off;
out vec4 var_c_mult;
void main()
{
var_tpos = tpos;
var_c_off = c_off;
var_c_mult = c_mult;
gl_Position = vec4(vpos.x * fac.x - 1, vpos.y * fac.y + 1, 0, 1);
})";
const char *fragment = 1+R"(
#version 430
uniform layout(location = 0) sampler3D tex;
in vec3 var_tpos;
in vec4 var_c_off;
in vec4 var_c_mult;
out vec4 color;
void main()
{
color = texture(tex, vec3(var_tpos.x / 1024, var_tpos.y / 1024, var_tpos.z));
color.x *= var_c_mult.x;
color.y *= var_c_mult.y;
color.z *= var_c_mult.z;
color.w *= var_c_mult.w;
color += var_c_off;
})";
【问题讨论】:
-
不要为精灵表使用 3D 纹理,而是尝试 2D 阵列纹理。它们不会在图层之间混合。
-
@ColonelThirtyTwo 我知道有更好的解决方案。我问这个问题是因为我对自己的程序行为感到困惑。
-
阅读您问题的人可能不会,所以仍然值得一提。
-
@ColonelThirtyTwo 好的,我在问题中添加了有关 2D 纹理数组的信息。
标签: opengl 3d textures opengl-4