我正在尝试实现我用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)
1条答案
按热度按时间wwwo4jvm1#
算出来了,结果是如果我使用glTexImage2D,程序就不工作了,正确的方法是使用glTexStorage2D。
因此,而不是:
字符串
用途:
型
我真的不知道为什么在learnopengl上他们使用glTexStorage2D,我也不明白为什么它对这么多人有效,但这修复了我的代码