PyOpenGL计算着色器写入纹理

yr9zkbsy  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在尝试实现我用python编写的光线跟踪器的计算着色器版本,并且我正在遵循此教程:learnopengl的数据。
我无法让计算着色器写入纹理。我甚至不知道计算着色器是否在运行。我可以做什么测试来验证它是否正确编译和运行?
显示纹理的其余代码和纹理对象本身按预期工作,因为通过将图像直接上传到纹理,我可以正确地显示它。
设置:

self.compute_shader = glCreateShader(GL_COMPUTE_SHADER)
text = open("../shaders/compute.glsl", 'r')
compute_shader_source = text.read()

glShaderSource(self.compute_shader, compute_shader_source)
glCompileShader(self.compute_shader)

self.program_id = glCreateProgram()
glAttachShader(self.program_id, self.compute_shader)
glLinkProgram(self.program_id)

self.texture = 0
glGenTextures(1, self.texture)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, self.texture)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 200, 160, 0, GL_RGBA, GL_UNSIGNED_BYTE, None)
glBindImageTexture(0, self.texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F)

字符串
渲染调用:

glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, self.texture)

glUseProgram(self.program_id)
glDispatchCompute(200, 160, 1)
glMemoryBarrier(GL_ALL_BARRIER_BITS)


计算着色器:

#version 430 core

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout (rgba32f, binding = 0) uniform image2D imgOutput;

void main() {
    vec4 value = vec4(1.0, 0.0, 0.0, 1.0);
    ivec2 texelCoord = ivec2(gl_GlobalInvocationID.xy);
    
    value.x = float(texelCoord.x)/(gl_NumWorkGroups.x);
    value.y = float(texelCoord.y)/(gl_NumWorkGroups.y);
    
    imageStore(imgOutput, texelCoord, value);
}


我执行这段代码时看到的只是一个黑屏。如前所述,在创建纹理对象期间加载图像数据会导致图像在屏幕上正确显示,而将纹理留空并运行计算着色器来填充它,我只会得到一个黑屏。
另外,加载图像后,计算着色器不会在前一个图像上写入内容,这让我认为它要么根本没有运行,要么没有向纹理写入任何内容。
(size屏幕和纹理的尺寸为200x160)

wwwo4jvm

wwwo4jvm1#

算出来了,结果是如果我使用glTexImage2D,程序就不工作了,正确的方法是使用glTexStorage2D。
因此,而不是:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 200, 160, 0, GL_RGBA, GL_UNSIGNED_BYTE, None)

字符串
用途:

glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 200, 160)


我真的不知道为什么在learnopengl上他们使用glTexStorage2D,我也不明白为什么它对这么多人有效,但这修复了我的代码

相关问题