Shader for counting number of pixels

谁说我不能喝 提交于 2020-01-05 02:34:12

问题


I'm looking for a shader CG or HLSL, that can count number of red pixels or any other colors that I want.


回答1:


You could do this with atomic counters in a fragment shader. Just test the output color to see if it's within a certain tolerance of red, and if so, increment the counter. After the draw call you should be able to read the counter's value on the CPU and do whatever you like with it.

edit: added a very simple example fragment shader:

// Atomic counters require 4.2 or higher according to
// https://www.opengl.org/wiki/Atomic_Counter

#version 440
#extension GL_EXT_gpu_shader4 : enable

// Since this is a full-screen quad rendering, 
// the only input we care about is texture coordinate. 
in vec2 texCoord;

// Screen resolution
uniform vec2 screenRes;

// Texture info in case we use it for some reason
uniform sampler2D tex;

// Atomic counters! INCREDIBLE POWER
layout(binding = 0, offset = 0) uniform atomic_uint ac1;

// Output variable!
out vec4 colorOut;

bool isRed(vec4 c)
{
    return c.r > c.g && c.r > c.b;
}

void main() 
{
    vec4 result = texture2D(tex, texCoord);

    if (isRed(result))
    {
        uint cval = atomicCounterIncrement(ac1);
    }

    colorOut = result;
}

You would also need to set up the atomic counter in your code:

GLuint acBuffer = 0;
glGenBuffers(1, &acBuffer);

glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, acBuffer);
glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), NULL, GL_DYNAMIC_DRAW);


来源:https://stackoverflow.com/questions/29352965/shader-for-counting-number-of-pixels

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!