- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的场景,它渲染了一个网格、一个平面和一个立方体。我也有两个不同的着色器。一个是平面着色器,它以随机颜色渲染对象,另一个是噪声着色器,它渲染具有噪声效果的对象。我希望能够:
glReadPixels
获取的单击颜色. void Draw(const bool offscreen = false)
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::mat4 projection = glm::perspective(glm::radians(camera.zoom), (float)viewport_width / (float)viewport_height, 0.1f, 100.0f);
glm::mat4 view = camera.get_view_matrix();
if (offscreen)
{
flat_shader.use();
flat_shader.set_mat4("projection", projection);
flat_shader.set_mat4("view", view);
grid.Draw(&flat_shader);
box.Draw_offscreen(&flat_shader);
plane.Draw_offscreen(&flat_shader);
}
else
{
noise_shader.use();
noise_shader.set_mat4("projection", projection);
noise_shader.set_mat4("view", view);
noise_shader.set_float("iTime", delta_time);
plane.Draw(&noise_shader);
box.Draw(&noise_shader);
flat_shader.use();
flat_shader.set_mat4("projection", projection);
flat_shader.set_mat4("view", view);
grid.Draw(&flat_shader);
}
glfwSwapBuffers(window);
}
false
场景看起来像这样(正常渲染):
offscreen
时的场景。是
true
:
void init_offscreen_buffer()
{
glGenFramebuffers(1, &fbo_off);
glGenRenderbuffers(1, &render_buf);
glBindRenderbuffer(GL_RENDERBUFFER, render_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, viewport_width, viewport_height);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_off);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
// I also checked for FRAMEBUFFER_COMPLETE
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
pick_color_id
在点击的像素上打印颜色。
void pick_color_id(double x, double y)
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_off);
Draw(true);
GLubyte pixel_color[4];
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, 800 - y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_color);
cout << "---------------------------------------------------------" << endl;
cout << "Mouse click position: " << x << "; " << y << endl;
cout << "Target pixel color: " << (unsigned int)pixel_color[0] << ";" << (unsigned int)pixel_color[1] << ";" << (unsigned int)pixel_color[2] << endl;
cout << "---------------------------------------------------------" << endl;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
最佳答案
glReadPixels
从帧缓冲区读取日期,因此帧缓冲区绑定(bind)的目标必须是 GL_READ_FRAMEBUFFER
不是 GL_DRAW_FRAMEBUFFER
:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_off);
Draw(true);
GLubyte pixel_color[4];
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_off);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, 800 - y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_color);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_off);
Draw(true);
GLubyte pixel_color[4];
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, 800 - y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_color);
#include <iostream>
void GLAPIENTRY DebugCallback(
unsigned int source,
unsigned int type,
unsigned int id,
unsigned int severity,
int length,
const char *message,
const void *userParam )
{
std::cout << message << std::endl;
}
void init_opengl_debug() {
glDebugMessageCallback(&DebugCallback, nullptr );
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
}
关于c++ - 离屏渲染到帧缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61046598/
如何从 Android-Native-Screen 打开 flutter 屏幕? 我开了一个 Android-Native-Screen 从现有我们 flutter 项目 . 所以,在 Android
有人知道如何使用 java 和 google chrome 最大化 selenium webdriver 窗口吗? 我已经尝试过一些命令,例如maximize () window (),但没有成功。
Redmi A65 智能电视今天正式开卖,4K 超高清大屏 + 立体声扬声器,到手价 2599 元。 IT之家了解到,Redmi A65 智能电视搭载了一块 65 英寸 4K 屏,支持 HDR
9 月 26 日消息小米电视大师「至尊纪念版」将在 9 月 29 日发布,根据今天小米集团大家电部总经理李肖爽放出的海报显示,小米电视大师至尊版有两款。 小米电视大师「至尊纪念版」是小米首款
华为手环 6 今日在海外正式发布,英文名 Band 6。这款产品是华为手环 4 的升级版,屏幕尺寸由 0.96 英寸升级为 1.47 英寸 AMOLED 屏,分辨率 194 x 368。该手环外形类
我是一名优秀的程序员,十分优秀!