- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 OpenGL 和 C++ 开发一个简单的图像处理应用程序。但是,有一件事我不知道该怎么做,那就是:
我需要让我的用户绘制直方图。我想这样做的方法是为图像的每个像素强度创建一个四边形网格。示例:如果图像是 8 位,我的网格中需要 256x256 个四边形。绘制网格后,我希望用户以量化的方式(每个四边形)手动绘制四边形,以便他可以“绘制”直方图。问题是我不知道如何做这些事情......谁能指导我如何绘制网格,以及如何制作绘画。
如果您对“绘制直方图”感到困惑,只需将其视为常规图形即可。
最佳答案
您不必绘制四边形网格。一个四边形就足够了,然后使用着色器从存储在一维纹理中的直方图中采样。这是我得到的:
顶点着色器:
#version 450 core
layout(std140, binding = 0) uniform view_block {
vec2 scale, offset;
} VIEW;
layout(std140, binding = 1) uniform draw_block {
vec4 position;
float max_value;
} DRAW;
out gl_PerVertex {
vec4 gl_Position;
};
void main()
{
ivec2 id = ivec2(gl_VertexID&1, gl_VertexID>>1);
vec2 position = vec2(DRAW.position[id.x<<1], DRAW.position[(id.y<<1) + 1]);
gl_Position = vec4(fma(position, VIEW.scale, VIEW.offset), 0, 1);
}
片段着色器:
#version 450 core
layout(std140, binding = 1) uniform draw_block {
vec4 position;
float max_value;
} DRAW;
layout(binding = 0) uniform sampler1D hist;
layout(location = 0) out vec4 OUT;
void main()
{
const vec2 extent = DRAW.position.zw - DRAW.position.xy;
vec2 texcoord = (gl_FragCoord.xy - DRAW.position.xy)/(DRAW.position.zw - DRAW.position.xy);
OUT.rgb = vec3(lessThan(texcoord.yyy*DRAW.max_value, texture(hist, texcoord.x).rgb));
OUT.a = 1;
}
直方图纹理创建:
image hist(256, 1, 3, type_float);
// ... calculate the histogram ...
tex.reset(glCreateTextureSN(GL_TEXTURE_1D));
glTextureStorage1D(tex.get(), 1, GL_RGB32F, hist.w);
glTextureSubImage1D(tex.get(), 0, 0, hist.w, GL_RGB, GL_FLOAT, hist.c[0]);
glTextureParameteri(tex.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
渲染例程:
const vec2i vs = { glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT) };
glViewport(0, 0, vs[0], vs[1]);
glClear(GL_COLOR_BUFFER_BIT);
struct view_block {
vec2f scale, offset;
} VIEW = {
vec2f(2)/vec2f(vs), -vec2f(1)
};
GLbuffer view_buf(glCreateBufferStorageSN(sizeof(VIEW), &VIEW, 0));
glBindBufferBase(GL_UNIFORM_BUFFER, 0, view_buf.get());
struct draw_block {
box2f position;
float max_value;
} DRAW = {
box2f(0, 0, vs[0], vs[1]),
max_value
};
GLbuffer draw_buf(glCreateBufferStorageSN(sizeof(DRAW), &DRAW, 0));
glBindBufferBase(GL_UNIFORM_BUFFER, 1, draw_buf.get());
bind_textures(tex.get());
glBindProgramPipeline(pp.get());
glBindVertexArray(0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glutSwapBuffers();
关于openGL-绘制四边形网格并手动绘制它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190236/
我确实遇到了这个问题。 我有一个可以是任何形状的多边形(四边形)。当我的鼠标位于多边形内时,我需要找到鼠标所在位置(四边形内)的 x,y 值,就好像多边形是完美的正方形一样。进一步解释;我有一个 32
我的问题是关于 OpenGL 和法线,我理解它们背后的数学原理,并且我取得了一些成功。 我在下面附加的函数接受一个交错的顶点数组,并计算每 4 个顶点的法线。这些代表具有相同方向的 QUADS。据我了
我想检测图像中的矩形。 我使用 cv2.findContours() 和 cv2.convexHull() 过滤掉不规则多边形。 之后,我将使用船体长度来判断轮廓是否为矩形。 hull = cv2.c
有谁知道将 vector 路径转换为由三角形/四边形面组成的描边路径的好算法?理想情况下使用圆线连接。 基本上,我试图绘制一条粗路径,其颜色基于随路径距离变化的值。我正在考虑将路径转换为三角形/四边形
我有 WebGL/OpenGL 的基本知识,但不了解 gl.bufferSubData。所以我的目标是创建一个 SpriteBatch 类,就像这个问题 First Question 一样。由于我认为
我用 OpenGL 渲染两个具有相等 z 的四边形。当我启用 DEPTH 时,我得到以下图像,但当它关闭时,我得到我需要的一个水果而不是另一个。是否可以按我的意愿绘制具有相等 z 的四边形?我的 OG
我一直在尝试让模板测试在我的 OpenTK 2D 游戏中工作,但没有成功 - 我只想在模板缓冲区中绘制低于 say 1 值的纹理部分。花了很长时间阅读模板及其工作原理,但在 C# 中找不到一个示例。下
我有一个 2D 空间,其中包含任意数量的对象(它们是圆形或四边形 - 这无关紧要),在每个时间刻度中具有不同的大小和不同的位置。我想为任何基元(示例图片中的绿色圆圈)找到一个 y 位置,使其不与任何其
我是一名优秀的程序员,十分优秀!