- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注这个 tutorial用于绽放效果。
我正在使用 Qt,我尝试渲染的场景由五个立方体和五个随机放置的灯组成,类似于这样。
不幸的是,当我尝试使用帧缓冲区时,渲染的场景完全是空的(只有背景颜色)。
这些是代码的相关部分。
初始化GL方法:
void initializeGL()
{
initializeOpenGLFunctions();
// ...
// hdr framebuffer
glGenFramebuffers(1, &(FBOs[0]));
glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);
glGenTextures(2, &(textures[0]));
for (int i = 0; i < 2; i++)
{
glBindTexture(GL_TEXTURE_2D, textures[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, geometry().width(), geometry().height(), 0, GL_RGB, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i], 0);
}
GLuint rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, geometry().width(), geometry().height());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, attachments);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
qDebug() << "framebuffer NOT complete";
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
paintGL 方法:
void paintGL()
{
view.setToIdentity();
view.lookAt(camera.eye, camera.center, camera.up);
glClearColor(background.redF(), background.greenF(), background.blueF(), background.alphaF());
glEnable(GL_DEPTH_TEST);
// draw scene
glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for (auto position : positions)
{
drawCube(position);
}
for (auto light : lights)
{
drawLightMarker(light);
}
// draw frame
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawQuad();
// draw next frame
update();
}
drawQuad 方法:
void drawQuad()
{
GLuint* vao = &VAOs[BLOOM];
if (*vao == 0)
{
glGenVertexArrays(1, vao);
float l = 1.0f;
QVector2D LD(-l, -l); // left-down
QVector2D LU(-l, +l); // left-up
QVector2D RD(+l, -l); // right-down
QVector2D RU(+l, +l); // right-up
QVector<QVector2D> vertices = { LD, RD, LU, LU, RD, RU };
QVector<QVector2D> texcoords;
for (auto v : vertices)
{
texcoords += (v + QVector2D(l, l)) / (2.0f * l);
}
// bind vao
glBindVertexArray(*vao);
// vertices
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(QVector2D), &(vertices[0]), GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(QVector2D), static_cast<void*>(nullptr));
glEnableVertexAttribArray(0);
// texcoords
GLuint tbo;
glGenBuffers(1, &tbo);
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glBufferData(GL_ARRAY_BUFFER, texcoords.size()*sizeof(QVector2D), &(texcoords[0]), GL_STATIC_DRAW);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(QVector2D), static_cast<void*>(nullptr));
glEnableVertexAttribArray(1);
// unbind buffer object
glBindBuffer(GL_ARRAY_BUFFER, 0);
// unbind vao
glBindVertexArray(0);
}
GLuint program = programs[BLOOM];
glUseProgram(program);
glUniform1i(glGetUniformLocation(program, "scene"), 0);
glUniform1i(glGetUniformLocation(program, "bloom"), 1);
glUniform1i(glGetUniformLocation(program, "effect"), true);
glBindVertexArray(*vao);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}
立方体片段着色器:
#version 450 core
layout (location = 0) out vec4 pixel;
layout (location = 1) out vec4 bloom;
struct Material
{
// material properties
};
uniform Material material;
struct Light
{
// light properties
};
uniform Light[5] lights;
uniform vec3 eye;
in FragData
{
vec3 position;
vec3 normal;
} data;
vec3 point(Light light, vec3 position, vec3 normal, vec3 eye)
{
// lighting computation
}
void main()
{
vec3 color = vec3(0.0f);
for (int i = 0; i < 5; i++)
{
color += point(lights[i], data.position, data.normal, eye);
}
pixel = vec4(color, 1.0f);
vec3 weights = vec3(0.2126f, 0.7152f, 0.0722f);
float brightness = dot(pixel.rgb, weights);
if (brightness > 1.0f)
{
bloom = vec4(pixel.rgb, 1.0f);
}
else
{
bloom = vec4(vec3(0.0f), 1.0f);
}
}
光标记片段着色器:
#version 450 core
layout (location = 0) out vec4 pixel;
layout (location = 1) out vec4 bloom;
struct Light
{
// light properties
};
uniform Light light;
void main()
{
pixel = vec4(light.diffuse, 1.0f);
vec3 weights = vec3(0.2126f, 0.7152f, 0.0722f);
float brightness = dot(pixel.rgb, weights);
if (brightness > 1.0f)
{
bloom = vec4(light.diffuse, 1.0f);
}
else
{
bloom = vec4(vec3(0.0f), 1.0f);
}
}
最终顶点着色器:
#version 450 core
layout (location = 0) in vec2 position;
layout (location = 1) in vec2 texcoord;
out FragData
{
vec2 texcoord;
} data;
void main()
{
data.texcoord = texcoord;
gl_Position = vec4(position, 0.0f, 1.0f);
}
最终片段着色器:
#version 450 core
in FragData
{
vec2 texcoord;
} data;
out vec4 pixel;
uniform sampler2D scene;
uniform sampler2D bloom;
uniform bool effect;
void main()
{
vec3 hdr = texture(scene, data.texcoord).rgb;
if (effect)
{
hdr += texture(bloom, data.texcoord).rgb;
}
// tone mapping
float exposure = 1.0f;
pixel = vec4(vec3(1.0f) - exp(-hdr * exposure), 1.0f);
// gamma correction
float gamma = 2.2f;
pixel = vec4(pow(pixel.rgb, vec3(1.0 / gamma)), 1.0f);
}
目前,我还没有实现模糊来获得光晕效果,但我只是从渲染场景中提取了两张图像并将它们相加。
我哪里做错了?非常感谢您的帮助!
最佳答案
你不应该使用
glBindFramebuffer(GL_FRAMEBUFFER, 0);
因为 Qt 可能在您背后使用 FBO 而不是 GL 的默认帧缓冲区。您可以使用 QOpenGLContext::defaultFramebufferObject
查询 Qt 用作默认帧缓冲区的 FBO 名称,它可能是也可能不是 0
。
关于c++ - OpenGL Qt : problem using framebuffers for bloom effect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693579/
一. 简介 1.什么是bloom filter? Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是
如果我实现了只使用一种散列算法的布隆过滤器(例如 murmur),这是否仍被视为布隆过滤器? 例如,如果 a散列到 5 ,然后将设置过滤器的第 5 位。如 b散列到 1 ,然后将设置过滤器的第 1 位
上下文:我正在阅读有关 RocksDB 和 LSM 树的信息,根据我的理解,Bloom 过滤器用于避免所有存储级别中的项目检索的多个 I/O。我对此没有意见。 显然,挑战之一是布隆过滤器不能用于范围查
您好,在我的系统中将有一个主节点和 n 个从节点,其中主节点会将传入请求分发到其从节点之一。为了利用缓存内存内容,我想跟踪从属节点已经服务的最后 50 个请求(传入请求的哈希值)(假设最后 50 个请
我在 Guava v.11.0.1 中使用了 BloomFilter,当我的插入很大时,我似乎遇到了异常。我用 0.001 fpp 尝试了 1000 万,但失败了。 java.lang.Illegal
我一直在尝试实现我自己的(简单的)Bloom Filter,但一直坚持哈希,我理解多次对项目进行哈希并用索引填充位数组的概念。 但是,我在我的散列中看到了大量的冲突,我正在使用一种散列算法(我已经尝试
引言 在介绍布隆过滤器之前我们首先引入几个场景。 场景一 在一个高并发的计数系统中,如果一个key没有计数,此时我们应该返回0,但是访问的key不存在,相当于每次访问缓存都不起作用了。那么如何
布隆过滤器原理很简单:就是把一个字符串哈希成一个整数key,然后选取一个很长的比特序列,开始都是0,在key把此位置的0变为1;下次进来一个字符串,哈希之后的值key,如果在此比特位上的值也是1,那
使用 Guava 库创建布隆过滤器时,您需要提供一个漏斗和预期的插入次数(以及可选的所需误报率)。有没有办法设置布隆过滤器应该使用哪些哈希函数?如果无法设置哈希函数,默认使用什么? 布隆过滤器是 co
18.0 中的 Guava 布隆过滤器线程安全吗?换句话说,我可以让多个线程共享一个 Bloom Filter 实例并同时使用 myBloomInstance.mightContain 和 myBlo
我有一个使用 Reach 图形设置在 C# XNA 4.0 中编码的 Windows 平台游戏。我的项目基于 GameStateManagement 示例,但后来我向其中添加了 Bloom 和 spr
如何在iOS平台的应用中安装其他应用? 例如,在“Bloom”应用中,拉至底部,点击“PEAK”,会出现“Peek”店铺详情 View ,您可以在该 View 中下载“PEAK”应用。无需打开应用商店
我需要在 C# 中存储 4000 个固定大小(8 个字符)的字符串,但我不知道关于添加和检索项目的空间和时间最好使用什么:布隆过滤器、哈希表或字典?如果有人可以帮助我,请帮助我 最佳答案 在这个问题中
这个问题以前有人问过,但当时没有答案,所以我决定再问一次。 我需要用 C(不是 C++)高效地实现布隆过滤器。如果没有这样的东西可用,我不介意实现一个,如果提供一些很好的引用,这样它就不会占用我太多时
最近几天我阅读了很多关于使用 bloom 等进行后处理的文章,并且我能够通过一个单独的着色器运行这个纹理来实现渲染到纹理的功能。现在我对整个事情有一些疑问。 我必须同时渲染两者吗?场景和纹理放在全屏四
我又遇到了一个我自己似乎无法解决的僵局。我真的希望有人能帮助我。 我一直在尝试使用 GLSL 创建一个漂亮的小光晕效果,效果非常好。当我尝试在我的场景中加入一些移动的东西时,我注意到我忘记在渲染到它们
我有一个 Spark 作业,其最终输出是一个 Algebird 布隆过滤器,我需要在另一个 Spark 作业中重用这个布隆过滤器。有没有办法使用 Twitter Storehaus 将此布隆过滤器存储
我已经使用 OpenGL 和 GLSL 集成了bloom HDR 渲染......至少我认为!我不太确定结果。 我遵循了英特尔网站上的教程: https://software.intel.com/en
我正在关注这个 tutorial用于绽放效果。 我正在使用 Qt,我尝试渲染的场景由五个立方体和五个随机放置的灯组成,类似于这样。 不幸的是,当我尝试使用帧缓冲区时,渲染的场景完全是空的(只有背景颜色
Hadoop 新手...我有一系列 HDFS 目录,命名约定为 filename.seq。每个目录包含一个索引、数据和 bloom 文件。这些具有二进制内容并且似乎是 SequenceFiles(SE
我是一名优秀的程序员,十分优秀!