Код: Выделить всё
// Create gbuffer framebuffer
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
//Create depth - stencil texture
glGenTextures(1, &depthStencilTexture);
glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, WINDOW_WIDTH, WINDOW_HIEGHT, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
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_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Код: Выделить всё
glBindImageTexture(0, outputTexture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
glBindImageTexture(1, depthStencilTexture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32UI);
Код: Выделить всё
computeShader->Use();
glDispatchComputeGroupSizeARB(WINDOW_WIDTH, WINDOW_HIEGHT, 1,
1, 1, 1);
glMemoryBarrier(accessBit);
Код: Выделить всё
#version 430 core
#extension GL_ARB_compute_variable_group_size: enable // Allows this shader to use local_size_variable. So local size can be specified from the cpu
layout (local_size_variable) in;
layout (rgba32f, binding = 0) uniform image2D imgOutput;
layout(r32ui, binding = 1) readonly uniform uimage2D depthStencil;
void main()
{
ivec2 coord = ivec2(gl_GlobalInvocationID.xy);
uint packedValue = imageLoad(depthStencil, coord).r;
uint stencil = packedValue & 0xFF;
vec4 output = vec4(stencil, stencil , stencil , 1.0);
imageStore(imgOutput, coord, output);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ute-shader