Я некоторое время пытался реализовать кадр -буфер в OpenGL, чтобы я мог представить всю сцену в квадроцикл, и я могу нанести фильтр HDR на шейдере, но когда я связываю этот фреймбафтер перед рендерингом, весь экран становится черным. Я не знаю, что еще я могу сделать после стольких попыток и переписываний, поэтому заранее спасибо < /p>
Я пытался следовать этому примеру из супербибля Opengl, поэтому из этого берется много кода. #version 450 core
layout (location=0) in vec3 vertex;
layout (location=1) in vec3 color;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;
void main(void)
{
color_out=color;
gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
red.frag
#version 450 core
in vec3 color_out ;
out vec4 frag_color ;
void main(void)
{
frag_color=vec4(1,0,0 , 1) ;
}
< /code>
hdr.vert
#version 450 core
layout (location=0) in vec3 vertex;
layout (location=4) in vec2 texture_coordinates;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;
out vec2 texture_coordinates_out;
void main(void)
{
texture_coordinates_out=texture_coordinates;
color_out=vec3(texture_coordinates,0);
gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
initialize_object on gl_widget class < /h2>
Загрузка шейдера < /p>
Position=_vertex3f(0,0,4);
_shaders Shader ;
Program1=Shader.load_shaders("./shaders/Red.vert","./shaders/Red.frag");
if ( Program1==0) {
exit( -1) ;
}
Program_HDR=Shader.load_shaders("./shaders/HDR.vert","./shaders/HDRSquare.frag");
if ( Program_HDR==0) {
exit( -1) ;
}
ushort vertex_indices[] =
{
//index data omitted
};
static const GLfloat vertex_data[] =
{
// Position Tex Coord
//Cube vertex and tex coords omitted
};
glGenBuffers(1, &position_buffer);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_data),
vertex_data,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid *)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(vertex_indices),
vertex_indices,
GL_STATIC_DRAW);
< /code>
инициализация кадриста < /p>
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenTextures(1, &color_texture);
glBindTexture(GL_TEXTURE_2D, color_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_RGBA8, 512, 512);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_DEPTH_COMPONENT32F, 512, 512);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_texture, 0);
static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, draw_buffers);
< /code>
drail_object on gl_widgetclass < /h2>
QMatrix4x4 Modelview;
QMatrix4x4 Projection;
Camera.setToIdentity();
float Aspect =(float)(size().width())/(float)(size().height()); ;
Projection.frustum(-.1 , .1 , -.1*Aspect , .1*Aspect , (.1-(-.1))/2,1000) ;
Modelview.translate(-Position.x, -Position.y, -Position.z) ;
< /code>
рендеринг первого куба. Эта строка ниже заставляет все стать черным < /p>
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
static const GLfloat blue[] = { 0.0f, 0.0f, 0.3f, 1.0f };
static const GLfloat green[] = { 0.0f, 0.3f, 0.0f, 1.0f };
static const GLfloat one = 1.0f;
glViewport(0, 0, 512, 512);
glClearBufferfv(GL_COLOR, 0, green);
glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);
glBindVertexArray(VAO1) ;
glUseProgram(Program1);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;
glDrawArrays(GL_TRIANGLES, 0, 36);
< /code>
рендеринг второй куб с первым внутри. Мы переключаемся на рамку по умолчанию < /p>
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, size().width(), size().height());
glClearBufferfv(GL_COLOR, 0, blue);
glClearBufferfv(GL_DEPTH, 0, &one);
< /code>
Текстура, которая должна нарисовать предыдущую сцену < /p>
glBindTexture(GL_TEXTURE_2D, color_texture);
glUseProgram(Program_HDR);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;
glDrawArrays(GL_TRIANGLES, 0, 36);
glUseProgram(0 ) ;
glBindVertexArray(0 ) ;
< /code>
Желаемые результаты и снимки экрана < /h2>
Это скриншот basicfbo < /strong> программа, которую я использую в качестве базового
Подробнее здесь: https://stackoverflow.com/questions/795 ... n-go-black
Почему привязывание моего кадриста заставляет экран черным? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1744389488
Anonymous
Я некоторое время пытался реализовать кадр -буфер в OpenGL, чтобы я мог представить всю сцену в квадроцикл, и я могу нанести фильтр HDR на шейдере, но когда я связываю этот фреймбафтер перед рендерингом, весь экран становится черным. Я не знаю, что еще я могу сделать после стольких попыток и переписываний, поэтому заранее спасибо < /p>
Я пытался следовать этому примеру из супербибля Opengl, поэтому из этого берется много кода. #version 450 core
layout (location=0) in vec3 vertex;
layout (location=1) in vec3 color;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;
void main(void)
{
color_out=color;
gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
red.frag
#version 450 core
in vec3 color_out ;
out vec4 frag_color ;
void main(void)
{
frag_color=vec4(1,0,0 , 1) ;
}
< /code>
hdr.vert
#version 450 core
layout (location=0) in vec3 vertex;
layout (location=4) in vec2 texture_coordinates;
layout (location=10) uniform mat4 modelview;
layout (location=11) uniform mat4 projection;
out vec3 color_out;
out vec2 texture_coordinates_out;
void main(void)
{
texture_coordinates_out=texture_coordinates;
color_out=vec3(texture_coordinates,0);
gl_Position=projection*modelview*vec4(vertex,1);
}
< /code>
initialize_object on gl_widget class < /h2>
Загрузка шейдера < /p>
Position=_vertex3f(0,0,4);
_shaders Shader ;
Program1=Shader.load_shaders("./shaders/Red.vert","./shaders/Red.frag");
if ( Program1==0) {
exit( -1) ;
}
Program_HDR=Shader.load_shaders("./shaders/HDR.vert","./shaders/HDRSquare.frag");
if ( Program_HDR==0) {
exit( -1) ;
}
ushort vertex_indices[] =
{
//index data omitted
};
static const GLfloat vertex_data[] =
{
// Position Tex Coord
//Cube vertex and tex coords omitted
};
glGenBuffers(1, &position_buffer);
glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_data),
vertex_data,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid *)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(vertex_indices),
vertex_indices,
GL_STATIC_DRAW);
< /code>
инициализация кадриста < /p>
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenTextures(1, &color_texture);
glBindTexture(GL_TEXTURE_2D, color_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_RGBA8, 512, 512);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glTexStorage2D(GL_TEXTURE_2D, 9, GL_DEPTH_COMPONENT32F, 512, 512);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_texture, 0);
static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, draw_buffers);
< /code>
drail_object on gl_widgetclass < /h2>
QMatrix4x4 Modelview;
QMatrix4x4 Projection;
Camera.setToIdentity();
float Aspect =(float)(size().width())/(float)(size().height()); ;
Projection.frustum(-.1 , .1 , -.1*Aspect , .1*Aspect , (.1-(-.1))/2,1000) ;
Modelview.translate(-Position.x, -Position.y, -Position.z) ;
< /code>
рендеринг первого куба. Эта строка ниже заставляет все стать черным < /p>
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
static const GLfloat blue[] = { 0.0f, 0.0f, 0.3f, 1.0f };
static const GLfloat green[] = { 0.0f, 0.3f, 0.0f, 1.0f };
static const GLfloat one = 1.0f;
glViewport(0, 0, 512, 512);
glClearBufferfv(GL_COLOR, 0, green);
glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);
glBindVertexArray(VAO1) ;
glUseProgram(Program1);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;
glDrawArrays(GL_TRIANGLES, 0, 36);
< /code>
рендеринг второй куб с первым внутри. Мы переключаемся на рамку по умолчанию < /p>
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, size().width(), size().height());
glClearBufferfv(GL_COLOR, 0, blue);
glClearBufferfv(GL_DEPTH, 0, &one);
< /code>
Текстура, которая должна нарисовать предыдущую сцену < /p>
glBindTexture(GL_TEXTURE_2D, color_texture);
glUseProgram(Program_HDR);
glUniformMatrix4fv(10 ,1,GL_FALSE , Modelview.data() ) ;
glUniformMatrix4fv(11 ,1,GL_FALSE , Projection.data() ) ;
glDrawArrays(GL_TRIANGLES, 0, 36);
glUseProgram(0 ) ;
glBindVertexArray(0 ) ;
< /code>
Желаемые результаты и снимки экрана < /h2>
Это скриншот basicfbo < /strong> программа, которую я использую в качестве базового
Подробнее здесь: [url]https://stackoverflow.com/questions/79569332/why-binding-my-framebuffer-makes-the-screen-go-black[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия