【问题标题】:Shader for counting number of pixels用于计算像素数的着色器
【发布时间】:2015-03-30 17:57:12
【问题描述】:

我正在寻找一个着色器 CG 或 HLSL,它可以计算红色像素的数量或我想要的任何其他颜色。

【问题讨论】:

  • 反对者,请解释你的仇恨。 @ragia,这可能会有所帮助stackoverflow.com/questions/23091370/…
  • 我希望我知道他们为什么投反对票!
  • 投反对票是 StackOverflow 的一部分,但投反对票的目的是在评论中指出他们投反对票的原因。 /耸肩/
  • 像素是什么意思?使用纹理的像素?着色器渲染到屏幕上的像素?你的问题是什么让你认为你想用着色器计算红色像素?
  • 我想做一个历史图。我需要计算渲染到纹理的像素(渲染目标图像)

标签: graphics unity3d glsl hlsl


【解决方案1】:

您可以在片段着色器中使用atomic counters 执行此操作。只需测试输出颜色以查看它是否在一定的红色公差范围内,如果是,则增加计数器。在绘制调用之后,您应该能够在 CPU 上读取计数器的值,并使用它做任何您喜欢的事情。

编辑:添加了一个非常简单的示例片段着色器:

// 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;
}

您还需要在代码中设置原子计数器:

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

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

【讨论】:

  • 你能提供一个简单的着色器示例吗?
猜你喜欢
  • 2014-05-30
  • 2012-10-21
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多