OpenGL:在 GLSL 中访问数组纹理
OpenGL: Access Array Texture in GLSL
当我 运行 遇到问题时,我正试图在 PyOpenGL 中对立方体进行纹理处理。 PyOpenGL 仅支持 1.10、1.20、1.30、1.00 ES 和 3.00 ES。我至少需要 1.40 版本,因为在 1.40 中引入了 layout
,我需要使用 layout
来获取纹理坐标。我正在尝试使用数组纹理对立方体的每一面进行不同的纹理处理。如果需要,这里是我的一些代码片段。
加载数组纹理:
def load_texture_array(path,width,height):
teximg = pygame.image.load(path)
texels = teximg.get_buffer().raw
texture = GLuint(0)
layerCount = 6
mipLevelCount = 1
glGenTextures(1, texture)
glBindTexture(GL_TEXTURE_2D_ARRAY, texture)
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount)
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
我的顶点着色器:
#version 130
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 color;
out vec2 TexCoord;
void main() {
gl_Position = vec4(aPos, 1.0);
color = aColor;
TexCoord = aTexCoord;
}
我的片段着色器:
#version 130
out vec4 FragColor;
in vec3 color;
in vec2 TexCoord;
uniform sampler2D texture;
void main()
{
FragColor = texture(texture, TexCoord);
}
如果您需要更多信息,请在评论中提问,我会添加。
PyOpenGL only supports 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES [...]
没有。 PyOpenGL 支持从 1.0 到 3.1 的 OpenGL ES 版本和从 1.1 到 4.4 的所有桌面 OpenGL 版本(参见 About PyOpenGL). You confused (desktop) OpenGL and OpneGL ES. Compare OpenGL specification - Khronos OpenGL registry and OpenGL ES Specification - Khronos OpenGL ES Registry。
无论如何,“支持”版本仅指 OpenGL API。 OpenGL context 版本仅取决于显卡。您可以使用当前 OpenGL 上下文支持的任何 GLSL 版本。 PyOpenGL 保证 OpenGL API 实现到版本 4.4,但您也可以使用更高版本。这只是意味着 PyOpenGL 中可能缺少后来添加的 OpenGL 函数 API.
创建 OpenGL window 并使上下文成为当前版本后记录当前版本:
print(glGetString(GL_VENDOR))
print(glGetString(GL_RENDERER))
print(glGetString(GL_VERSION))
print(glGetString(GL_SHADING_LANGUAGE_VERSION))
顶点着色器输入 Layout Qualifier are not supported in OpenGL Shading Language 1.30. You have to switch to OpenGL Shading Language 1.40:
#version 130
#version 140
无论如何你在你的问题中提到过 - “我至少需要 1.40 版,因为在 1.40 中引入了布局 [...]”
glsl 采样器类型必须与纹理目标匹配。 (浮点数)GL_TEXTURE_2D_ARRAY
的正确采样器类型是 sampler2Darray
(参见 Sampler types):
uniform sampler2D texture;
uniform sampler2Darray texture;
对于 2 维阵列纹理,需要 3 维纹理坐标(参见 texture
):
FragColor = texture(texture, TexCoord);
FragColor = texture(texture, vec3(TexCoord.st, index));
index
是数组中寻址纹理的索引。您可以通过 Uniform 变量甚至纹理坐标属性中的第三个组件提供索引。
当我 运行 遇到问题时,我正试图在 PyOpenGL 中对立方体进行纹理处理。 PyOpenGL 仅支持 1.10、1.20、1.30、1.00 ES 和 3.00 ES。我至少需要 1.40 版本,因为在 1.40 中引入了 layout
,我需要使用 layout
来获取纹理坐标。我正在尝试使用数组纹理对立方体的每一面进行不同的纹理处理。如果需要,这里是我的一些代码片段。
加载数组纹理:
def load_texture_array(path,width,height):
teximg = pygame.image.load(path)
texels = teximg.get_buffer().raw
texture = GLuint(0)
layerCount = 6
mipLevelCount = 1
glGenTextures(1, texture)
glBindTexture(GL_TEXTURE_2D_ARRAY, texture)
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount)
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
我的顶点着色器:
#version 130
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 color;
out vec2 TexCoord;
void main() {
gl_Position = vec4(aPos, 1.0);
color = aColor;
TexCoord = aTexCoord;
}
我的片段着色器:
#version 130
out vec4 FragColor;
in vec3 color;
in vec2 TexCoord;
uniform sampler2D texture;
void main()
{
FragColor = texture(texture, TexCoord);
}
如果您需要更多信息,请在评论中提问,我会添加。
PyOpenGL only supports 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES [...]
没有。 PyOpenGL 支持从 1.0 到 3.1 的 OpenGL ES 版本和从 1.1 到 4.4 的所有桌面 OpenGL 版本(参见 About PyOpenGL). You confused (desktop) OpenGL and OpneGL ES. Compare OpenGL specification - Khronos OpenGL registry and OpenGL ES Specification - Khronos OpenGL ES Registry。
无论如何,“支持”版本仅指 OpenGL API。 OpenGL context 版本仅取决于显卡。您可以使用当前 OpenGL 上下文支持的任何 GLSL 版本。 PyOpenGL 保证 OpenGL API 实现到版本 4.4,但您也可以使用更高版本。这只是意味着 PyOpenGL 中可能缺少后来添加的 OpenGL 函数 API.
创建 OpenGL window 并使上下文成为当前版本后记录当前版本:
print(glGetString(GL_VENDOR))
print(glGetString(GL_RENDERER))
print(glGetString(GL_VERSION))
print(glGetString(GL_SHADING_LANGUAGE_VERSION))
顶点着色器输入 Layout Qualifier are not supported in OpenGL Shading Language 1.30. You have to switch to OpenGL Shading Language 1.40:
#version 130
#version 140
无论如何你在你的问题中提到过 - “我至少需要 1.40 版,因为在 1.40 中引入了布局 [...]”
glsl 采样器类型必须与纹理目标匹配。 (浮点数)GL_TEXTURE_2D_ARRAY
的正确采样器类型是 sampler2Darray
(参见 Sampler types):
uniform sampler2D texture;
uniform sampler2Darray texture;
对于 2 维阵列纹理,需要 3 维纹理坐标(参见 texture
):
FragColor = texture(texture, TexCoord);
FragColor = texture(texture, vec3(TexCoord.st, index));
index
是数组中寻址纹理的索引。您可以通过 Uniform 变量甚至纹理坐标属性中的第三个组件提供索引。