Ich bin in OpenGL 4.5 (OpenGL.net in C#, aber der Code ist sehr ähnlich zu normalen OpenGL-Code), und versuche, einen Compute-Shader zu verwenden. Hier ist, was ich bisher:Warum macht mein Compute Shader nichts?
// (Compile and link stuff, this part I know works)
// Use the compute shader
Gl.UseProgram(program);
// Create the texture the compute shader will output to
int textureWidth = 512, textureHeight = 512;
uint[] texturesMaking = new uint[1];
Gl.GenTextures(texturesMaking);
uint texture = texturesMaking[0];
Gl.ActiveTexture(Gl.TEXTURE0);
Gl.BindTexture(TextureTarget.Texture2d, texture);
Gl.TextureParameter(Gl.TEXTURE_2D, Gl.TEXTURE_MAG_FILTER, Gl.NEAREST);
Gl.TextureParameter(Gl.TEXTURE_2D, Gl.TEXTURE_MIN_FILTER, Gl.NEAREST);
Gl.TexImage2D(TextureTarget.Texture2d, 0, Gl.RGBA32F, textureWidth, textureHeight, 0, PixelFormat.Rgba, PixelType.Float, IntPtr.Zero);
// Get the shader output variable and set it
int location = Gl.GetUniformLocation(program, "destTex");
Gl.Uniform1(location, texture);
Gl.BindImageTexture(0, texture, 0, false, 0, Gl.READ_WRITE, Gl.RGBA32F);
// Send off the compute shader to do work, with one group per pixel
// (I know this is far less than optimal, it was just a debugging thing)
Gl.DispatchCompute((uint)textureWidth, (uint)textureHeight, 1);
// Wait for compute shader to finish
Gl.MemoryBarrier(Gl.SHADER_IMAGE_ACCESS_BARRIER_BIT);
// Looking at the texture, it is black
Und hier ist mein Compute-Shader:
#version 450
layout(local_size_x = 1, local_size_y = 1) in;
layout(rgba32f) uniform image2D destTex;
void main() {
imageStore (destTex, ivec2(gl_GlobalInvocationID.xy), vec4(1.0, 0.0, 1.0, 1.0));
}
Wenn Verstehe ich das richtig, meine Textur eine lila/rosa Farbe nach den Shader-Läufe sein sollte, aber stattdessen es ist nur schwarz, und das Ausdrucken einiger Farben der Pixel zeigt, dass alle Werte gleich null sind. Was mache ich falsch?
Wie sehen Sie "die Textur"? Hast du eine Speicherbarriere, die der Art von "Schauen" entspricht, die du machst? –
Ah, das könnte das Problem sein. Ich verwende 'Gl.GetTexImage (TextureTarget.Texture2d, 0, PixelFormat.Rgba, PixelType.Float, pixelArrayPointer);' (für einen Zeiger auf ein 'float []' der Größe 'textureWidth * textureHeight * 4'). Sobald ich diese Floatdaten habe, speichere ich sie in einem Bild und öffne dann das Bild, um den Inhalt zu sehen. – Phylliida
Für diejenigen, die interessiert sind, stelle ich meinen resultierenden Code [hier] (http://answers.unity3d.com/answers/1205676/view.html) – Phylliida